Changes in / [508475a:2a12d8d8] in sasmodels
- Files:
-
- 1 deleted
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/guide/gpu_setup.rst
r8b31efa r63602b1 94 94 Device Selection 95 95 ================ 96 **OpenCL drivers**97 98 96 If you have multiple GPU devices you can tell the program which device to use. 99 97 By default, the program looks for one GPU and one CPU device from available … … 106 104 was used to run the model. 107 105 108 If you want to use a specific driver and devices, you can run the following 106 **If you don't want to use OpenCL, you can set** *SAS_OPENCL=None* 107 **in your environment settings, and it will only use normal programs.** 108 109 If you want to use one of the other devices, you can run the following 109 110 from the python console:: 110 111 … … 114 115 This will provide a menu of different OpenCL drivers available. 115 116 When one is selected, it will say "set PYOPENCL_CTX=..." 116 Use that value as the value of *SAS_OPENCL=driver:device*. 117 118 To use the default OpenCL device (rather than CUDA or None), 119 set *SAS_OPENCL=opencl*. 120 121 In batch queues, you may need to set *XDG_CACHE_HOME=~/.cache* 122 (Linux only) to a different directory, depending on how the filesystem 123 is configured. You should also set *SAS_DLL_PATH* for CPU-only modules. 124 125 -DSAS_MODELPATH=path sets directory containing custom models 126 -DSAS_OPENCL=vendor:device|cuda:device|none sets the target GPU device 127 -DXDG_CACHE_HOME=~/.cache sets the pyopencl cache root (linux only) 128 -DSAS_COMPILER=tinycc|msvc|mingw|unix sets the DLL compiler 129 -DSAS_OPENMP=1 turns on OpenMP for the DLLs 130 -DSAS_DLL_PATH=path sets the path to the compiled modules 131 132 133 **CUDA drivers** 134 135 If OpenCL drivers are not available on your system, but NVidia CUDA 136 drivers are available, then set *SAS_OPENCL=cuda* or 137 *SAS_OPENCL=cuda:n* for a particular device number *n*. If no device 138 number is specified, then the CUDA drivers looks for look for 139 *CUDA_DEVICE=n* or a file ~/.cuda-device containing n for the device number. 140 141 In batch queues, the SLURM command *sbatch --gres=gpu:1 ...* will set 142 *CUDA_VISIBLE_DEVICES=n*, which ought to set the correct device 143 number for *SAS_OPENCL=cuda*. If not, then set 144 *CUDA_DEVICE=$CUDA_VISIBLE_DEVICES* within the batch script. You may 145 need to set the CUDA cache directory to a folder accessible across the 146 cluster with *PYCUDA_CACHE_DIR* (or *PYCUDA_DISABLE_CACHE* to disable 147 caching), and you may need to set environment specific compiler flags 148 with *PYCUDA_DEFAULT_NVCC_FLAGS*. You should also set *SAS_DLL_PATH* 149 for CPU-only modules. 150 151 **No GPU support** 152 153 If you don't want to use OpenCL or CUDA, you can set *SAS_OPENCL=None* 154 in your environment settings, and it will only use normal programs. 155 156 In batch queues, you may need to set *SAS_DLL_PATH* to a directory 157 accessible on the compute node. 158 117 Use that value as the value of *SAS_OPENCL*. 159 118 160 119 Device Testing … … 195 154 *Document History* 196 155 197 | 201 8-10-15Paul Kienzle156 | 2017-09-27 Paul Kienzle -
sasmodels/compare.py
r4de14584 r610ef23 41 41 from . import kerneldll 42 42 from . import kernelcl 43 from . import kernelcuda44 43 from .data import plot_theory, empty_data1D, empty_data2D, load_data 45 44 from .direct_model import DirectModel, get_mesh … … 116 115 === environment variables === 117 116 -DSAS_MODELPATH=path sets directory containing custom models 118 -DSAS_OPENCL=vendor:device| cuda:device|none sets the target GPUdevice117 -DSAS_OPENCL=vendor:device|none sets the target OpenCL device 119 118 -DXDG_CACHE_HOME=~/.cache sets the pyopencl cache root (linux only) 120 119 -DSAS_COMPILER=tinycc|msvc|mingw|unix sets the DLL compiler … … 726 725 set_integration_size(model_info, ngauss) 727 726 728 if (dtype != "default" and not dtype.endswith('!') 729 and not (kernelcl.use_opencl() or kernelcuda.use_cuda())): 727 if dtype != "default" and not dtype.endswith('!') and not kernelcl.use_opencl(): 730 728 raise RuntimeError("OpenCL not available " + kernelcl.OPENCL_ERROR) 731 729 -
sasmodels/core.py
rb0de252 r2dcd6e7 21 21 from . import mixture 22 22 from . import kernelpy 23 from . import kernelcuda24 23 from . import kernelcl 25 24 from . import kerneldll … … 211 210 #print("building dll", numpy_dtype) 212 211 return kerneldll.load_dll(source['dll'], model_info, numpy_dtype) 213 elif platform == "cuda":214 return kernelcuda.GpuModel(source, model_info, numpy_dtype, fast=fast)215 212 else: 216 213 #print("building ocl", numpy_dtype) … … 248 245 # type: (ModelInfo, str, str) -> (np.dtype, bool, str) 249 246 """ 250 Interpret dtype string, returning np.dtype , fast flag and platform.247 Interpret dtype string, returning np.dtype and fast flag. 251 248 252 249 Possible types include 'half', 'single', 'double' and 'quad'. If the … … 256 253 default for the model and platform. 257 254 258 Platform preference can be specfied ("ocl", "cuda", "dll"), with the 259 default being OpenCL or CUDA if available, otherwise DLL. If the dtype 260 name ends with '!' then platform is forced to be DLL rather than GPU. 261 The default platform is set by the environment variable SAS_OPENCL, 262 SAS_OPENCL=driver:device for OpenCL, SAS_OPENCL=cuda:device for CUDA 263 or SAS_OPENCL=none for DLL. 255 Platform preference can be specfied ("ocl" vs "dll"), with the default 256 being OpenCL if it is availabe. If the dtype name ends with '!' then 257 platform is forced to be DLL rather than OpenCL. 264 258 265 259 This routine ignores the preferences within the model definition. This … … 274 268 if platform is None: 275 269 platform = "ocl" 270 if not kernelcl.use_opencl() or not model_info.opencl: 271 platform = "dll" 276 272 277 273 # Check if type indicates dll regardless of which platform is given … … 279 275 platform = "dll" 280 276 dtype = dtype[:-1] 281 282 # Make sure model allows opencl/gpu283 if not model_info.opencl:284 platform = "dll"285 286 # Make sure opencl is available, or fallback to cuda then to dll287 if platform == "ocl" and not kernelcl.use_opencl():288 platform = "cuda" if kernelcuda.use_cuda() else "dll"289 277 290 278 # Convert special type names "half", "fast", and "quad" … … 297 285 dtype = "float16" 298 286 299 # Convert dtype string to numpy dtype. Use single precision for GPU 300 # if model allows it, otherwise use double precision. 287 # Convert dtype string to numpy dtype. 301 288 if dtype is None or dtype == "default": 302 numpy_dtype = (generate.F32 if model_info.single and platform in ("ocl", "cuda")289 numpy_dtype = (generate.F32 if platform == "ocl" and model_info.single 303 290 else generate.F64) 304 291 else: 305 292 numpy_dtype = np.dtype(dtype) 306 293 307 # Make sure that the type is supported by GPU, otherwise use dll294 # Make sure that the type is supported by opencl, otherwise use dll 308 295 if platform == "ocl": 309 296 env = kernelcl.environment() 310 elif platform == "cuda": 311 env = kernelcuda.environment() 312 else: 313 env = None 314 if env is not None and not env.has_type(numpy_dtype): 315 platform = "dll" 316 if dtype is None: 317 numpy_dtype = generate.F64 297 if not env.has_type(numpy_dtype): 298 platform = "dll" 299 if dtype is None: 300 numpy_dtype = generate.F64 318 301 319 302 return numpy_dtype, fast, platform -
sasmodels/kernel_header.c
r74e9b5f r108e70e 1 1 #ifdef __OPENCL_VERSION__ 2 2 # define USE_OPENCL 3 #elif defined(__CUDACC__)4 # define USE_CUDA5 3 #elif defined(_OPENMP) 6 4 # define USE_OPENMP 7 5 #endif 8 9 // Use SAS_DOUBLE to force the use of double even for float kernels10 #define SAS_DOUBLE dou ## ble11 6 12 7 // If opencl is not available, then we are compiling a C function 13 8 // Note: if using a C++ compiler, then define kernel as extern "C" 14 9 #ifdef USE_OPENCL 15 16 #define USE_GPU17 #define pglobal global18 #define pconstant constant19 20 10 typedef int int32_t; 21 22 #if defined(USE_SINCOS) 23 # define SINCOS(angle,svar,cvar) svar=sincos(angle,&cvar) 24 #else 25 # define SINCOS(angle,svar,cvar) do {const double _t_=angle; svar=sin(_t_);cvar=cos(_t_);} while (0) 26 #endif 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 27 16 // Intel CPU on Mac gives strange values for erf(); on the verified 28 17 // platforms (intel, nvidia, amd), the cephes erf() is significantly … … 35 24 # define erfcf erfc 36 25 #endif 37 38 #elif defined(USE_CUDA) 39 40 #define USE_GPU 41 #define local __shared__ 42 #define pglobal 43 #define constant __constant__ 44 #define pconstant const 45 #define kernel extern "C" __global__ 46 47 // OpenCL powr(a,b) = C99 pow(a,b), b >= 0 48 // OpenCL pown(a,b) = C99 pow(a,b), b integer 49 #define powr(a,b) pow(a,b) 50 #define pown(a,b) pow(a,b) 51 //typedef int int32_t; 52 #if defined(USE_SINCOS) 53 # define SINCOS(angle,svar,cvar) sincos(angle,&svar,&cvar) 54 #else 55 # define SINCOS(angle,svar,cvar) do {const double _t_=angle; svar=sin(_t_);cvar=cos(_t_);} while (0) 56 #endif 57 58 #else // !USE_OPENCL && !USE_CUDA 59 60 #define local 61 #define pglobal 62 #define constant const 63 #define pconstant const 64 65 #ifdef __cplusplus 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 66 30 #include <cstdio> 67 31 #include <cmath> … … 87 51 #endif 88 52 inline void SINCOS(double angle, double &svar, double &cvar) { svar=sin(angle); cvar=cos(angle); } 89 #else // !__cplusplus53 # else // !__cplusplus 90 54 #include <inttypes.h> // C99 guarantees that int32_t types is here 91 55 #include <stdio.h> … … 112 76 #define kernel 113 77 #define SINCOS(angle,svar,cvar) do {const double _t_=angle; svar=sin(_t_);cvar=cos(_t_);} while (0) 114 #endif // !__cplusplus 115 // OpenCL powr(a,b) = C99 pow(a,b), b >= 0 116 // OpenCL pown(a,b) = C99 pow(a,b), b integer 117 #define powr(a,b) pow(a,b) 118 #define pown(a,b) pow(a,b) 119 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) 120 86 #endif // !USE_OPENCL 121 87 -
sasmodels/kernel_iq.c
r74e9b5f r70530778 278 278 const int32_t pd_start, // where we are in the dispersity loop 279 279 const int32_t pd_stop, // where we are stopping in the dispersity loop 280 pglobal const ProblemDetails *details,281 pglobal const double *values,282 pglobal const double *q, // nq q values, with padding to boundary283 pglobal double *result, // nq+1 return values, again with padding280 global const ProblemDetails *details, 281 global const double *values, 282 global const double *q, // nq q values, with padding to boundary 283 global double *result, // nq+1 return values, again with padding 284 284 const double cutoff // cutoff in the dispersity weight product 285 285 ) 286 286 { 287 #if defined(USE_GPU)287 #ifdef USE_OPENCL 288 288 // who we are and what element we are working with 289 #if defined(USE_OPENCL)290 289 const int q_index = get_global_id(0); 291 #else // USE_CUDA292 const int q_index = threadIdx.x + blockIdx.x * blockDim.x;293 #endif294 290 if (q_index >= nq) return; 295 291 #else … … 344 340 // seeing one q value (stored in the variable "this_result") while the dll 345 341 // version must loop over all q. 346 #if defined(USE_GPU)342 #ifdef USE_OPENCL 347 343 double pd_norm = (pd_start == 0 ? 0.0 : result[nq]); 348 344 double this_result = (pd_start == 0 ? 0.0 : result[q_index]); 349 #else // !USE_ GPU345 #else // !USE_OPENCL 350 346 double pd_norm = (pd_start == 0 ? 0.0 : result[nq]); 351 347 if (pd_start == 0) { … … 356 352 } 357 353 //if (q_index==0) printf("start %d %g %g\n", pd_start, pd_norm, result[0]); 358 #endif // !USE_ GPU354 #endif // !USE_OPENCL 359 355 360 356 … … 379 375 const int n4 = pd_length[4]; 380 376 const int p4 = pd_par[4]; 381 pglobal const double *v4 = pd_value + pd_offset[4];382 pglobal const double *w4 = pd_weight + pd_offset[4];377 global const double *v4 = pd_value + pd_offset[4]; 378 global const double *w4 = pd_weight + pd_offset[4]; 383 379 int i4 = (pd_start/pd_stride[4])%n4; // position in level 4 at pd_start 384 380 … … 566 562 const int n##_LOOP = details->pd_length[_LOOP]; \ 567 563 const int p##_LOOP = details->pd_par[_LOOP]; \ 568 pglobal const double *v##_LOOP = pd_value + details->pd_offset[_LOOP]; \569 pglobal const double *w##_LOOP = pd_weight + details->pd_offset[_LOOP]; \564 global const double *v##_LOOP = pd_value + details->pd_offset[_LOOP]; \ 565 global const double *w##_LOOP = pd_weight + details->pd_offset[_LOOP]; \ 570 566 int i##_LOOP = (pd_start/details->pd_stride[_LOOP])%n##_LOOP; 571 567 … … 591 587 // Pointers to the start of the dispersity and weight vectors, if needed. 592 588 #if MAX_PD>0 593 pglobal const double *pd_value = values + NUM_VALUES;594 pglobal const double *pd_weight = pd_value + details->num_weights;589 global const double *pd_value = values + NUM_VALUES; 590 global const double *pd_weight = pd_value + details->num_weights; 595 591 #endif 596 592 … … 652 648 BUILD_ROTATION(); 653 649 654 #if !defined(USE_GPU)650 #ifndef USE_OPENCL 655 651 // DLL needs to explicitly loop over the q values. 656 652 #ifdef USE_OPENMP … … 658 654 #endif 659 655 for (q_index=0; q_index<nq; q_index++) 660 #endif // !USE_ GPU656 #endif // !USE_OPENCL 661 657 { 662 658 … … 701 697 //printf("q_index:%d %g %g %g %g\n", q_index, scattering, weight0); 702 698 703 #if defined(USE_GPU)699 #ifdef USE_OPENCL 704 700 this_result += weight * scattering; 705 #else // !USE_ GPU701 #else // !USE_OPENCL 706 702 result[q_index] += weight * scattering; 707 #endif // !USE_ GPU703 #endif // !USE_OPENCL 708 704 } 709 705 } … … 729 725 730 726 // Remember the current result and the updated norm. 731 #if defined(USE_GPU)727 #ifdef USE_OPENCL 732 728 result[q_index] = this_result; 733 729 if (q_index == 0) result[nq] = pd_norm; 734 730 //if (q_index == 0) printf("res: %g/%g\n", result[0], pd_norm); 735 #else // !USE_ GPU731 #else // !USE_OPENCL 736 732 result[nq] = pd_norm; 737 733 //printf("res: %g/%g\n", result[0], pd_norm); 738 #endif // !USE_ GPU734 #endif // !USE_OPENCL 739 735 740 736 // ** clear the macros in preparation for the next kernel ** -
sasmodels/kernelcl.py
r95f62aa r95f62aa 1 1 """ 2 2 GPU driver for C kernels 3 4 TODO: docs are out of date5 3 6 4 There should be a single GPU environment running on the system. This … … 61 59 62 60 63 # Attempt to setup opencl. This may fail if the pyopencl package is not61 # Attempt to setup opencl. This may fail if the opencl package is not 64 62 # installed or if it is installed but there are no devices available. 65 63 try: … … 134 132 135 133 def use_opencl(): 136 sas_opencl = os.environ.get("SAS_OPENCL", "OpenCL").lower() 137 return HAVE_OPENCL and sas_opencl != "none" and not sas_opencl.startswith("cuda") 134 return HAVE_OPENCL and os.environ.get("SAS_OPENCL", "").lower() != "none" 138 135 139 136 ENV = None … … 183 180 cl.kernel_work_group_info.PREFERRED_WORK_GROUP_SIZE_MULTIPLE, 184 181 queue.device) 182 183 def _stretch_input(vector, dtype, extra=1e-3, boundary=32): 184 # type: (np.ndarray, np.dtype, float, int) -> np.ndarray 185 """ 186 Stretch an input vector to the correct boundary. 187 188 Performance on the kernels can drop by a factor of two or more if the 189 number of values to compute does not fall on a nice power of two 190 boundary. The trailing additional vector elements are given a 191 value of *extra*, and so f(*extra*) will be computed for each of 192 them. The returned array will thus be a subset of the computed array. 193 194 *boundary* should be a power of 2 which is at least 32 for good 195 performance on current platforms (as of Jan 2015). It should 196 probably be the max of get_warp(kernel,queue) and 197 device.min_data_type_align_size//4. 198 """ 199 remainder = vector.size % boundary 200 if remainder != 0: 201 size = vector.size + (boundary - remainder) 202 vector = np.hstack((vector, [extra] * (size - vector.size))) 203 return np.ascontiguousarray(vector, dtype=dtype) 204 185 205 186 206 def compile_model(context, source, dtype, fast=False): … … 322 342 Uses SAS_OPENCL or PYOPENCL_CTX if they are set in the environment, 323 343 otherwise scans for the most appropriate device using 324 :func:`_get_default_context`. Ignore *SAS_OPENCL=OpenCL*, which 325 indicates that an OpenCL device should be used without specifying 326 which one (and not a CUDA device, or no GPU). 327 """ 328 # Assume we do not get here if SAS_OPENCL is None or CUDA 329 sas_opencl = os.environ.get('SAS_OPENCL', 'opencl') 330 if sas_opencl.lower() != 'opencl': 331 # Setting PYOPENCL_CTX as a SAS_OPENCL to create cl context 332 os.environ["PYOPENCL_CTX"] = sas_opencl 344 :func:`_get_default_context` 345 """ 346 if 'SAS_OPENCL' in os.environ: 347 #Setting PYOPENCL_CTX as a SAS_OPENCL to create cl context 348 os.environ["PYOPENCL_CTX"] = os.environ["SAS_OPENCL"] 333 349 334 350 if 'PYOPENCL_CTX' in os.environ: … … 628 644 current_time = time.clock() 629 645 if current_time - last_nap > 0.5: 630 time.sleep(0.0 01)646 time.sleep(0.05) 631 647 last_nap = current_time 632 648 cl.enqueue_copy(queue, self.result, result_b, wait_for=wait_for) -
sasmodels/model_test.py
r74e9b5f r012cd34 5 5 Usage:: 6 6 7 python -m sasmodels.model_test [opencl| cuda|dll] model1 model2 ...7 python -m sasmodels.model_test [opencl|dll|opencl_and_dll] model1 model2 ... 8 8 9 9 if model1 is 'all', then all except the remaining models will be tested … … 63 63 from .modelinfo import expand_pars 64 64 from .kernelcl import use_opencl 65 from .kernelcuda import use_cuda66 65 67 66 # pylint: disable=unused-import … … 81 80 Construct the pyunit test suite. 82 81 83 *loaders* is the list of kernel drivers to use (dll, opencl or cuda). 84 For python model the python driver is always used. 82 *loaders* is the list of kernel drivers to use, which is one of 83 *["dll", "opencl"]*, *["dll"]* or *["opencl"]*. For python models, 84 the python driver is always used. 85 85 86 86 *models* is the list of models to test, or *["all"]* to test all models. … … 135 135 136 136 # test using dll if desired 137 if 'dll' in loaders :137 if 'dll' in loaders or not use_opencl(): 138 138 test_name = "%s-dll"%model_name 139 139 test_method_name = "test_%s_dll" % model_info.id … … 156 156 test_method_name, 157 157 platform="ocl", dtype=None, 158 stash=stash)159 #print("defining", test_name)160 suite.addTest(test)161 162 # test using cuda if desired and available163 if 'cuda' in loaders and use_cuda():164 test_name = "%s-cuda"%model_name165 test_method_name = "test_%s_cuda" % model_info.id166 # Using dtype=None so that the models that are only167 # correct for double precision are not tested using168 # single precision. The choice is determined by the169 # presence of *single=False* in the model file.170 test = ModelTestCase(test_name, model_info,171 test_method_name,172 platform="cuda", dtype=None,173 158 stash=stash) 174 159 #print("defining", test_name) … … 235 220 236 221 # Check for missing tests. Only do so for the "dll" tests 237 # to reduce noise from both opencl and cuda, and because222 # to reduce noise from both opencl and dll, and because 238 223 # python kernels use platform="dll". 239 224 if self.platform == "dll": … … 383 368 384 369 # Build a test suite containing just the model 385 loader = 'opencl' if use_opencl() else 'cuda' if use_cuda() else 'dll'370 loaders = ['opencl'] if use_opencl() else ['dll'] 386 371 models = [model] 387 372 try: 388 suite = make_suite( [loader], models)373 suite = make_suite(loaders, models) 389 374 except Exception: 390 375 import traceback … … 449 434 loaders = ['opencl'] 450 435 models = models[1:] 451 elif models and models[0] == 'cuda':452 if not use_cuda():453 print("cuda is not available")454 return 1455 loaders = ['cuda']456 models = models[1:]457 436 elif models and models[0] == 'dll': 458 437 # TODO: test if compiler is available? 459 438 loaders = ['dll'] 460 439 models = models[1:] 440 elif models and models[0] == 'opencl_and_dll': 441 loaders = ['opencl', 'dll'] if use_opencl() else ['dll'] 442 models = models[1:] 461 443 else: 462 loaders = ['dll'] 463 if use_opencl(): 464 loaders.append('opencl') 465 if use_cuda(): 466 loaders.append('cuda') 444 loaders = ['opencl', 'dll'] if use_opencl() else ['dll'] 467 445 if not models: 468 446 print("""\ 469 447 usage: 470 python -m sasmodels.model_test [-v] [opencl| cuda|dll] model1 model2 ...448 python -m sasmodels.model_test [-v] [opencl|dll] model1 model2 ... 471 449 472 450 If -v is included on the command line, then use verbose output. 473 451 474 If n o platform is specified, then models will be tested with dll, and475 if available, OpenCL and CUDA; the compute target is ignored for pure python models.452 If neither opencl nor dll is specified, then models will be tested with 453 both OpenCL and dll; the compute target is ignored for pure python models. 476 454 477 455 If model1 is 'all', then all except the remaining models will be tested. … … 493 471 Run "nosetests sasmodels" on the command line to invoke it. 494 472 """ 495 loaders = ['dll'] 496 if use_opencl(): 497 loaders.append('opencl') 498 if use_cuda(): 499 loaders.append('cuda') 473 loaders = ['opencl', 'dll'] if use_opencl() else ['dll'] 500 474 tests = make_suite(loaders, ['all']) 501 475 def build_test(test): -
sasmodels/models/lib/gauss76.c
r74e9b5f r99b84ec 11 11 12 12 // Gaussians 13 constant double Gauss76Wt[76] ={13 constant double Gauss76Wt[76]={ 14 14 .00126779163408536, //0 15 15 .00294910295364247, … … 90 90 }; 91 91 92 constant double Gauss76Z[76] ={92 constant double Gauss76Z[76]={ 93 93 -.999505948362153, //0 94 94 -.997397786355355, -
sasmodels/models/lib/polevl.c
r74e9b5f r447e9aa 51 51 */ 52 52 53 static 54 double polevl( double x, pconstant double *coef, int N )53 double polevl( double x, constant double *coef, int N ); 54 double polevl( double x, constant double *coef, int N ) 55 55 { 56 56 … … 72 72 */ 73 73 74 static 75 double p1evl( double x, pconstant double *coef, int N )74 double p1evl( double x, constant double *coef, int N ); 75 double p1evl( double x, constant double *coef, int N ) 76 76 { 77 77 int i=0; -
sasmodels/models/lib/sas_J1.c
r74e9b5f r5181ccc 42 42 #if FLOAT_SIZE>4 43 43 //Cephes double pression function 44 double cephes_j1(double x); 44 45 45 46 constant double RPJ1[8] = { … … 105 106 0.0 }; 106 107 107 static108 108 double cephes_j1(double x) 109 109 { … … 155 155 #else 156 156 //Single precission version of cephes 157 float cephes_j1f(float x); 158 157 159 constant float JPJ1[8] = { 158 160 -4.878788132172128E-009, … … 188 190 }; 189 191 190 static191 192 float cephes_j1f(float xx) 192 193 { … … 239 240 240 241 //Finally J1c function that equals 2*J1(x)/x 241 static 242 double sas_2J1x_x(double x); 242 243 double sas_2J1x_x(double x) 243 244 {
Note: See TracChangeset
for help on using the changeset viewer.