diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/gpu_sim_check.c | 198 | ||||
-rw-r--r-- | tests/gpu_sim_check.geom | 28 | ||||
-rw-r--r-- | tests/meson.build | 10 |
3 files changed, 0 insertions, 236 deletions
diff --git a/tests/gpu_sim_check.c b/tests/gpu_sim_check.c deleted file mode 100644 index f0b3193e..00000000 --- a/tests/gpu_sim_check.c +++ /dev/null @@ -1,198 +0,0 @@ -/* - * gpu_sim_check.c - * - * Check that GPU simulation agrees with CPU version - * - * Copyright © 2012-2020 Deutsches Elektronen-Synchrotron DESY, - * a research centre of the Helmholtz Association. - * - * Authors: - * 2012-2019 Thomas White <taw@physics.org> - * - * This file is part of CrystFEL. - * - * CrystFEL is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * CrystFEL is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with CrystFEL. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <stdlib.h> -#include <stdio.h> - -#ifdef HAVE_CLOCK_GETTIME -#include <time.h> -#else -#include <sys/time.h> -#endif - -#define CL_TARGET_OPENCL_VERSION 220 - -#include "../src/diffraction.h" -#include "../src/diffraction-gpu.h" -#include "../src/cl-utils.h" - -#include <datatemplate.h> -#include <utils.h> -#include <image.h> -#include <symmetry.h> -#include <cell-utils.h> - - -#ifdef HAVE_CLOCK_GETTIME - -static double get_hires_seconds() -{ - struct timespec tp; - clock_gettime(CLOCK_MONOTONIC, &tp); - return (double)tp.tv_sec + ((double)tp.tv_nsec/1e9); -} - -#else - -/* Fallback version of the above. The time according to gettimeofday() is not - * monotonic, so measuring intervals based on it will screw up if there's a - * timezone change (e.g. daylight savings) while the program is running. */ -static double get_hires_seconds() -{ - struct timeval tp; - gettimeofday(&tp, NULL); - return (double)tp.tv_sec + ((double)tp.tv_usec/1e6); -} - -#endif - - -int main(int argc, char *argv[]) -{ - struct gpu_context *gctx; - struct image *gpu_image; - struct image *cpu_image; - DataTemplate *dtempl; - UnitCell *cell; - UnitCell *cell_raw; - int i; - double gpu_min, gpu_max, gpu_tot; - double cpu_min, cpu_max, cpu_tot; - double dev, perc; - double start, end; - double gpu_time, cpu_time; - SymOpList *sym; - gsl_rng *rng; - - if ( have_gpu_device() == 0 ) { - ERROR("No GPU device found - skipping test.\n"); - return 0; - } - - rng = gsl_rng_alloc(gsl_rng_mt19937); - - gctx = setup_gpu(1, NULL, NULL, NULL, 0); - if ( gctx == NULL ) { - ERROR("Couldn't set up GPU.\n"); - return 1; - } - - cell_raw = cell_new_from_parameters(28.1e-9, 28.1e-9, 16.5e-9, - deg2rad(90.0), deg2rad(90.0), deg2rad(120.0)); - - cell = cell_rotate(cell_raw, random_quaternion(rng)); - - dtempl = data_template_new_from_file(argv[1]); - if ( dtempl == NULL ) return 1; - - cpu_image = image_create_for_simulation(dtempl); - gpu_image = image_create_for_simulation(dtempl); - - start = get_hires_seconds(); - if ( get_diffraction_gpu(gctx, gpu_image, 8, 8, 8, cell, 0, 0, 10) ) { - return 1; - } - end = get_hires_seconds(); - gpu_time = end - start; - - sym = get_pointgroup("1"); - - cpu_image->dp = malloc(cpu_image->detgeom->n_panels * sizeof(float *)); - if ( cpu_image->dp == NULL ) { - ERROR("Couldn't allocate memory for result.\n"); - return 1; - } - for ( i=0; i<cpu_image->detgeom->n_panels; i++ ) { - struct detgeom_panel *p = &cpu_image->detgeom->panels[i]; - cpu_image->dp[i] = calloc(p->w * p->h, sizeof(float)); - if ( cpu_image->dp[i] == NULL ) { - ERROR("Couldn't allocate memory for panel %i\n", i); - return 1; - } - } - - start = get_hires_seconds(); - get_diffraction(cpu_image, 8, 8, 8, NULL, NULL, NULL, cell, - GRADIENT_MOSAIC, sym, 0, 0, 10); - end = get_hires_seconds(); - cpu_time = end - start; - - free_symoplist(sym); - - STATUS("The GPU version was %5.2f times faster.\n", cpu_time/gpu_time); - - gpu_min = +INFINITY; gpu_max = -INFINITY; gpu_tot = 0.0; - cpu_min = +INFINITY; cpu_max = -INFINITY; cpu_tot = 0.0; - dev = 0.0; - for ( i=0; i<cpu_image->detgeom->n_panels; i++ ) { - - int j; - struct detgeom_panel *p = &cpu_image->detgeom->panels[i]; - - for ( j=0; j<p->w*p->h; j++ ) { - - const double cpu = cpu_image->dp[i][j]; - const double gpu = gpu_image->dp[i][j]; - - if ( cpu > cpu_max ) cpu_max = cpu; - if ( cpu < cpu_min ) cpu_min = cpu; - if ( gpu > gpu_max ) gpu_max = gpu; - if ( gpu < gpu_min ) gpu_min = gpu; - gpu_tot += gpu; - cpu_tot += cpu; - dev += fabs(gpu - cpu); - - } - - } - perc = 100.0*dev/cpu_tot; - - STATUS("GPU: min=%8e, max=%8e, total=%8e\n", gpu_min, gpu_max, gpu_tot); - STATUS("CPU: min=%8e, max=%8e, total=%8e\n", cpu_min, cpu_max, cpu_tot); - STATUS("dev = %8e (%5.2f%% of CPU total)\n", dev, perc); - - if ( perc > 1.2 ) { - - STATUS("Test failed! I'm writing cpu-sim.h5 and gpu-sim.h5" - " for you to inspect.\n"); - - image_write(cpu_image, dtempl, "cpu-sim.h5"); - image_write(gpu_image, dtempl, "gpu-sim.h5"); - - return 1; - - } - - gsl_rng_free(rng); - cell_free(cell); - image_free(cpu_image); - image_free(gpu_image); - data_template_free(dtempl); - - return 0; -} diff --git a/tests/gpu_sim_check.geom b/tests/gpu_sim_check.geom deleted file mode 100644 index 57064e58..00000000 --- a/tests/gpu_sim_check.geom +++ /dev/null @@ -1,28 +0,0 @@ -photon_energy = 6 keV -bandwidth = 0.01 - -panel0/min_fs = 0 -panel0/max_fs = 1023 -panel0/min_ss = 0 -panel0/max_ss = 511 -panel0/corner_x = -512.0 -panel0/corner_y = -532.0 -panel0/clen = 100 mm -panel0/res = 9090.91 -panel0/adu_per_eV = 1 -panel0/data = /data/panel0 -panel0/fs = x -panel0/ss = y - -panel1/min_fs = 0 -panel1/max_fs = 1023 -panel1/min_ss = 0 -panel1/max_ss = 511 -panel1/corner_x = -512.0 -panel1/corner_y = 20.0 -panel1/clen = 100 mm -panel1/res = 9090.91 -panel1/adu_per_eV = 1 -panel1/data = /data/panel1 -panel1/fs = x -panel1/ss = y
\ No newline at end of file diff --git a/tests/meson.build b/tests/meson.build index b3b3cc79..917c59db 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -96,16 +96,6 @@ exe = executable('prof2d_check', dependencies : [libcrystfeldep, mdep, gsldep]) test('prof2d_check', exe) -if opencldep.found() - exe = executable('gpu_sim_check', - ['gpu_sim_check.c', - simulation_bits], - dependencies : [libcrystfeldep, mdep, gsldep, opencldep], - include_directories: conf_inc) - geom = files('gpu_sim_check.geom') - test('gpu_sim_check', exe, args: [geom]) -endif - # Event enumeration tests if hdf5dep.found() ev_enum_tests = ['ev_enum1', |