12

Proprietary drivers 331.89 do not give me OpenCL. (tried both tested/updates) for a while I had version 304.123 that worked - except I wanted the current drivers, and now are unable to downgrade.

Anyway - I could downgrade by workaround, but I wish 331.89 worked.

I used "darktable -d opencl" as test alos added symbolic link to darktable, but that does not help with 331.89

user105939
  • 1,661

3 Answers3

12

I too was confounded by this perplexing problem until I found a series of forum posts bout Virtual Lighttable in which the participants do some debugging. It turns out that the NVIDIA drivers need a custom modprobe rule that is not installed by default with either nvidia-331 or the the opencl drivers. These rules are provided in the nvidia-modprobe package.

Here is a list of all of the packages you will need to get OpenCL working on Ubuntu 14.10 with NVIDIA drivers:

sudo apt-get install nvidia-331 nvidia-331-uvm nvidia-opencl-dev nvidia-modprobe

EDIT: In case anyone encounters a similar problem on Ubuntu 15.04 and the NVIDIA 346.59 drivers, the command to fix the issue is nearly identical:

sudo apt-get install nvidia-346 nvidia-346-uvm nvidia-opencl-dev nvidia-modprobe
  • On Linux mint I encounter this error when running the deviceQuery CUDA test program: optirun --bridge primus ./deviceQuery ./deviceQuery Starting...

    CUDA Device Query (Runtime API) version (CUDART static linking)

    cudaGetDeviceCount returned 38 -> no CUDA-capable device is detected Result = FAIL

    – user3728501 Oct 04 '15 at 09:59
3

Ubuntu 20.04 install

Things got much better now. Find available driver versions:

apt-cache search nvidia-driver

Install the latest one listed + opencl:

sudo apt install nvidia-driver-435 nvidia-opencl-dev

You can also search under:

software-properties-gtk

in the "Additional Drivers" tab for the latest driver.

Ubuntu 15.10 install

sudo apt-get install nvidia-352 nvidia-352-dev nvidia-prime nvidia-modprobe nvidia-opencl-dev
sudo ln -s /usr/include/nvidia-352/GL /usr/local/include
sudo ln -s /usr/lib/x86_64-linux-gnu/libOpenCL.so.1 /usr/local/lib/libOpenCL.so

Test it out

Compile and run:

gcc -o main main.c -lOpenCL
./main

Here's a minimal test program:

main.c

#include <assert.h>
#include <stdlib.h>
#include <stdio.h>

#include <CL/cl.h>

int main() { cl_command_queue command_queue; cl_context context; cl_device_id device; cl_int input = 1; cl_int kernel_result = 0; cl_kernel kernel; cl_mem buffer; cl_platform_id platform; cl_program program; const char source = "__kernel void increment(int in, __global int out) { out[0] = in + 1; }";

clGetPlatformIDs(1, &amp;platform, NULL);
clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, 1, &amp;device, NULL);
context = clCreateContext(NULL, 1, &amp;device, NULL, NULL, NULL);
command_queue = clCreateCommandQueue(context, device, 0, NULL);
buffer = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, sizeof(cl_int), NULL, NULL);
program = clCreateProgramWithSource(context, 1, &amp;source, NULL, NULL);
clBuildProgram(program, 1, &amp;device, &quot;&quot;, NULL, NULL);
kernel = clCreateKernel(program, &quot;increment&quot;, NULL);
clSetKernelArg(kernel, 0, sizeof(cl_int), &amp;input);
clSetKernelArg(kernel, 1, sizeof(cl_mem), &amp;buffer);
clEnqueueTask(command_queue, kernel, 0, NULL, NULL);
clFlush(command_queue);
clFinish(command_queue);
clEnqueueReadBuffer(command_queue, buffer, CL_TRUE, 0, sizeof (cl_int), &amp;kernel_result, 0, NULL, NULL);

assert(kernel_result == 2);
return EXIT_SUCCESS;

}

GitHub upstream.

Notes

I really recommend upgrading to 15.10 to get this to work: I had never managed before.

Tested on:

  • Lenovo ThinkPad T430 with NVIDIA NVS 5400M
  • Lenovo ThinkPad W540 with NVIDIA Quadro K1100M
  • Lenovo ThinkPad P51 with an NVIDIA Quadro M1200 + Ubuntu 21.10 + driver nvidia-driver-470

Related: https://stackoverflow.com/questions/7542808/how-to-compile-opencl-on-ubuntu/33483311#33483311

0

For Ubuntu 14.04 nvidia-modprobe messed up my system. But I realized that the nvidia-331-uvm is not activated from the start (god knows why). So let's activate it:

$ sudo modprobe nvidia-331-uvm
$ sudo mknod -m 666 /dev/nvidia-uvm c 249 0

And then:

$ sudo clinfo

Then you'll be able to use opencl even as a non-root user. Why it's like this is explained in the Virtual Lighttable mailing list.

Thus, I finally added the next lines in my /etc/rc.local file:

# begin opencl config
modprobe nvidia-331-uvm
mknod -m 666 /dev/nvidia-uvm c 249 0
clinfo
# end opencl config 

Then everything works smoothly ;)

silgon
  • 320
  • 4
  • 13