如何在Ubuntu上编译OpenCL



问题:什么是需要的头和驱动程序是需要的,我从哪里得到他们在ubuntu上使用gcc/g++编译开放CL ?


信息:一段时间以来,我一直在试图弄清楚如何在我的台式机上安装开放的CL,如果可能的话,我的上网本。有几个教程在那里,我已经尝试过,但似乎没有工作。而且,它们都只是一步一步地给出,没有真正解释为什么做什么,或者更糟糕的是,它们是特定于特定的IDE的,所以你必须学习IDE才能做任何事情。

我的台式机安装了nvidia GX465,上网本安装了集成显卡。我优先考虑的当然是我的台式机,上网本只是为了方便开发(既运行ubuntu 11.04,也将在11.10发布后运行)。有人能给我拼出到底需要什么来得到它,这样我就可以实际编译代码并让它运行。如果你能解释一下每件作品的作用,这样我就能理解它的重要性。

要在Linux下编译和运行OpenCL代码,您需要以下四个条件:

1)支持OpenCL的NVIDIA驱动程序。Ubuntu附带的驱动程序有些旧了,但应该还能用。除非你有明确的电流需求驱动程序,你应该坚持使用Ubuntu附带的那些。澄清一下,这些是通过受限驱动程序管理器安装的相同驱动程序。OpenCL库是随驱动程序一起发布的,所以只要运行OpenCL程序驱动程序就足够了。

2) CUDA工具包。这包括编译OpenCL代码所需的头文件。安装到默认位置。

3) GPU计算SDK(可选)。这包括各种NVIDIA特定的支持工具,以及OpenCL代码示例。

这三个项目都可以在http://developer.nvidia.com/cuda-toolkit-40上找到。

4) OpenCL c++绑定(可选)。奇怪的是,它们并不包含在CUDA工具包中,但如果你使用c++,它们可以使你的代码更可读。你可以从http://www.khronos.org/registry/cl/api/1.1/cl.hpp下载它们,然后把它放到/usr/local/cuda/include/cl和你的桌面。

一旦这些安装好了,你需要执行更多的步骤来编译和运行NVIDIA SDK之外的OpenCL。

1) CUDA工具包将包含OpenCL头文件(在http://www.khronos.org/registry/cl/中列出),它们可能位于目录/usr/local/CUDA/include/cl中。为了使这些头文件在系统范围内可用,你应该将这个目录链接到/usr/include/,这样它们就可以被访问为/usr/include/cl/[headerfilename]。您可以将/usr/local/cuda/include添加到C_INCLUDE_PATHCPLUS_INCLUDE_PATH环境变量中,而不是创建符号链接,但这只会持续到当前会话。

2)确保OpenCL库(libOpenCL.so)存在于/usr/lib中这应该是由驱动程序设置的,所以您不应该做任何事情。

你准备好写代码了。确保在任何C(++)程序中包含CL/cl.h(或CL/cl.hpp,如果你想使用c++版本的API),使OpenCL API调用。当你编译时,确保链接到OpenCL库(将-lOpenCL标志传递给gcc)。

就上网本而言,集成图形通常不支持OpenCL。理论上,AMD的APP加速支持在CPU上运行OpenCL,但目前还不清楚它是否真的有效。

Ubuntu 20.04 with NVIDIA Quadro M1200, Lenovo P51

软件集成比我上次尝试的好了很多,所以我将做一个更新。

首先,至少对于图形,我需要调整一些BIOS设置,如上所述,不确定是否需要OpenCL: https://askubuntu.com/questions/973605/ubuntu-17-10-boot-stuck-at-message-started-nvidia-persistence-daemon-after-ins/976578#976578

然后,我找到并安装最新可用的驱动程序:

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

也可以在

下搜索
software-properties-gtk
"附加驱动程序"中的

选项卡。

现在我可以编译并运行以下测试程序:

c

#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#define CL_TARGET_OPENCL_VERSION 220
#define CL_USE_DEPRECATED_OPENCL_1_2_APIS
#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上游

:

gcc -ggdb3  -O0 -Wall -Wextra -pthread -std=c11 
  -pedantic-errors -o main.out main.c -lm -pthread -lOpenCL
./main.out

