如何在Ubuntu上编译OpenCL?

Nar*_*ser 11 ubuntu compilation opencl

问题:需要什么标题和驱动程序,我将在哪里使用gcc/g ++在ubuntu上编译开放CL?


信息:有一段时间我现在一直在试图找出如何在我的桌面上安装开放式CL以及如果可能的话我的上网本.有几个教程我已经尝试但似乎没有工作.此外,他们都只是一步一步地解释为什么对于特定的IDE特定的,甚至更糟的是,所以你必须学习IDE才能做任何事情.

所以我的桌面上有一台NVIDA GX465,上网本中有集成显卡.我的首要任务当然是我的桌面,上网本只是为了便于开发(两者都运行ubuntu 11.04,一出现就会运行11.10).有人可以告诉我究竟需要什么来获得它所以我可以实际编译代码并让它运行.如果你还能解释每件作品的作用,那么我就能理解它的重要性.

vir*_*nux 9

要在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 Toolkit中,但如果您使用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)确保/ usr/lib中存在OpenCL库(libOpenCL.so).这应该由司机设置,所以你不应该做任何事情.

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

就您的上网本而言,集成显卡通常不支持OpenCL.从理论上讲,AMD的APP Acceleration支持在CPU上运行OpenCL,但目前尚不清楚它是否真正有效.


Cir*_*四事件 6

带有 NVIDIA Quadro M1200、Lenovo P51 的 Ubuntu 20.04

自从我上次尝试以来,软件集成变得更好了,所以我会进行更新。

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

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

apt-cache search nvidia-driver
sudo apt install nvidia-driver-435 nvidia-opencl-dev
Run Code Online (Sandbox Code Playgroud)

您还可以在以下位置搜索:

software-properties-gtk
Run Code Online (Sandbox Code Playgroud)

在“其他驱动程序”选项卡中。

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

主文件

#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;
}
Run Code Online (Sandbox Code Playgroud)

GitHub 上游

和:

gcc -ggdb3  -O0 -Wall -Wextra -pthread -std=c11 \
  -pedantic-errors -o main.out main.c -lm -pthread -lOpenCL
./main.out
Run Code Online (Sandbox Code Playgroud)

笔记:

带有 NVIDIA NVS 5400M、Lenovo T430 的 Ubuntu 15.10

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
Run Code Online (Sandbox Code Playgroud)

然后将标题用作:

#include <CL/cl.h>
Run Code Online (Sandbox Code Playgroud)

并编译:

gcc -o main main.c -lOpenCL
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 不要安装nvidia-current软件包。它是旧的。要么apt-cache search nvidia获取最新的software-properties-gtk驱动程序,要么使用“其他驱动程序”选项卡。

我真的建议升级到 15.10 以使其正常工作:我以前从未管理过。


小智 5

Ubuntu 16.04 中对我有用的东西

\n\n

我已经安装了 openCL:

\n\n

SandyBridge CPU:仅CPU

\n\n

IvyBridge GPU

\n\n

英伟达 GTX 950

\n\n

安装包

\n\n

OpenCL 的通用 ubuntu 包

\n\n

基本安装\n\nsudo apt install ocl-icd-libopencl1\nsudo apt install opencl-headers\nsudo apt install clinfo\n

\n\n

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

\n\n

需要链接和编译\n\nsudo apt install ocl-icd-opencl-dev\n

\n\n

适用于Intel GT核心

\n\n

支持在 Intel GT、IvyBridge 及更高版本上运行 openCL 的软件包

\n\n

\nsudo apt install beignet\n

\n\n

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

\n\n

下载此文件\n适用于 Ubuntu* (64 位) 的 Intel\xc2\xae Core\xe2\x84\xa2 和 Intel\xc2\xae Xeon\xc2\xae 处理器的 OpenCL\xe2\x84\xa2 Runtime 16.1.1\nOn https://software.intel.com/en-us/articles/opencl-drivers#latest_linux_SDK_release

\n\n

安装用于将 rpm 转换为 deb 的软件包\n\nsudo apt-get install -y rpm alien libnuma1\n

\n\n

解压下载的文件\n \ntar -xvf opencl_runtime_16.1.1_x64_ubuntu_6.4.0.25.tgz\ncd opencl_runtime_16.1.1_x64_ubuntu_6.4.0.25/rpm/\n\n将 rpm 文件转换为 deb\n \nfakeroot alien --to-deb opencl-1.2-base-6.4.0.25-1.x86_64.rpm\nfakeroot alien --to-deb opencl-1.2-intel-cpu-6.4.0.25-1.x86_64.rpm\n\n安装 .deb 软件包\n \nsudo dpkg -i opencl-1.2-base_6.4.0.25-2_amd64.deb\nsudo dpkg -i opencl-1.2-intel-cpu_6.4.0.25-2_amd64.deb\n\n触摸本地配置文件\n \nsudo touch /etc/ld.so.conf.d/intelOpenCL.conf\n\n打开文件\n \nsudo vim /etc/ld.so.conf.d/intelOpenCL.conf\n\n并添加以下行

\n\n
\n

/opt/intel/opencl-1.2-6.4.0.25/lib64/clinfo

\n
\n\n

创建供应商目录并添加 intel.icd\n\nsudo mkdir -p /etc/OpenCL/vendors\nsudo ln /opt/intel/opencl-1.2-6.4.0.25/etc/intel64.icd /etc/OpenCL/vendors/intel64.icd\nsudo ldconfig\n

\n\n

测试这是否有效

\n\n

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

\n\n
\n

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

\n
\n\n

运行此代码以确保一切正常\n \ntar xzvf tools-master.tar.gz \ncd tools-master\nmake\n./print-devices\n./cl-demo 1000 10\n\n这应该最终打印出 GOOD

\n\n

对于英伟达

\n\n

安装 nvidia 驱动程序(我使用的是 370),这应该包括所有运行时驱动程序

\n