From d18d55649f12f1996913699c975bb837b5b09c90 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Thu, 26 Jan 2012 20:39:35 +1100 Subject: [PATCH] Do not attempt to build the program that becomes the kernel twice. This could have been leading to failures on initialising cl. --- ocl.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/ocl.c b/ocl.c index 1811a52e..28d5a871 100644 --- a/ocl.c +++ b/ocl.c @@ -185,7 +185,7 @@ void patch_opcodes(char *w, unsigned remaining) _clState *initCl(unsigned int gpu, char *name, size_t nameSize) { - bool patchbfi = false; + bool patchbfi = false, prog_built = false; cl_int status = 0; unsigned int i; @@ -526,6 +526,8 @@ build: return NULL; } + prog_built = true; + status = clGetProgramInfo( clState->program, CL_PROGRAM_BINARY_SIZES, sizeof(size_t)*numDevices, binary_sizes, NULL ); if (unlikely(status != CL_SUCCESS)) { applog(LOG_ERR, "Error: Getting program info CL_PROGRAM_BINARY_SIZES. (clGetPlatformInfo)"); @@ -624,17 +626,19 @@ built: applog(LOG_INFO, "Initialising kernel %s with%s BFI_INT, %d vectors and worksize %d", filename, patchbfi ? "" : "out", clState->preferred_vwidth, clState->work_size); - /* create a cl program executable for all the devices specified */ - status = clBuildProgram(clState->program, 1, &devices[gpu], NULL, NULL, NULL); - if (status != CL_SUCCESS) { - applog(LOG_ERR, "Error: Building Program (clBuildProgram)"); - size_t logSize; - status = clGetProgramBuildInfo(clState->program, devices[gpu], CL_PROGRAM_BUILD_LOG, 0, NULL, &logSize); + if (!prog_built) { + /* create a cl program executable for all the devices specified */ + status = clBuildProgram(clState->program, 1, &devices[gpu], NULL, NULL, NULL); + if (status != CL_SUCCESS) { + applog(LOG_ERR, "Error: Building Program (clBuildProgram)"); + size_t logSize; + status = clGetProgramBuildInfo(clState->program, devices[gpu], CL_PROGRAM_BUILD_LOG, 0, NULL, &logSize); - char *log = malloc(logSize); - status = clGetProgramBuildInfo(clState->program, devices[gpu], CL_PROGRAM_BUILD_LOG, logSize, log, NULL); - applog(LOG_INFO, "%s", log); - return NULL; + char *log = malloc(logSize); + status = clGetProgramBuildInfo(clState->program, devices[gpu], CL_PROGRAM_BUILD_LOG, logSize, log, NULL); + applog(LOG_INFO, "%s", log); + return NULL; + } } /* get a kernel object handle for a kernel with the given name */