Kernel *makeKernel( cl_device_id device, cl_context context, SolverKgen kernelGenerator, cl_program program, const SubproblemDim *dims, const PGranularity *pgran, const CLBLASKernExtra *extra, const char *buildOpts, cl_int *error) { cl_int err; char *source; ssize_t size; Kernel *kernel; char *log; #ifdef DEBUG_2 printf("Make kernel called\n"); printf("x : %d, y : %d, itemX: %d, itemY: %d\n", dims->x, dims->y, dims->itemX, dims->itemY); printf("PG : wgSize[0] : %d, wgSize[1] : %d, wfSize: %d\n", pgran->wgSize[0], pgran->wgSize[1], pgran->wfSize); #endif kernel = allocKernel(); if (kernel == NULL) { free(source); storeErrorCode(error, CL_OUT_OF_HOST_MEMORY); return NULL; } if (kernelGenerator) { size = kernelGenerator(NULL, 0, dims, pgran, (void*)extra); if (size < 0) { storeErrorCode(error, CL_OUT_OF_HOST_MEMORY); return NULL; } source = calloc(1, size); if (source == NULL) { storeErrorCode(error, CL_OUT_OF_HOST_MEMORY); return NULL; } if (kernelGenerator(source, size, dims, pgran, (void*)extra) != size) { free(source); storeErrorCode(error, CL_OUT_OF_HOST_MEMORY); return NULL; } log = allocBuildLog(); //#define DEBUG_2 #ifdef DEBUG_2 printf("Build Options used %s \n", buildOpts); printf("Source kernel used %s \n", source); #endif #undef DEBUG_2 kernel->program = buildClProgram(source, buildOpts, context, device, log, BUILD_LOG_SIZE, &err); if (err != CL_SUCCESS) { printBuildError(err, device, kernelGenerator, dims, pgran, extra, source, log); freeBuildLog(log); putKernel(NULL, kernel); free(source); storeErrorCode(error, err); return NULL; } else { // #define DEBUG_2 #ifdef DEBUG_2 printf("Kernel compilation succeeded\n"); #endif #undef DEBUG_2 } freeBuildLog(log); free(source); #if !defined(KEEP_CLBLAS_KERNEL_SOURCES) if (err == CL_SUCCESS) { err = dropProgramSource(&kernel->program, context, device); kernel->noSource = 1; } #endif /* !DUMP_CLBLAS_KERNELS */ if (err != CL_SUCCESS) { putKernel(NULL, kernel); storeErrorCode(error, err); return NULL; } } else { kernel->program = program; } kernel->extraSize = sizeof(CLBLASKernExtra); kernel->extra = calloc(1, kernel->extraSize); *(CLBLASKernExtra*)(kernel->extra) = *extra; kernel->dtor = extraDtor; storeErrorCode(error, CL_SUCCESS); return kernel; }
void OpenCL::printBuildError(const cl::Device& device, const cl::Program& program, const std::string& filename) { printBuildError(std::vector<cl::Device>(1, device), program, filename); }