clMathLibraries / clBLAS

a software library containing BLAS functions written in OpenCL
Apache License 2.0
839 stars 240 forks source link

Do not pass the -cl-std option to kernel builds #342

Open zwets opened 5 years ago

zwets commented 5 years ago

This pull request resolves the oft-reported error:

OpenCL error -11 [...]
.../clblas-2.12/src/library/blas/xgemm.cc:244: void makeGemmKernel(_cl_kernel**, cl_command_queue, const char*, const char*, const unsigned char**, size_t*, const char*): Assertion `false' failed.

This abort occurs after a clBuildProgram() failure in makeGemmKernel(). Inconveniently, the subsequent calls to clGetProgramBuildInfo() return an empty build log, which made this bug hard to track down.

It turns out to be pretty simple: clBLAS passes build option -cl-std="CL1.2" to clBuildProgram(). According to its man page, this means that the OpenCL implementation will immediately fail the build if the target device is OpenCL 1.0 or 1.1. (Would've been nice if they'd at least report this in the build log ... .)

However, the man page also mentions that

If the -cl-std build option is not specified, the CL_DEVICE_OPENCL_C_VERSION is used to select the version of OpenCL C to be used when compiling the program for each device.

and since we have a handle to the device at that point, this is precisely what we want.

I've tested against multiple OpenCL 1.1 and 1.2 backends, and it works like a charm. Best thing is that I can finally run clBLAS (and ArrayFire) on my somewhat older Radeon GPU.

zwets commented 5 years ago

Created issue #343 to attach this PR to - yes I'm going the wrong way around :-)