问题:什么是需要的头和驱动程序是需要的,我从哪里得到他们在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_PATH
和CPLUS_INCLUDE_PATH
环境变量中,而不是创建符号链接,但这只会持续到当前会话。
你准备好写代码了。确保在任何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
我最近在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目录