source: soft/giet_vm/applications/transpose/transpose.py @ 523

Last change on this file since 523 was 502, checked in by alain, 10 years ago

1) Introduce distributed barriers in the multi-threads applications
(classif) transpose, convol, sort, gameoflife)

2) Introducing support for architectures containing empty clusters
in the mapping of these multi-threaded applications.

3) Removing the "command line arguments" in the sort application
(replaced by the giet_procs_number() system call.

  • Property svn:executable set to *
File size: 5.2 KB
RevLine 
[317]1#!/usr/bin/env python
2
3from mapping import *
4
[502]5##################################################################################
[336]6#   file   : transpose.py  (for the transpose application)
[317]7#   date   : may 2014
8#   author : Alain Greiner
[502]9##################################################################################
[317]10#  This file describes the mapping of the multi-threaded "transpose"
11#  application on a multi-clusters, multi-processors architecture.
12#  This include both the mapping of virtual segments on the clusters,
13#  and the mapping of tasks on processors.
[502]14#  There is one task per processor.
15#  The mapping of virtual segments is the following:
16#    - There is one shared data vseg in cluster[0][0]
17#    - The code vsegs are replicated on all clusters containing processors.
18#    - There is one heap vseg per cluster containing processors.
19#    - The stacks vsegs are distibuted on all clusters containing processors.
[317]20#  This mapping uses 5 platform parameters, (obtained from the "mapping" argument)
[502]21#    - x_size    : number of clusters in a row
22#    - y_size    : number of clusters in a column
23#    - x_width   : number of bits coding x coordinate
24#    - y_width   : number of bits coding y coordinate
25#    - nprocs    : number of processors per cluster
26##################################################################################
[317]27
28#########################
29def transpose( mapping ):
30
31    x_size    = mapping.x_size
32    y_size    = mapping.y_size
[444]33    nprocs    = mapping.nprocs
[317]34    x_width   = mapping.x_width
35    y_width   = mapping.y_width
36
37    # define vsegs base & size
38    code_base  = 0x10000000
[383]39    code_size  = 0x00010000     # 64 Kbytes (replicated in each cluster)
[317]40   
41    data_base  = 0x20000000
[383]42    data_size  = 0x00010000     # 64 Kbytes (non replicated)
[317]43
44    stack_base = 0x40000000 
[414]45    stack_size = 0x00200000     # 2 Mbytes (per cluster)
[317]46
[414]47    heap_base  = 0x60000000 
48    heap_size  = 0x00200000     # 2 Mbytes (per cluster)
[317]49
[383]50    # create vspace
[317]51    vspace = mapping.addVspace( name = 'transpose', startname = 'trsp_data' )
52   
[383]53    # data vseg : shared (only in cluster[0,0])
54    mapping.addVseg( vspace, 'trsp_data', data_base , data_size, 
55                     'C_WU', vtype = 'ELF', x = 0, y = 0, pseg = 'RAM', 
56                     binpath = 'build/transpose/transpose.elf',
57                     local = False )
[317]58
[383]59    # code vsegs : local (one copy in each cluster)
60    for x in xrange (x_size):
61        for y in xrange (y_size):
[502]62            cluster_id = (x * y_size) + y
63            if ( mapping.clusters[cluster_id].procs ):
[317]64
[502]65                mapping.addVseg( vspace, 'trsp_code_%d_%d' %(x,y), 
66                                 code_base , code_size,
67                                 'CXWU', vtype = 'ELF', x = x, y = y, pseg = 'RAM', 
68                                 binpath = 'build/transpose/transpose.elf',
69                                 local = True )
70
71    # stacks vsegs: local (one stack per processor => nprocs stacks per cluster)
[383]72    for x in xrange (x_size):
73        for y in xrange (y_size):
[502]74            cluster_id = (x * y_size) + y
75            if ( mapping.clusters[cluster_id].procs ):
76                for p in xrange( nprocs ):
77                    proc_id = (((x * y_size) + y) * nprocs) + p
78                    size    = (stack_size / nprocs) & 0xFFFFF000
79                    base    = stack_base + (proc_id * size)
[383]80
[502]81                    mapping.addVseg( vspace, 'trsp_stack_%d_%d_%d' % (x,y,p), 
82                                     base, size, 'C_WU', vtype = 'BUFFER', 
83                                     x = x , y = y , pseg = 'RAM',
84                                     local = True, big = True )
85
86    # heap vsegs: distributed non local (all heap vsegs can be accessed by all tasks)
[383]87    for x in xrange (x_size):
88        for y in xrange (y_size):
89            cluster_id = (x * y_size) + y
[502]90            if ( mapping.clusters[cluster_id].procs ):
91                size  = heap_size
92                base  = heap_base + (cluster_id * size)
[383]93
[502]94                mapping.addVseg( vspace, 'trsp_heap_%d_%d' % (x,y), base, size, 
95                                 'C_WU', vtype = 'HEAP', x = x, y = y, pseg = 'RAM',
96                                 local = False, big = True )
97
[317]98    # distributed tasks / one task per processor
99    for x in xrange (x_size):
100        for y in xrange (y_size):
[502]101            cluster_id = (x * y_size) + y
102            if ( mapping.clusters[cluster_id].procs ):
103                for p in xrange( nprocs ):
104                    trdid = (((x * y_size) + y) * nprocs) + p
[317]105
[502]106                    mapping.addTask( vspace, 'trsp_%d_%d_%d' % (x,y,p),
107                                     trdid, x, y, p,
108                                     'trsp_stack_%d_%d_%d' % (x,y,p),
109                                     'trsp_heap_%d_%d' % (x,y), 0 )
110
[317]111    # extend mapping name
112    mapping.name += '_transpose'
113
114    return vspace  # useful for test
115           
[502]116################################ test ##################################################
[317]117
118if __name__ == '__main__':
119
120    vspace = transpose( Mapping( 'test', 2, 2, 4 ) )
121    print vspace.xml()
122
123
124# Local Variables:
125# tab-width: 4;
126# c-basic-offset: 4;
127# c-file-offsets:((innamespace . 0)(inline-open . 0));
128# indent-tabs-mode: nil;
129# End:
130#
131# vim: filetype=python:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
132
Note: See TracBrowser for help on using the repository browser.