指出:

  • 找到你的GPU模型:https://askubuntu.com/questions/72766/how-do-i-find-out-the-model-of-my-graphics-card
  • 测试驱动程序是否工作:https://askubuntu.com/questions/68028/how-do-i-check-if-ubuntu-is-using-my-nvidia-graphics-card
  • CUDA的类似答案:https://askubuntu.com/questions/917356/how-to-verify-cuda-installation-in-16-04/1215237#1215237

Ubuntu 15.10 with NVIDIA NVS 5400M, Lenovo T430

sudo apt-get install nvidia-352 nvidia-352-dev nvidia-prime nvidia-modprobe
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

然后使用标题作为:

#include <CL/cl.h>

和编译:

gcc -o main main.c -lOpenCL

指出:

  • 不安装nvidia-current包。它很老了。要么使用apt-cache search nvidia获取最新版本,要么使用software-properties-gtk"附加驱动程序";选项卡。

我真的建议升级到15.10来让这个工作:我以前从来没有管理过。

在Ubuntu 16.04中为我工作的东西

我已经安装了openCL:

SandyBridge CPU: CPU only

IvyBridge GPU

Nvidia GTX 950

安装包

OpenCL的通用ubuntu包

基本安装 sudo apt install ocl-icd-libopencl1 sudo apt install opencl-headers sudo apt install clinfo

允许编译OpenCL代码的包(我认为是1.2)

需要链接和编译 sudo apt install ocl-icd-opencl-dev

适用于Intel GT core

允许在Intel GT、IvyBridge及更高版本上运行openCL的包

sudo apt install beignet

适用于SandyBridge Intel CPU和可能的其他CPU

下载这个文件OpenCL™Runtime 16.1.1 for Intel®Core™和Intel®Xeon®processor for Ubuntu*(64位)在https://software.intel.com/en-us/articles/opencl-drivers latest_linux_SDK_release

安装将rpm转换为deb的软件包 sudo apt-get install -y rpm alien libnuma1

解压缩下载的文件 tar -xvf opencl_runtime_16.1.1_x64_ubuntu_6.4.0.25.tgz cd opencl_runtime_16.1.1_x64_ubuntu_6.4.0.25/rpm/ 将rpm文件转换为deb文件 fakeroot alien --to-deb opencl-1.2-base-6.4.0.25-1.x86_64.rpm fakeroot alien --to-deb opencl-1.2-intel-cpu-6.4.0.25-1.x86_64.rpm 安装.deb包 sudo dpkg -i opencl-1.2-base_6.4.0.25-2_amd64.deb sudo dpkg -i opencl-1.2-intel-cpu_6.4.0.25-2_amd64.deb 触摸本地配置文件 sudo touch /etc/ld.so.conf.d/intelOpenCL.conf 打开文件 sudo vim /etc/ld.so.conf.d/intelOpenCL.conf 加上

一行

/opt/英特尔/opencl - 1.2 6.4.0.25/lib64/clinfo

创建vendor目录并添加intel.icd sudo mkdir -p /etc/OpenCL/vendors sudo ln /opt/intel/opencl-1.2-6.4.0.25/etc/intel64.icd /etc/OpenCL/vendors/intel64.icd sudo ldconfig

测试是否有效

clinfo应该列出您的设备下载此文件

https://codeload.github.com/hpc12/tools/tar.gz/master

运行这段代码以确保一切正常 tar xzvf tools-master.tar.gz cd tools-master make ./print-devices ./cl-demo 1000 10 这应该在末尾打印出GOOD

<标题>的英伟达h1> 装nvidia驱动程序(我使用370),这应该包括所有的运行时驱动程序

我最近在linux上使用了类似的过程,在nvidia卡上设置OpenCL。

我走过的步骤:

1 -安装NVIDIA驱动。

2 -安装CUDA工具包-(按照指南中的步骤,有很多方法可以做到这一点,但我使用的是.deb安装程序,指南可以在这里找到:http://docs.nvidia.com/cuda/cuda-getting-started-guide-for-linux/)

3 -使用apt-get安装OpenCL头文件。命令:sudo apt-get install opencl-headers

使用:CL/opencl.h头,我能够使用gcc/g++和标志:-lOpenCL编译C/c++代码

步骤说明

1 -不言自明

2 - CUDA工具包也安装了OpenCL库(libOpencl.so),但没有头文件(至少在我的系统上没有)

3 -因此头文件可以用apt-get安装。头文件存储在/usr/include/cl目录

最新更新