source: soft/giet_vm/applications/rosenfeld/scripts/create_simul_dirs.py @ 827

Last change on this file since 827 was 827, checked in by meunier, 7 years ago
  • Ajout de scripts pour rosenfeld
  • Property svn:executable set to *
File size: 8.7 KB
Line 
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3
4import shutil
5from common import *
6
7
8granularities = [16]
9threads = [16, 64]
10use_rand_images = True
11img_size = 2048
12use_dsk = True
13use_rand_img = True
14nb_simus_wrt_density = 2 # e.g. if 2, each simus processes 50 or 51 images
15
16rand_seed = 7
17
18configs = [
19        {'SLOW':'0', 'FAST':'1', 'FEATURES':'0', 'PARMERGE':'1', 'ARSP':'1'},
20        #{'SLOW':'0', 'FAST':'1', 'FEATURES':'1', 'PARMERGE':'1', 'ARSP':'1'},
21]
22
23
24mode = 'simu'
25
26if mode == 'test':
27    data_dir = 'data_test'
28else:
29    data_dir = 'data'
30
31
32
33# Directories definitions
34scripts_dir = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
35giet_dir    = os.path.abspath(os.path.join(scripts_dir, "..", "..", ".."))
36pyconf_file = os.path.join(scripts_dir, "config.py")
37# Contains run_simus_soclib.py,
38template_scripts_dir = os.path.join(scripts_dir, "template_scripts")
39
40
41check_pyconf_file(pyconf_file)
42
43exec(file(pyconf_file))
44
45try:
46    dsk_dir
47    if not os.path.exists(dsk_dir):
48        print("mkdir %s", dsk_dir)
49        os.mkdir(dsk_dir)
50except NameError:
51    print("*** Error: variable dsk_dir is not defined in %s file" % (short_path(pyconf_file)))
52    sys.exit(1)
53except OSError:
54    print("*** Error: Impossible to create directory %s" % (dsk_dir))
55    sys.exit(1)
56
57try:
58    tsar_dir
59    tsar_iob_dir = os.path.join(tsar_dir, "platforms", "tsar_generic_iob")
60except NameError:
61    print("*** Error: variable tsar_dir is not defined in %s file" % (short_path(pyconf_file)))
62    sys.exit(1)
63
64try:
65    rand_img_dir
66    if not os.path.exists(rand_img_dir):
67        print("mkdir %s", rand_img_dir)
68        os.mkdir(rand_img_dir)
69except NameError:
70    print("*** Error: variable rand_img_dir, containing the path the random images (either pre-existing or to be generated), is not defined in %s file" % (short_path(pyconf_file)))
71    sys.exit(1)
72except OSError:
73    print("*** Error: Impossible to create directory %s" % (rand_img_dir))
74    sys.exit(1)
75
76try:
77    preloader_dir
78except NameError:
79    print("*** Error: variable preloader_dir is not defined in %s file" % (short_path(pyconf_file)))
80    sys.exit(1)
81
82
83# Topcell files
84top_file  = os.path.join(tsar_iob_dir, "top.cpp")
85desc_file = os.path.join(tsar_iob_dir, "top.desc")
86make_file = os.path.join(tsar_iob_dir, "Makefile")
87arch_file = os.path.join(tsar_iob_dir, "arch.py")
88
89
90
91def create_config_file(filename, granularities, threads, start_density, end_density, config):
92    print "# Creating file %s" % (filename)
93    f = open(filename, "w")
94    f.write("use_rand_img = %s\n" % str(use_rand_img))
95    f.write("granularities = [%s]\n" % str(granularities))
96    f.write("threads = [%s]\n" % str(threads))
97    f.write("start_density = %s\n" % str(start_density))
98    f.write("end_density = %s\n" % str(end_density))
99    f.write("img_size = %s\n" % str(img_size))
100    f.write("configs = [\n")
101    f.write("    {")
102    config_keys = list(config.keys()) # duplicates list
103    config_keys = sorted(config_keys)
104    first = True
105    for key in config_keys:
106        if not first:
107            f.write(", ")
108        f.write("'%s':'%s'" % (key, config[key]))
109        first = False
110    f.write("},\n")
111    f.write("]\n")
112    f.write('tsar_dir = "%s"\n' % tsar_dir)
113    f.write('preloader_dir = "%s"\n' % preloader_dir)
114    f.close()
115   
116
117def giet_ignore_list(dir, files):
118    ignore_list = []
119    if dir == giet_dir:
120        ok_list = ["applications", "create_dmg", "hdd", "giet_boot", "giet_common", "giet_config.h", "giet_drivers", "giet_fat32", "giet_kernel", "giet_libs", "giet_python", "giet_xml", "images", "Makefile"]
121        for file in files:
122            if not file in ok_list:
123                ignore_list.append(file)
124    elif dir == os.path.join(giet_dir, "applications"):
125        ok_list = ["rosenfeld"]
126        for file in files:
127            if not file in ok_list:
128                ignore_list.append(file)
129    elif dir == os.path.join(giet_dir, "applications", "rosenfeld"):
130        ok_list = ["include", "Makefile", "nrc2", "rosenfeld.ld", "rosenfeld.py", "src", "src-par"]
131        for file in files:
132            if not file in ok_list:
133                ignore_list.append(file)
134    elif dir == os.path.join(giet_dir, "hdd"):
135        for file in files:
136            ignore_list.append(file)
137    else:
138        pass
139    return ignore_list
140
141
142
143def get_x_y_p(nb_procs):
144    if nb_procs < 4:
145        return 1, 1, nb_procs
146    cpu_per_cluster = 4
147    x = 1
148    y = 1
149    to_x = True
150    while (x * y * cpu_per_cluster < nb_procs):
151        if to_x:
152            x = x * 2
153        else:
154            y = y * 2
155        to_x = not to_x
156    return x, y, cpu_per_cluster
157
158
159
160def gen_params_mk(copied_giet_dir, simul_dir, nthreads):
161    x_size, y_size, cpu_per_cluster = get_x_y_p(nthreads)
162    tmpl = '''
163ARCH      ?= %(arch_dir)s
164X_SIZE    ?= %(x_size)d
165Y_SIZE    ?= %(y_size)d
166NB_PROCS  ?= %(nb_procs)d
167NB_TTYS   ?= 3
168FBF_WIDTH ?= 256
169IOC_TYPE  ?= BDV
170MWR_TYPE  ?= CPY
171APPLIS    ?= rosenfeld
172''' % dict(arch_dir = simul_dir,
173           x_size = x_size,
174           y_size = y_size,
175           nb_procs = cpu_per_cluster)
176    params_mk_file = os.path.join(copied_giet_dir, "params.mk")
177    f = open(params_mk_file, 'w')
178    f.write(tmpl)
179    f.close()
180 
181# Computing start_density and end_density
182nb_density_base_per_simu = 101 / nb_simus_wrt_density
183nb_simus_left = 101 - nb_density_base_per_simu * nb_simus_wrt_density
184curr_density = 0
185start_densities = {}
186end_densities = {}
187for simu_wrt_density in range(0, nb_simus_wrt_density):
188    start_densities[simu_wrt_density] = curr_density
189    if nb_simus_left > 0:
190        curr_nb_simus = nb_density_base_per_simu + 1
191        nb_simus_left -= 1
192    else:
193        curr_nb_simus = nb_density_base_per_simu
194    end_densities[simu_wrt_density] = curr_density + curr_nb_simus - 1
195    curr_density += curr_nb_simus
196
197
198
199for gran in granularities:
200    for th in threads:
201        for config in configs:
202            for simu_wrt_density in range(0, nb_simus_wrt_density):
203                start_density = start_densities[simu_wrt_density]
204                end_density = end_densities[simu_wrt_density]
205
206                features = config['FEATURES'] == '1'
207                simul_dir = get_dirname(dsk_dir, th, config, features, gran, start_density, end_density, "rosen")
208                if not os.path.exists(simul_dir):
209                    my_mkdir(simul_dir)
210                my_cp(top_file, simul_dir)
211                my_cp(desc_file, simul_dir)
212                my_cp(make_file, simul_dir)
213                my_cp(arch_file, simul_dir)
214
215                create_config_file(os.path.join(simul_dir, "config.py"), gran, th, start_density, end_density, config)
216
217
218                tmpl_script_files = [f for f in os.listdir(template_scripts_dir) if os.path.isfile(os.path.join(template_scripts_dir, f))]
219                for tmpl_script_file in tmpl_script_files:
220                    my_cp(os.path.join(template_scripts_dir, tmpl_script_file), simul_dir)
221
222                # Copy and compile the giet
223                copied_giet_dir = os.path.join(simul_dir, "giet_vm")
224                if not os.path.exists(copied_giet_dir):
225                    shutil.copytree(giet_dir, copied_giet_dir, symlinks = False, ignore = giet_ignore_list)
226                my_chdir(copied_giet_dir)
227                # Copy the correct image files
228                if use_rand_img:
229                    for density in range(start_density, end_density + 1):
230                        img_filename = os.path.join(rand_img_dir, get_random_img_file(density, img_size, img_size, gran, rand_seed))
231                        if not os.path.isfile(img_filename):
232                            print("# Generating random image %s with granularity = %d and density = %d" % (img_filename, gran, density))
233                            gen_random_image(img_filename, img_size, img_size, gran, float(density) / 100, rand_seed)
234                        # We are forced to use a short image name for the giet because the hdd truncates after 8 characters, so all the
235                        # distinctive informations should be contained in 8 chars.
236                        target_img_filename = get_short_random_img_file(density, gran)
237                        my_cp(img_filename, os.path.join(copied_giet_dir, "images", target_img_filename))
238                else:
239                    print("*** Error: Only random images are currently supported\n");
240                    sys.exit(1)
241             
242                # Generate the file params.mk
243                gen_params_mk(copied_giet_dir, simul_dir, th)
244
245                #cmd = ['make', 'clean-disk']
246                #print_and_call(cmd)
247
248                #cmd = ['make']
249                #print_and_call(cmd)
250
251                my_chdir(scripts_dir)
252            # end density range
253        # end config
254    # end threads
255# end granularity
256           
257print("# End of %s" % __file__)
258
259
260
261
262
263           
264
265
Note: See TracBrowser for help on using the repository browser.