00001 #ifndef OPENCL_UTILS_H 00002 #define OPENCL_UTILS_H 00003 00004 #include <CL/cl.h> 00005 00006 #include <fstream> 00007 00009 00010 #define oclCheckErrorEX(a, b, c) __oclCheckErrorEX(a, b, c, __FILE__ , __LINE__) 00011 #define oclCheckError(a, b) oclCheckErrorEX(a, b, 0) 00012 00013 extern "C" cl_context oclGetGlobalContext( ); 00014 extern "C" cl_command_queue oclGetGlobalQueue( ); 00015 00016 extern "C" void oclInit(); 00017 extern "C" void oclInitializeKernels(cl_context cxGPUContext, cl_command_queue cqCommandQueue); 00018 00019 extern "C" void oclShutdown(cl_context clContext, cl_command_queue clQueue); 00020 extern "C" void oclShutdownKernels(void); 00021 00022 extern "C" cl_int oclGetPlatformID(cl_platform_id* clSelectedPlatformID); 00023 00024 extern "C" cl_device_id oclGetFirstDev(cl_context cxGPUContext); 00025 00026 extern "C" char* oclFindFilePath(const char* filename, const char* executablePath); 00027 extern "C" char* oclLoadProgSource(const char* cFilename, const char* cPreamble, size_t* szFinalLength); 00028 extern "C" const char* oclErrorString(cl_int error); 00029 00030 extern "C" void oclGetProgBinary( cl_program cpProgram, cl_device_id cdDevice, char** binary, size_t* length); 00031 extern "C" void oclLogPtx(cl_program cpProgram, cl_device_id cdDevice, const char* cPtxFileName); 00032 extern "C" void oclLogBuildInfo(cl_program cpProgram, cl_device_id cdDevice); 00033 00034 inline void __oclCheckErrorEX(cl_int iSample, cl_int iReference, void (*pCleanup)(int), const char* cFile, const int iLine) 00035 { 00036 if (iReference != iSample) 00037 { 00038 iSample = (iSample == 0) ? -9999 : iSample; 00039 printf("\n !!! OpenCL Error # %i (%s) at line %i , in file %s !!!\n\n", iSample, oclErrorString(iSample), iLine, cFile); 00040 00041 if (pCleanup != NULL) { 00042 pCleanup(iSample); 00043 } else { 00044 exit(iSample); 00045 } 00046 } 00047 } 00048 00050 00051 inline cl_context dxGetDeviceContext( ) { return oclGetGlobalContext(); } 00052 inline cl_command_queue dxGetDeviceQueue( ) { return oclGetGlobalQueue(); } 00053 00054 inline void dxGlobalSync() { clFinish( dxGetDeviceQueue() ); } 00055 inline void dxInitDevice() { oclInit(); oclInitializeKernels(dxGetDeviceContext(), dxGetDeviceQueue()); } 00056 inline void dxShutdownDevice() { oclShutdown(dxGetDeviceContext(), dxGetDeviceQueue()); oclShutdownKernels(); } 00057 00059 00060 00061 #endif