Changeset 0db7dbd in sasmodels for sasmodels/kernel_header.c


Ignore:
Timestamp:
Feb 16, 2018 7:10:04 PM (6 years ago)
Author:
pkienzle
Branches:
master, core_shell_microgels, magnetic_model, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
Children:
47fb816
Parents:
aa90015
Message:

cuda support: allow cylinder model to run under CUDA as well as OpenCL

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/kernel_header.c

    r108e70e r0db7dbd  
    11#ifdef __OPENCL_VERSION__ 
    22# define USE_OPENCL 
     3#elif defined(__CUDACC__) 
     4# define USE_CUDA 
    35#elif defined(_OPENMP) 
    46# define USE_OPENMP 
     
    810// Note: if using a C++ compiler, then define kernel as extern "C" 
    911#ifdef USE_OPENCL 
     12 
     13   #define USE_GPU 
    1014   typedef int int32_t; 
    11 #  if defined(USE_SINCOS) 
    12 #    define SINCOS(angle,svar,cvar) svar=sincos(angle,&cvar) 
    13 #  else 
    14 #    define SINCOS(angle,svar,cvar) do {const double _t_=angle; svar=sin(_t_);cvar=cos(_t_);} while (0) 
    15 #  endif 
     15   #define global_par global 
     16   #define local_par local 
     17   #define constant_par constant 
     18   #define global_var global 
     19   #define local_var local 
     20   #define constant_var constant 
     21   #define __device__ 
     22 
     23   #if defined(USE_SINCOS) 
     24   #  define SINCOS(angle,svar,cvar) svar=sincos(angle,&cvar) 
     25   #else 
     26   #  define SINCOS(angle,svar,cvar) do {const double _t_=angle; svar=sin(_t_);cvar=cos(_t_);} while (0) 
     27   #endif 
    1628   // Intel CPU on Mac gives strange values for erf(); on the verified 
    1729   // platforms (intel, nvidia, amd), the cephes erf() is significantly 
     
    2436   #  define erfcf erfc 
    2537   #endif 
    26 #else // !USE_OPENCL 
    27 // Use SAS_DOUBLE to force the use of double even for float kernels 
    28 #  define SAS_DOUBLE dou ## ble 
    29 #  ifdef __cplusplus 
     38 
     39#elif defined(USE_CUDA) 
     40 
     41   #define USE_GPU 
     42   #define global_par 
     43   #define local_par 
     44   #define constant_par const 
     45   #define global_var 
     46   #define local_var __shared__ 
     47   #define constant_var __constant__ 
     48 
     49   #define kernel extern "C" __global__ 
     50 
     51   // OpenCL powr(a,b) = C99 pow(a,b), b >= 0 
     52   // OpenCL pown(a,b) = C99 pow(a,b), b integer 
     53   #define powr(a,b) pow(a,b) 
     54   #define pown(a,b) pow(a,b) 
     55   //typedef int int32_t; 
     56   #if defined(USE_SINCOS) 
     57   #  define SINCOS(angle,svar,cvar) sincos(angle,&svar,&cvar) 
     58   #else 
     59   #  define SINCOS(angle,svar,cvar) do {const double _t_=angle; svar=sin(_t_);cvar=cos(_t_);} while (0) 
     60   #endif 
     61 
     62#else // !USE_OPENCL && !USE_CUDA 
     63 
     64   #define global_par 
     65   #define local_par 
     66   #define constant_par const 
     67   #define global_var 
     68   #define local_var 
     69   #define constant_var const 
     70   #define __device__ 
     71 
     72   #ifdef __cplusplus 
    3073      #include <cstdio> 
    3174      #include <cmath> 
     
    5194     #endif 
    5295     inline void SINCOS(double angle, double &svar, double &cvar) { svar=sin(angle); cvar=cos(angle); } 
    53 else // !__cplusplus 
     96   #else // !__cplusplus 
    5497     #include <inttypes.h>  // C99 guarantees that int32_t types is here 
    5598     #include <stdio.h> 
     
    76119     #define kernel 
    77120     #define SINCOS(angle,svar,cvar) do {const double _t_=angle; svar=sin(_t_);cvar=cos(_t_);} while (0) 
    78 #  endif  // !__cplusplus 
    79 #  define global 
    80 #  define local 
    81 #  define constant const 
    82 // OpenCL powr(a,b) = C99 pow(a,b), b >= 0 
    83 // OpenCL pown(a,b) = C99 pow(a,b), b integer 
    84 #  define powr(a,b) pow(a,b) 
    85 #  define pown(a,b) pow(a,b) 
     121   #endif  // !__cplusplus 
     122   // OpenCL powr(a,b) = C99 pow(a,b), b >= 0 
     123   // OpenCL pown(a,b) = C99 pow(a,b), b integer 
     124   #define powr(a,b) pow(a,b) 
     125   #define pown(a,b) pow(a,b) 
     126 
    86127#endif // !USE_OPENCL 
     128 
     129// Use SAS_DOUBLE to force the use of double even for float kernels 
     130#define SAS_DOUBLE dou ## ble 
    87131 
    88132#if defined(NEED_EXPM1) 
     
    147191#  define M_4PI_3 4.18879020478639 
    148192#endif 
     193__device__ 
    149194inline double square(double x) { return x*x; } 
     195__device__ 
    150196inline double cube(double x) { return x*x*x; } 
     197__device__ 
    151198inline double sas_sinx_x(double x) { return x==0 ? 1.0 : sin(x)/x; } 
    152199 
Note: See TracChangeset for help on using the changeset viewer.