Ignore:
Timestamp:
Oct 1, 2015, 4:20:46 PM (9 years ago)
Author:
alain
Message:

Major release: Change the task model to implement the POSIX threads API.

  • The shell "exec" and "kill" commands can be used to activate/de-activate the applications.
  • The "pause", "resume", and "context" commands can be used to stop, restart, a single thtead or to display the thread context.

This version has been tested on the following multi-threaded applications,
that have been modified to use the POSIX threads:

  • classif
  • convol
  • transpose
  • gameoflife
  • raycast
File:
1 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/giet_python/mapping.py

    r642 r709  
    1010#  This file contains the classes required to define a mapping for the GIET_VM.
    1111# - A 'Mapping' contains a set of 'Cluster'   (hardware architecture)
    12 #                        a set of 'Vseg'      (kernel glogals virtual segments)
     12#                        a set of 'Vseg'      (kernel global virtual segments)
    1313#                        a set of 'Vspace'    (one or several user applications)
    1414# - A 'Cluster' contains a set of 'Pseg'      (physical segments in cluster)
     
    1616#                        a set of 'Periph'    (peripherals in cluster)
    1717# - A 'Vspace' contains  a set of 'Vseg'      (user virtual segments)
    18 #                        a set of 'Task'      (user parallel tasks)
     18#                        a set of 'Thread'    (POSIX thread)
    1919# - A 'Periph' contains  a set of 'Irq'       (only for XCU and PIC types )
    2020###################################################################################
     
    2222# The objects used to describe a mapping are distributed in the PYTHON structure:
    2323# For example the psegs set is split in several subsets (one subset per cluster),
    24 # or the tasks set is split in several subsets (one subset per vspace), etc...
     24# or the threads set is split in several subsets (one subset per vspace), etc...
    2525# In the C binary data structure used by the giet_vm, all objects of same type
    2626# are stored in a linear array (one single array for all psegs for example).
     
    192192        self.total_psegs    = 0
    193193        self.total_vsegs    = 0
    194         self.total_tasks    = 0
     194        self.total_threads  = 0
    195195        self.total_procs    = 0
    196196        self.total_irqs     = 0
     
    406406        return vseg
    407407
    408     ################################    add a task in a vspace
    409     def addTask( self,
    410                  vspace,                # vspace containing task
    411                  name,                  # task name
    412                  trdid,                 # task index in vspace
    413                  x,                     # destination x coordinate
    414                  y,                     # destination y coordinate
    415                  lpid,                  # destination processor local index
    416                  stackname,             # name of vseg containing stack
    417                  heapname,              # name of vseg containing heap
    418                  startid ):             # index in start_vector
    419 
    420         assert (x < self.x_size) and (y < self.y_size)
    421         assert lpid < self.nprocs
    422 
    423         # add one task into mapping
    424         task = Task( name, trdid, x, y, lpid, stackname, heapname, startid )
    425         vspace.tasks.append( task )
    426         task.index = self.total_tasks
    427         self.total_tasks += 1
    428 
    429         return task
     408    ################################    add a thread in a vspace
     409    def addThread( self,
     410                   vspace,                # vspace containing thread
     411                   name,                  # thread name
     412                   is_main,               # Boolean (one thread per vspace)
     413                   x,                     # destination x coordinate
     414                   y,                     # destination y coordinate
     415                   p,                     # destination processor local index
     416                   stackname,             # name of vseg containing stack
     417                   heapname,              # name of vseg containing heap
     418                   startid ):             # index in start_vector
     419
     420        assert x < self.x_size
     421        assert y < self.y_size
     422        assert p < self.nprocs
     423
     424        # add one thread into mapping
     425        thread = Thread( name, is_main, x, y, p, stackname, heapname, startid )
     426        vspace.threads.append( thread )
     427        thread.index = self.total_threads
     428        self.total_threads += 1
     429
     430        return thread
    430431
    431432    #################################
     
    497498
    498499        # header
    499         byte_stream += self.int2bytes(4,  self.signature)
    500         byte_stream += self.int2bytes(4,  self.x_size)
    501         byte_stream += self.int2bytes(4,  self.y_size)
    502         byte_stream += self.int2bytes(4,  self.x_width)
    503         byte_stream += self.int2bytes(4,  self.y_width)
    504         byte_stream += self.int2bytes(4,  self.x_io)
    505         byte_stream += self.int2bytes(4,  self.y_io)
    506         byte_stream += self.int2bytes(4,  self.irq_per_proc)
    507         byte_stream += self.int2bytes(4,  self.use_ramdisk)
    508         byte_stream += self.int2bytes(4,  self.total_globals)
    509         byte_stream += self.int2bytes(4,  self.total_vspaces)
    510         byte_stream += self.int2bytes(4,  self.total_psegs)
    511         byte_stream += self.int2bytes(4,  self.total_vsegs)
    512         byte_stream += self.int2bytes(4,  self.total_tasks)
    513         byte_stream += self.int2bytes(4,  self.total_procs)
    514         byte_stream += self.int2bytes(4,  self.total_irqs)
    515         byte_stream += self.int2bytes(4,  self.total_periphs)
    516         byte_stream += self.str2bytes(64, self.name)
     500        byte_stream += self.int2bytes(4,   self.signature)
     501        byte_stream += self.int2bytes(4,   self.x_size)
     502        byte_stream += self.int2bytes(4,   self.y_size)
     503        byte_stream += self.int2bytes(4,   self.x_width)
     504        byte_stream += self.int2bytes(4,   self.y_width)
     505        byte_stream += self.int2bytes(4,   self.x_io)
     506        byte_stream += self.int2bytes(4,   self.y_io)
     507        byte_stream += self.int2bytes(4,   self.irq_per_proc)
     508        byte_stream += self.int2bytes(4,   self.use_ramdisk)
     509        byte_stream += self.int2bytes(4,   self.total_globals)
     510        byte_stream += self.int2bytes(4,   self.total_vspaces)
     511        byte_stream += self.int2bytes(4,   self.total_psegs)
     512        byte_stream += self.int2bytes(4,   self.total_vsegs)
     513        byte_stream += self.int2bytes(4,   self.total_threads)
     514        byte_stream += self.int2bytes(4,   self.total_procs)
     515        byte_stream += self.int2bytes(4,   self.total_irqs)
     516        byte_stream += self.int2bytes(4,   self.total_periphs)
     517        byte_stream += self.str2bytes(256, self.name)
    517518
    518519        if ( verbose ):
     
    531532            print 'total_psegs   = %d' % self.total_psegs
    532533            print 'total_vsegs   = %d' % self.total_vsegs
    533             print 'total_tasks   = %d' % self.total_tasks
     534            print 'total_threads   = %d' % self.total_threads
    534535            print 'total_procs   = %d' % self.total_procs
    535536            print 'total_irqs    = %d' % self.total_irqs
     
    574575        if ( verbose ): print '\n'
    575576
    576         # tasks array
     577        # threads array
    577578        index = 0
    578579        for vspace in self.vspaces:
    579             for task in vspace.tasks:
    580                 byte_stream += task.cbin( self, verbose, index, vspace )
     580            for thread in vspace.threads:
     581                byte_stream += thread.cbin( self, verbose, index, vspace )
    581582                index += 1
    582583
     
    985986        if ( (boot_stack_found == False) or (boot_stack_identity == False) ):
    986987             print '[genmap error] in giet_vsegs()'
    987              print '    seg_boot_stask missing or not identity mapping'
     988             print '    seg_boot_stack missing or not identity mapping'
    988989             sys.exit()
    989990
     
    19261927        self.active    = active         # active at boot if true
    19271928        self.vsegs     = []
    1928         self.tasks     = []
     1929        self.threads   = []
    19291930
    19301931        return
     
    19361937                            %(self.name , self.startname , self.active)
    19371938        for vseg in self.vsegs: s += vseg.xml()
    1938         for task in self.tasks: s += task.xml()
     1939        for thread in self.threads: s += thread.xml()
    19391940        s += '        </vspace>\n'
    19401941
     
    19651966            sys.exit(1)
    19661967
    1967         # compute first vseg and first task global index
     1968        # compute first vseg and first thread global index
    19681969        first_vseg_id = self.vsegs[0].index
    1969         first_task_id = self.tasks[0].index
    1970 
    1971         # compute number of tasks and number of vsegs
     1970        first_thread_id = self.threads[0].index
     1971
     1972        # compute number of threads and number of vsegs
    19721973        nb_vsegs = len( self.vsegs )
    1973         nb_tasks = len( self.tasks )
     1974        nb_threads = len( self.threads )
    19741975
    19751976        byte_stream = bytearray()
     
    19771978        byte_stream += mapping.int2bytes(4, vseg_start_id)     # vseg start_vector
    19781979        byte_stream += mapping.int2bytes(4, nb_vsegs)          # number of vsegs
    1979         byte_stream += mapping.int2bytes(4, nb_tasks)          # number of tasks
     1980        byte_stream += mapping.int2bytes(4, nb_threads)        # number of threads
    19801981        byte_stream += mapping.int2bytes(4, first_vseg_id)     # global index
    1981         byte_stream += mapping.int2bytes(4, first_task_id)     # global index
     1982        byte_stream += mapping.int2bytes(4, first_thread_id)     # global index
    19821983        byte_stream += mapping.int2bytes(4, self.active)       # always active if non zero
    19831984
     
    19851986            print 'start_id   = %d' %  vseg_start_id
    19861987            print 'nb_vsegs   = %d' %  nb_vsegs
    1987             print 'nb_tasks   = %d' %  nb_tasks
     1988            print 'nb_threads = %d' %  nb_threads
    19881989            print 'vseg_id    = %d' %  first_vseg_id
    1989             print 'task_id    = %d' %  first_task_id
     1990            print 'thread_id  = %d' %  first_thread_id
    19901991            print 'active     = %d' %  self.active
    19911992
     
    19931994
    19941995##################################################################################
    1995 class Task( object ):
     1996class Thread( object ):
    19961997##################################################################################
    19971998    def __init__( self,
    19981999                  name,
    1999                   trdid,
     2000                  is_main,
    20002001                  x,
    20012002                  y,
     
    20052006                  startid ):
    20062007
    2007         self.index     = 0             # global index value set by addTask()
    2008         self.name      = name          # tsk name
    2009         self.trdid     = trdid         # task index (unique in vspace)
     2008        self.index     = 0             # global index value set by addThread()
     2009        self.name      = name          # thread name
     2010        self.is_main   = is_main       # Boolean (one main per vspace)
    20102011        self.x         = x             # cluster x coordinate
    20112012        self.y         = y             # cluster y coordinate
     
    20162017        return
    20172018
    2018     ######################################
    2019     def xml( self ):    # xml for one task
    2020 
    2021         s =  '            <task name="%s"' % self.name
    2022         s += ' trdid="%d"'                 % self.trdid
     2019    ########################################
     2020    def xml( self ):    # xml for one thread
     2021
     2022        s =  '            <thread name="%s"' % self.name
     2023        s += ' is_main="%d"'               % self.is_main
    20232024        s += ' x="%d"'                     % self.x
    20242025        s += ' y="%d"'                     % self.y
     
    20322033        return s
    20332034
    2034     ##########################################################################
    2035     def cbin( self, mapping, verbose, expected, vspace ):  # C binary for Task
     2035    ############################################################################
     2036    def cbin( self, mapping, verbose, expected, vspace ):  # C binary for Thread
    20362037
    20372038        if ( verbose ):
    2038             print '*** cbin for task %s in vspace %s' \
     2039            print '*** cbin for thread %s in vspace %s' \
    20392040                     % (self.name, vspace.name)
    20402041
    20412042        # check index
    20422043        if (self.index != expected):
    2043             print '[genmap error] in Task.cbin()'
    2044             print '    task global index = %d / expected = %d' \
     2044            print '[genmap error] in Thread.cbin()'
     2045            print '    thread global index = %d / expected = %d' \
    20452046                        %(self.index,expected)
    20462047            sys.exit(1)
     
    20552056
    20562057        if ( vseg_stack_id == 0xFFFFFFFF ):
    2057             print '[genmap error] in Task.cbin()'
    2058             print '    stackname %s not found for task %s in vspace %s' \
     2058            print '[genmap error] in Thread.cbin()'
     2059            print '    stackname %s not found for thread %s in vspace %s' \
    20592060                  % ( self.stackname, self.name, vspace.name )
    20602061            sys.exit(1)
     
    20692070
    20702071            if ( vseg_heap_id == 0xFFFFFFFF ):
    2071                 print '[genmap error] in Task.cbin()'
    2072                 print '    heapname %s not found for task %s in vspace %s' \
     2072                print '[genmap error] in Thread.cbin()'
     2073                print '    heapname %s not found for thread %s in vspace %s' \
    20732074                      % ( self.heapname, self.name, vspace.name )
    20742075                sys.exit(1)
    20752076
    20762077        byte_stream = bytearray()
    2077         byte_stream += mapping.str2bytes(32,self.name)     # task name in vspace
     2078        byte_stream += mapping.str2bytes(32,self.name)     # thread name in vspace
    20782079        byte_stream += mapping.int2bytes(4, cluster_id)    # cluster global index
    20792080        byte_stream += mapping.int2bytes(4, self.p)        # processor local index
    2080         byte_stream += mapping.int2bytes(4, self.trdid)    # thread index in vspace
     2081        byte_stream += mapping.int2bytes(4, self.is_main)  # main if non zero
    20812082        byte_stream += mapping.int2bytes(4, vseg_stack_id) # stack vseg local index
    20822083        byte_stream += mapping.int2bytes(4, vseg_heap_id)  # heap vseg local index
     
    20872088            print 'clusterid  = %d' %  cluster_id
    20882089            print 'lpid       = %d' %  self.p
    2089             print 'trdid      = %d' %  self.trdid
     2090            print 'is_main    = %d' %  self.is_main
    20902091            print 'stackid    = %d' %  vseg_stack_id
    20912092            print 'heapid     = %d' %  vseg_heap_id
Note: See TracChangeset for help on using the changeset viewer.