diff --git a/HySoP/hysop/tools/kernel_benchmark.py b/HySoP/hysop/tools/kernel_benchmark.py index d319e7d4316c6a609cf543992535202cca25c762..9adea38612444fddc77131eb6f98a34d4f28111d 100644 --- a/HySoP/hysop/tools/kernel_benchmark.py +++ b/HySoP/hysop/tools/kernel_benchmark.py @@ -108,9 +108,8 @@ class BenchmarkSuite: b.launch() [self.timings[self.kernel_name][v[1]][conf[2]].__setitem__( t[0], t[1]) for t in b.timings.items()] - if not self.test: - pickle.dump(self.timings, open(self.pickle_file_name + '.pickle', 'w'), 0) - self.write_file() + pickle.dump(self.timings, open(self.pickle_file_name + '.pickle', 'w'), 0) + self.write_file() def write_file(self): """ @@ -232,26 +231,37 @@ class Benchmark: print " over : ", self.device.name, print " with ", self.device.opencl_c_version print " Precision capability ", + self.correctlyroundeddividesqrt = True if precision == 'SP': print "for Single Precision: ", for v in ['DENORM', 'INF_NAN', 'ROUND_TO_NEAREST', 'ROUND_TO_ZERO', 'ROUND_TO_INF', 'FMA', 'CORRECTLY_ROUNDED_DIVIDE_SQRT', 'SOFT_FLOAT']: - if eval('(self.device.single_fp_config & cl.device_fp_config.' + - v + ') == cl.device_fp_config.' + v): - print v, + try: + if eval('(self.device.single_fp_config & cl.device_fp_config.' + + v + ') == cl.device_fp_config.' + v): + print v, + except AttributeError as ae: + if v is 'CORRECTLY_ROUNDED_DIVIDE_SQRT': + self.correctlyroundeddividesqrt = False + print '\n', v, 'is not supported in OpenCL C 1.2. Exception catched : ', ae else: print "for Double Precision: ", if self.device.double_fp_config > 0: for v in ['DENORM', 'INF_NAN', 'ROUND_TO_NEAREST', 'ROUND_TO_ZERO', 'ROUND_TO_INF', 'FMA', 'CORRECTLY_ROUNDED_DIVIDE_SQRT', 'SOFT_FLOAT']: - if eval('(self.device.double_fp_config & cl.device_fp_config.' + - v + ') == cl.device_fp_config.' + v): - print v, + try: + if eval('(self.device.double_fp_config & cl.device_fp_config.' + + v + ') == cl.device_fp_config.' + v): + print v, + except AttributeError as ae: + if v is 'CORRECTLY_ROUNDED_DIVIDE_SQRT': + self.correctlyroundeddividesqrt = False + print '\n', v, 'is supported in OpenCL C 1.2. Exception catched : ', ae else: raise ValueError("Double Precision is not supported by device") - print "\n\n" + print "" #Creates GPU Context ## OpenCL context self.ctx = cl.Context([self.device]) @@ -280,13 +290,16 @@ class Benchmark: if self.code is not None: for size in self.sizes: if self.is_size_allowed is None or self.is_size_allowed(size): - build_options = " -cl-opt-disable -cl-fp32-correctly-rounded-divide-sqrt " + build_options = " -cl-opt-disable" + if self.correctlyroundeddividesqrt: + build_options += " -cl-fp32-correctly-rounded-divide-sqrt " if self.precision == 'SP': - prg = cl.Program(self.ctx, self.code) + prg = cl.Program(self.ctx, self.code.replace('.0', '.0f')) build_options += " -cl-single-precision-constant " else: prg = cl.Program(self.ctx, self.code.replace('float', 'double')) prg.build(build_options + build_opt(size)) + print prg.get_build_info(self.device, cl.program_build_info.OPTIONS) self.prg[size] = prg ## Function to setup kernels arguments self.kernelSetup = None