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.
This pull request resolves the oft-reported error:
This abort occurs after a
clBuildProgram()
failure inmakeGemmKernel()
. Inconveniently, the subsequent calls toclGetProgramBuildInfo()
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"
toclBuildProgram()
. 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 thatand 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.