簡體   English   中英

如何在 Ubuntu 上編譯 OpenCL?

[英]How to compile OpenCL on Ubuntu?

問題:需要什么頭文件和驅動程序,我從哪里得到它們以使用 gcc/g++ 在 ubuntu 上編譯開放 CL?


信息:一段時間以來,我一直在試圖弄清楚如何在我的桌面上安裝 open CL,如果可能的話,在我的上網本上安裝。 有幾個教程我已經嘗試過,但似乎都不起作用。 此外,它們都只是一步一步地給出,而沒有真正解釋為什么要這樣做,或者更糟糕的是,它們是特定於特定 IDE 的,因此您必須學習 IDE 才能做任何事情。

所以我的台式機中有一個 NVIDA 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 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) 確保 OpenCL 庫 (libOpenCL.so) 存在於 /usr/lib 中。 這應該由驅動程序設置到位,所以你不應該做任何事情。

您已准備好編寫代碼。 確保CL/cl.h OpenCL API 調用的任何 C(++) 程序中包含CL/cl.h (或CL/cl.hpp如果您想使用 API 的 C++ 版本)。 編譯時,確保鏈接到 OpenCL 庫(向 gcc 傳遞-lOpenCL標志)。

就您的上網本而言,集成顯卡通常不支持 OpenCL。 理論上, AMD 的 APP 加速支持在 CPU 上運行 OpenCL,但目前還不清楚它是否真的有效。

帶有 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

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

software-properties-gtk

在“其他驅動程序”選項卡中。

現在我可以編譯並運行以下測試程序:

主文件

#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

筆記:

帶有 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

然后使用標題為:

#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

IvyBridge GPU

英偉達 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 內核

在 Intel GT、IvyBridge 及更高版本上啟用 runnig openCL 的包

sudo apt install beignet

適用於 SandyBridge Intel CPU 和其他可能的 CPU

下載此文件 OpenCL™ Runtime 16.1.1 for Intel® Core™ 和 Intel® Xeon® Processors 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/下載的文件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 Touch 本地配置文件sudo touch /etc/ld.so.conf.d/intelOpenCL.conf打開文件sudo vim /etc/ld.so.conf.d/intelOpenCL.conf並添加行

/opt/intel/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

對於英偉達

安裝 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++ 和標志編譯 C/C++ 代碼:-lOpenCL

步驟說明

1 - 不言自明

2 - CUDA 工具包還安裝 OpenCL 庫 (libOpencl.so) 但不安裝頭文件(至少不在我的系統上)

3 - 因此可以使用 apt-get 安裝標頭。 頭文件存儲在 /usr/include/CL 目錄中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM