如何使 OpenCL 在 14.10 + Nvidia 331.89 驱动程序上运行?

如何使 OpenCL 在 14.10 + Nvidia 331.89 驱动程序上运行?

专有驱动程序 331.89 没有给我 OpenCL。(尝试了测试/更新)有一段时间我使用 304.123 版本 - 但我想要当前的驱动程序,现在无法降级。

无论如何 - 我可以通过变通方法降级,但我希望 331.89 能够起作用。

我使用“darktable -d opencl”作为测试,并添加了指向 darktable 的符号链接,但这对 331.89 没有帮助

答案1

我也被这个令人困惑的问题所困扰,直到我发现了一系列关于虚拟光桌的论坛帖子参与者在其中进行了一些调试。事实证明,NVIDIA 驱动程序需要一个自定义 modprobe 规则,该规则在默认情况下不会随nvidia-331opencl 驱动程序一起安装。这些规则在包中提供nvidia-modprobe

以下是在 Ubuntu 14.10 上使用 NVIDIA 驱动程序运行 OpenCL 所需的所有软件包的列表:

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

编辑:如果有人在 Ubuntu 15.04 和 NVIDIA 346.59 驱动程序上遇到类似问题,修复该问题的命令几乎相同:

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

答案2

Ubuntu 20.04 安装

现在情况好多了。查找可用的驱动程序版本:

apt-cache search nvidia-driver

安装列出的最新一个+ opencl:

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

您还可以搜索:

software-properties-gtk

在“附加驱动程序”选项卡中获取最新的驱动程序。

Ubuntu 15.10 安装

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

测试一下

编译并运行:

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

这是一个最小的测试程序:

主程序

#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, &platform, NULL);
    clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, 1, &device, NULL);
    context = clCreateContext(NULL, 1, &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, &source, NULL, NULL);
    clBuildProgram(program, 1, &device, "", NULL, NULL);
    kernel = clCreateKernel(program, "increment", NULL);
    clSetKernelArg(kernel, 0, sizeof(cl_int), &input);
    clSetKernelArg(kernel, 1, sizeof(cl_mem), &buffer);
    clEnqueueTask(command_queue, kernel, 0, NULL, NULL);
    clFlush(command_queue);
    clFinish(command_queue);
    clEnqueueReadBuffer(command_queue, buffer, CL_TRUE, 0, sizeof (cl_int), &kernel_result, 0, NULL, NULL);

    assert(kernel_result == 2);
    return EXIT_SUCCESS;
}

GitHub 上游

笔记

我真的建议升级到 15.10 来实现这个功能:我以前从来没有这样做过。

已测试:

  • 联想 ThinkPad T430 配备 NVIDIA NVS 5400M
  • 联想 ThinkPad W540 配备 NVIDIA Quadro K1100M
  • 联想 ThinkPad P51 配备 NVIDIA Quadro M1200 + Ubuntu 21.10 + 驱动程序nvidia-driver-470

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

答案3

对于 Ubuntu 14.04 nvidia-modprobe 弄乱了我的系统。但我意识到NVIDIA-331-UVM NVIDIA-331-UVM从一开始就没有被激活(天知道为什么)。所以让我们激活它:

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

进而:

$ sudo clinfo

然后,即使作为非 root 用户,您也可以使用 opencl。为什么会这样,请参阅虚拟灯光桌邮件列表

因此,我最终在文件中添加了下几行/etc/rc.local

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

然后一切都顺利进行 ;)

相关内容