/** * This file contains OpenCL definitions for the macros and functions needed for the * common compute framework. */ #pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable #ifdef SUPPORTS_64_BIT_ATOMICS #pragma OPENCL EXTENSION cl_khr_int64_base_atomics : enable #endif #define KERNEL __kernel #define DEVICE #define LOCAL __local #define LOCAL_ARG __local #define GLOBAL __global #define RESTRICT restrict #define LOCAL_ID get_local_id(0) #define LOCAL_SIZE get_local_size(0) #define GLOBAL_ID get_global_id(0) #define GLOBAL_SIZE get_global_size(0) #define GROUP_ID get_group_id(0) #define NUM_GROUPS get_num_groups(0) #define SYNC_THREADS barrier(CLK_LOCAL_MEM_FENCE+CLK_GLOBAL_MEM_FENCE); #define MEM_FENCE mem_fence(CLK_LOCAL_MEM_FENCE+CLK_GLOBAL_MEM_FENCE); #define ATOMIC_ADD(dest, value) atom_add(dest, value) typedef long mm_long; typedef unsigned long mm_ulong; #define make_short2(x...) ((short2) (x)) #define make_short3(x...) ((short3) (x)) #define make_short4(x...) ((short4) (x)) #define make_int2(x...) ((int2) (x)) #define make_int3(x...) ((int3) (x)) #define make_int4(x...) ((int4) (x)) #define make_float2(x...) ((float2) (x)) #define make_float3(x...) ((float3) (x)) #define make_float4(x...) ((float4) (x)) #define make_double2(x...) ((double2) (x)) #define make_double3(x...) ((double3) (x)) #define make_double4(x...) ((double4) (x)) #define trimTo3(v) (v).xyz // OpenCL has overloaded versions of standard math functions for single and double // precision arguments. CUDA has separate functions. To allow them to be called // consistently, we define the "single precision" functions to just be synonyms // for the standard ones. #define sqrtf(x) sqrt(x) #define rsqrtf(x) rsqrt(x) #define expf(x) exp(x) #define logf(x) log(x) #define powf(x) pow(x) #define cosf(x) cos(x) #define sinf(x) sin(x) #define tanf(x) tan(x) #define acosf(x) acos(x) #define asinf(x) asin(x) #define atanf(x) atan(x) #define atan2f(x, y) atan2(x, y) inline long realToFixedPoint(real x) { return (long) (x * 0x100000000); }