8 from subprocess
import check_output
11 from pandas
import DataFrame, HDFStore
15 from carmaWrap.context
import context
as carmaWrap_context
16 from carmaWrap.timer
import timer
as carmaWrap_timer
17 from carmaWrap.timer
import threadSync
21 command =
"cat /proc/cpuinfo"
22 all_info = check_output(command, shell=
True).strip().decode(
"utf-8")
25 for line
in all_info.split(
"\n"):
26 if "model name" in line:
27 cpu.append(re.sub(
".*model name.*:",
"", line, 1))
32 def script4bench(param_file, centroider, controller, devices, fwrite=True):
36 param_file: (str) : parameters filename
38 centroider: (str) : centroider type
40 controller: (str) : controller type
43 c = carmaWrap_context(devices=np.array(devices, dtype=np.int32))
46 timer = carmaWrap_timer()
51 t_raytrace_atmos_time = 0.
52 t_raytrace_dm_time = 0.
53 s_raytrace_atmos_time = 0.
54 s_raytrace_dm_time = 0.
58 applycontrol_time = 0.
61 filename = param_file.split(
'/')[-1]
62 param_path = param_file.split(filename)[0]
63 sys.path.insert(0, param_path)
65 config = __import__(filename.split(
".py")[0])
66 sys.path.remove(param_path)
68 config.p_centroiders[0].set_type(centroider)
70 if (centroider ==
"tcog"):
71 config.p_centroiders[0].set_thresh(0.)
72 elif (centroider ==
"bpcog"):
73 config.p_centroiders[0].set_nmax(16)
74 elif (centroider ==
"geom"):
75 config.p_centroiders[0].set_type(
"cog")
76 elif (centroider ==
"wcog"):
77 config.p_centroiders[0].set_type_fct(
"gauss")
78 config.p_centroiders[0].set_width(2.0)
79 elif (centroider ==
"corr"):
80 config.p_centroiders[0].set_type_fct(
"gauss")
81 config.p_centroiders[0].set_width(2.0)
83 if (controller ==
"modopti"):
84 config.p_controllers[0].set_type(
"ls")
85 config.p_controllers[0].set_modopti(1)
87 config.p_controllers[0].set_type(controller)
89 config.p_loop.set_niter(2000)
94 synctime = timer.stop()
99 tel = init.tel_init(c, config.p_geom, config.p_tel, config.p_atmos.r0,
100 config.p_loop.ittime, config.p_wfss)
102 tel_init_time = timer.stop() - synctime
106 atm = init.atmos_init(c, config.p_atmos, config.p_tel, config.p_geom,
107 config.p_loop.ittime)
109 atmos_init_time = timer.stop() - synctime
113 dms = init.dm_init(c, config.p_dms, config.p_tel, config.p_geom, config.p_wfss)
115 dm_init_time = timer.stop() - synctime
119 target = init.target_init(c, tel, config.p_target, config.p_atmos, config.p_tel,
120 config.p_geom, config.p_dms)
122 target_init_time = timer.stop() - synctime
126 wfs = init.wfs_init(c, tel, config.p_wfss, config.p_tel, config.p_geom, config.p_dms,
129 wfs_init_time = timer.stop() - synctime
133 rtc = init.rtc_init(c, tel, wfs, dms, atm, config.p_wfss, config.p_tel,
134 config.p_geom, config.p_atmos, config.p_loop.ittime,
135 config.p_centroiders, config.p_controllers, config.p_dms)
137 rtc_init_time = timer.stop() - synctime
140 print(
"... Done with inits !")
155 if (controller ==
"modopti"):
156 for zz
in range(2048):
159 for cc
in range(config.p_loop.niter):
164 move_atmos_time += timer.stop() - synctime
167 if (config.p_controllers[0].type != b
"geo"):
168 if ((config.p_target
is not None)
and (rtc
is not None)):
169 for i
in range(config.p_target.ntargets):
171 target.raytrace(i, b
"atmos", tel, atm)
173 t_raytrace_atmos_time += timer.stop() - synctime
176 if (dms
is not None):
178 target.raytrace(i, b
"dm", tel, dms=dms)
180 t_raytrace_dm_time += timer.stop() - synctime
183 if (config.p_wfss
is not None and wfs
is not None):
184 for i
in range(len(config.p_wfss)):
186 wfs.raytrace(i, b
"atmos", tel, atm)
188 s_raytrace_atmos_time += timer.stop() - synctime
191 if (
not config.p_wfss[i].open_loop
and dms
is not None):
193 wfs.raytrace(i, b
"dm", tel, atm, dms)
195 s_raytrace_dm_time += timer.stop() - synctime
201 comp_img_time += timer.stop() - synctime
204 if (rtc
is not None and config.p_wfss
is not None and wfs
is not None):
205 if (centroider ==
"geom"):
207 rtc.do_centroids_geom(0)
209 docentroids_time += timer.stop() - synctime
215 docentroids_time += timer.stop() - synctime
218 if (dms
is not None):
222 docontrol_time += timer.stop() - synctime
228 applycontrol_time += timer.stop() - synctime
232 if (config.p_target
is not None and target
is not None):
233 for i
in range(config.p_target.ntargets):
235 target.raytrace(i, b
"atmos", tel, atm)
237 t_raytrace_atmos_time += timer.stop() - synctime
240 if (dms
is not None):
242 rtc.do_control_geo(0, dms, target, i)
244 docontrol_time += timer.stop() - synctime
250 applycontrol_time += timer.stop() - synctime
254 target.raytrace(i, b
"dm", tel, atm, dms)
256 t_raytrace_dm_time += timer.stop() - synctime
259 strehltmp = target.get_strehl(0)
260 strehlsp.append(strehltmp[0])
262 strehllp.append(strehltmp[1])
264 print(
"\n done with simulation \n")
265 print(
"\n Final strehl : \n", strehllp[len(strehllp) - 1])
275 move_atmos_time /= config.p_loop.niter / 1000.
276 t_raytrace_atmos_time /= config.p_loop.niter / 1000.
277 t_raytrace_dm_time /= config.p_loop.niter / 1000.
278 s_raytrace_atmos_time /= config.p_loop.niter / 1000.
279 s_raytrace_dm_time /= config.p_loop.niter / 1000.
280 comp_img_time /= config.p_loop.niter / 1000.
281 docentroids_time /= config.p_loop.niter / 1000.
282 docontrol_time /= config.p_loop.niter / 1000.
283 applycontrol_time /= config.p_loop.niter / 1000.
285 time_per_iter = move_atmos_time + t_raytrace_atmos_time +\
286 t_raytrace_dm_time + s_raytrace_atmos_time +\
287 s_raytrace_dm_time + comp_img_time +\
288 docentroids_time + docontrol_time +\
300 if (config.p_wfss[0].gsalt > 0):
305 if (config.p_wfss[0].gsmag > 3):
308 stype += str(config.p_wfss[0].type)
310 if (controller ==
"modopti"):
311 G = np.mean(rtc.get_modal_gains(0))
315 date = datetime.datetime.now()
316 date = [date.year, date.month, date.day]
318 version = check_output([
"git",
"rev-parse",
"--short",
"HEAD"]).decode(
'utf8')
321 hostname = check_output(
"hostname").replace(b
"\n", b
"").decode(
'UTF-8')
325 "simulname": config.simul_name,
326 "hostname": hostname,
327 "ndevices": c.get_ndevice(),
328 "device": c.get_device_names()[0],
329 "cuda_version": c.get_cuda_runtime_get_version(),
330 "magma_version": c.get_magma_info(),
331 "platform": platform.platform(),
334 "tel.diam": config.p_tel.diam,
335 "sensor_type": config.p_wfss[0].type.decode(
'UTF-8'),
336 "LGS": config.p_wfss[0].gsalt > 0,
337 "noisy": config.p_wfss[0].gsmag > 3,
338 "nxsub": config.p_wfss[0].nxsub,
339 "npix": config.p_wfss[0].npix,
340 "nphotons": config.p_wfss[0]._nphotons,
341 "controller": controller,
342 "centroider": centroider,
343 "finalSRLE": strehllp[len(strehllp) - 1],
344 "rmsSRLE": np.std(strehllp),
345 "wfs_init": wfs_init_time,
346 "atmos_init": atmos_init_time,
347 "dm_init": dm_init_time,
348 "target_init": target_init_time,
349 "rtc_init": rtc_init_time,
350 "move_atmos": move_atmos_time,
351 "target_trace_atmos": t_raytrace_atmos_time,
352 "target_trace_dm": t_raytrace_dm_time,
353 "sensor_trace_atmos": s_raytrace_atmos_time,
354 "sensor_trace_dm": s_raytrace_dm_time,
355 "comp_img": comp_img_time,
356 "docentroids": docentroids_time,
357 "docontrol": docontrol_time,
358 "applycontrol": applycontrol_time,
359 "iter_time": time_per_iter,
361 "residualPhase": target.get_phase(0)
364 store = HDFStore(BENCH_SAVEPATH +
"/benchmarks.h5")
366 df = store.get(version)
368 df = DataFrame(columns=list(keys_dict.keys()), dtype=object)
373 print(
"writing files")
374 for i
in list(keys_dict.keys()):
375 df.loc[ix, i] = keys_dict[i]
376 store.put(version, df)
388 if __name__ ==
'__main__':
390 if (len(sys.argv) < 4
or len(sys.argv) > 6):
391 error =
"wrong number of argument. Got %d (expect 4)\ncommande line should be: 'python benchmark_script.py <filename> <centroider> <controller>" % len(
393 raise Exception(error)
395 SHESHA = os.environ.get(
'SHESHA_ROOT')
397 raise EnvironmentError(
"Environment variable 'SHESHA_ROOT' must be define")
399 SHESHA_SAVEPATH = SHESHA +
"/data"
400 PARPATH = SHESHA_SAVEPATH +
"/par/par4bench"
401 BENCH_SAVEPATH = SHESHA_SAVEPATH +
"/bench-results"
403 store = HDFStore(BENCH_SAVEPATH +
"/benchmarks.h5")
405 filename = PARPATH +
"/" + sys.argv[1]
406 centroider = sys.argv[2]
407 controller = sys.argv[3]
410 if (len(sys.argv) > 4):
412 if (len(sys.argv[4]) > 1):
413 for k
in range(len(sys.argv[4])):
414 devices.append(int(sys.argv[4][k]))
416 devices.append(int(sys.argv[4]))
417 if (len(sys.argv) == 6):
418 fwrite = int(sys.argv[5])
420 script4bench(filename, centroider, controller, devices, fwrite)