comile command: /opt/intel/bin/icpc -g -o test -I/opt/intel/opencl-sdk/include -L/opt/intel/opencl/lib64 -lOpenCL *.cpp run command: ./test test.cl -debug output: CL_PLATFORM_NAME: Intel(R) OpenCL CL_PLATFORM_VERSION: OpenCL 1.2 LINUX run command: ./test test.ir output: CL_PLATFORM_NAME: Intel(R) OpenCL CL_PLATFORM_VERSION: OpenCL 1.2 LINUX Error CL_INVALID_PROGRAM in oclLogBuildInfo Call !!! // oclTest.cpp // #include<stdio.h> #include <stdlib.h> #include <memory.h> #include <string.h> // All OpenCL headers #if defined (__APPLE__) || defined(MACOSX) #include <OpenCL/opencl.h> #else #include <CL/opencl.h> #endif #define VENDOR_INTEL "Intel(R)" cl_int oclGetPlatformID(cl_platform_id* clSelectedPlatformID) { char chBuffer[1024]; cl_uint num_platforms; cl_platform_id* clPlatformIDs; cl_int ciErrNum; *clSelectedPlatformID = NULL; // Get OpenCL platform count ciErrNum = clGetPlatformIDs (0, NULL, &num_platforms); if (ciErrNum != CL_SUCCESS) { printf(" Error %i in clGetPlatformIDs Call !!!\n\n", ciErrNum); return -1000; } else { if(num_platforms == 0) { printf("No OpenCL platform found!\n\n"); return -2000; } else { // if there's a platform or more, make space for ID's if ((clPlatformIDs = (cl_platform_id*)malloc(num_platforms * sizeof(cl_platform_id))) == NULL) { printf("Failed to allocate memory for cl_platform ID's!\n\n"); return -3000; } // get platform info for each platform and trap the NVIDIA platform if found ciErrNum = clGetPlatformIDs (num_platforms, clPlatformIDs, NULL); for(cl_uint i = 0; i < num_platforms; ++i) { ciErrNum = clGetPlatformInfo (clPlatformIDs[i], CL_PLATFORM_NAME, 1024, &chBuffer, NULL); if(ciErrNum == CL_SUCCESS) { if(strstr(chBuffer, VENDOR_INTEL) != NULL) { *clSelectedPlatformID = clPlatformIDs[i]; break; } } } // default to zeroeth platform if NVIDIA not found if(*clSelectedPlatformID == NULL) { printf("WARNING: NVIDIA OpenCL platform not found - defaulting to first platform!\n\n"); *clSelectedPlatformID = clPlatformIDs[0]; } free(clPlatformIDs); } } return CL_SUCCESS; } char* oclLoadProgSource(const char* cFilename, size_t* szFinalLength) { // locals FILE* pFileStream = NULL; size_t szSourceLength; // open the OpenCL source code file #ifdef _WIN32 // Windows version if(fopen_s(&pFileStream, cFilename, "rb") != 0) { return NULL; } #else // Linux version pFileStream = fopen(cFilename, "rb"); if(pFileStream == 0) { return NULL; } #endif // get the length of the source code fseek(pFileStream, 0, SEEK_END); szSourceLength = ftell(pFileStream); fseek(pFileStream, 0, SEEK_SET); // allocate a buffer for the source code string and read it in char* cSourceString = (char *)malloc(szSourceLength + 1); if (fread((cSourceString), szSourceLength, 1, pFileStream) != 1) { fclose(pFileStream); free(cSourceString); return 0; } // close the file and return the total length of the combined (preamble + source) string fclose(pFileStream); if(szFinalLength != 0) { *szFinalLength = szSourceLength ; } cSourceString[szSourceLength] = '\0'; return cSourceString; } const char* oclErrorString(cl_int error) { static const char* errorString[] = { "CL_SUCCESS","CL_DEVICE_NOT_FOUND","CL_DEVICE_NOT_AVAILABLE","CL_COMPILER_NOT_AVAILABLE","CL_MEM_OBJECT_ALLOCATION_FAILURE","CL_OUT_OF_RESOURCES","CL_OUT_OF_HOST_MEMORY","CL_PROFILING_INFO_NOT_AVAILABLE","CL_MEM_COPY_OVERLAP","CL_IMAGE_FORMAT_MISMATCH","CL_IMAGE_FORMAT_NOT_SUPPORTED","CL_BUILD_PROGRAM_FAILURE","CL_MAP_FAILURE","","","","","","","","","","","","","","","","","","CL_INVALID_VALUE","CL_INVALID_DEVICE_TYPE","CL_INVALID_PLATFORM","CL_INVALID_DEVICE","CL_INVALID_CONTEXT","CL_INVALID_QUEUE_PROPERTIES","CL_INVALID_COMMAND_QUEUE","CL_INVALID_HOST_PTR","CL_INVALID_MEM_OBJECT","CL_INVALID_IMAGE_FORMAT_DESCRIPTOR","CL_INVALID_IMAGE_SIZE","CL_INVALID_SAMPLER","CL_INVALID_BINARY","CL_INVALID_BUILD_OPTIONS","CL_INVALID_PROGRAM","CL_INVALID_PROGRAM_EXECUTABLE","CL_INVALID_KERNEL_NAME","CL_INVALID_KERNEL_DEFINITION","CL_INVALID_KERNEL","CL_INVALID_ARG_INDEX","CL_INVALID_ARG_VALUE","CL_INVALID_ARG_SIZE","CL_INVALID_KERNEL_ARGS","CL_INVALID_WORK_DIMENSION","CL_INVALID_WORK_GROUP_SIZE","CL_INVALID_WORK_ITEM_SIZE","CL_INVALID_GLOBAL_OFFSET","CL_INVALID_EVENT_WAIT_LIST","CL_INVALID_EVENT","CL_INVALID_OPERATION","CL_INVALID_GL_OBJECT","CL_INVALID_BUFFER_SIZE","CL_INVALID_MIP_LEVEL","CL_INVALID_GLOBAL_WORK_SIZE", }; const int errorCount = sizeof(errorString) / sizeof(errorString[0]); const int index = -error; return (index >= 0 && index < errorCount) ? errorString[index] : "Unspecified Error"; } #define HDASHLINE "-----------------------------------------------------------\n" void oclLogBuildInfo(cl_program cpProgram, cl_device_id cdDevice) { // write out the build log and ptx, then exit char cBuildLog[10240]={0}; cl_int ciErrNum =clGetProgramBuildInfo(cpProgram, cdDevice, CL_PROGRAM_BUILD_LOG, sizeof(cBuildLog), cBuildLog, NULL ); if(ciErrNum!=CL_SUCCESS) printf(" Error %s in oclLogBuildInfo Call !!!\n\n", oclErrorString(ciErrNum)); else { printf("\n%s\nBuild Log:\n%s\n%s\n", HDASHLINE, cBuildLog, HDASHLINE); FILE *stream = fopen( "BuildInfo.log", "w" ); if (stream==NULL) { return; } fprintf( stream, "%s", cBuildLog); fclose( stream ); } } int main(int argc, char** argvs) { cl_platform_id clSelectedPlatformID=NULL; char *pOclSource=NULL; char cBuffer[1024]; cl_uint num_platforms; cl_uint ciDeviceCount; cl_platform_id* clPlatformIDs; cl_int ciErrNum; cl_device_id devices[8]; cl_context contexts[8]; cl_program programs[8]; cl_command_queue commandQueues[8]; size_t srcLen=0; pOclSource=oclLoadProgSource(argvs[1],&srcLen); ciErrNum = oclGetPlatformID (&clSelectedPlatformID); ciErrNum = clGetPlatformInfo (clSelectedPlatformID, CL_PLATFORM_NAME, sizeof(cBuffer), cBuffer, NULL); if (ciErrNum == CL_SUCCESS) printf(" CL_PLATFORM_NAME: \t%s\n", cBuffer); ciErrNum = clGetPlatformInfo (clSelectedPlatformID, CL_PLATFORM_VERSION, sizeof(cBuffer), cBuffer, NULL); if (ciErrNum == CL_SUCCESS) { printf(" CL_PLATFORM_VERSION: \t%s\n", cBuffer); } ciErrNum = clGetDeviceIDs (clSelectedPlatformID, CL_DEVICE_TYPE_ACCELERATOR|CL_DEVICE_TYPE_GPU, 0, NULL, &ciDeviceCount); ciErrNum = clGetDeviceIDs (clSelectedPlatformID, CL_DEVICE_TYPE_ACCELERATOR|CL_DEVICE_TYPE_GPU, ciDeviceCount, devices, &ciDeviceCount); for(unsigned int i = 0; i < ciDeviceCount; ++i ) { contexts[i] = clCreateContext(0, 1, &devices[i], NULL, NULL, &ciErrNum); if (ciErrNum != CL_SUCCESS) { printf("Error %s in clCreateContext call !!!\n\n", oclErrorString(ciErrNum)); break; } commandQueues[i]=clCreateCommandQueue(contexts[i],devices[i],0,&ciErrNum); if (ciErrNum != CL_SUCCESS) { printf("Error %s in clCreateCommandQueue call !!!\n\n", oclErrorString(ciErrNum)); break; } if((argc>2)&&(memcmp(argvs[2],"-debug",strlen("-debug"))==0)) { programs[i]=clCreateProgramWithSource(contexts[i],1,(const char**)&pOclSource,&srcLen,&ciErrNum); if (ciErrNum != CL_SUCCESS) { printf("Error %s in clCreateProgramWithSource call !!!\n\n", oclErrorString(ciErrNum)); break; } ciErrNum=clBuildProgram(programs[i],1,&(devices[i]),NULL,NULL,NULL); if (ciErrNum != CL_SUCCESS) { printf("Error %s in clBuildProgram call !!!\n\n", oclErrorString(ciErrNum)); oclLogBuildInfo(programs[i],devices[i]); break; } size_t binary_size=0; ciErrNum=clGetProgramInfo(programs[i],CL_PROGRAM_BINARY_SIZES,sizeof(size_t),&binary_size,NULL); binary_size++; char *binary=new char[binary_size]; memset(binary,0,binary_size); ciErrNum=clGetProgramInfo(programs[i],CL_PROGRAM_BINARIES,sizeof(size_t),&binary,NULL); char filename[256]="test.ir"; FILE *fp=fopen(filename,"wb"); fwrite(binary,1,binary_size,fp); fclose(fp); delete binary; } else { programs[i]=clCreateProgramWithBinary(contexts[i],1,&devices[i],&srcLen,(const unsigned char**)&pOclSource,&ciErrNum,NULL); if (ciErrNum != CL_SUCCESS) { printf("Error %s in clCreateProgramWithBinary call !!!\n\n", oclErrorString(ciErrNum)); break; } ciErrNum=clBuildProgram(programs[i],1,&(devices[i]),NULL,NULL,NULL); if (ciErrNum != CL_SUCCESS) { oclLogBuildInfo(programs[i],devices[i]); break; } } //#endif printf(" ---------------------------------\n"); //clGetDeviceInfo(devices[i], CL_DEVICE_NAME, sizeof(oclDevInfo.deviceName), &oclDevInfo.deviceName, NULL); //printf(" Device: %s\n", deviceName); printf(" ---------------------------------\n"); //oclPrintDevInfo(devices[i]); } return 0; }