Ubuntu 20.04 LTS安装opencl

2023-05-16

CPU: AMD® Ryzen threadripper 3970x 32-core processor × 64 

内存: 220.1 GiB

图形: AMD® Radeon rx 580 2048sp

DiskCapacity: 3.8 TB

OS Name: Ubuntu 20.04 LTS

 

系统信息:

nickli@Earth:/opt/work$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 20.04 LTS
Release:	20.04
Codename:	focal
nickli@Earth:/opt/work$ cat /proc/version
Linux version 5.4.0-37-generic (buildd@lcy01-amd64-001) (gcc version 9.3.0 (Ubuntu 9.3.0-10ubuntu2)) #41-Ubuntu SMP Wed Jun 3 18:57:02 UTC 2020

本人所用显卡驱动的下载链接:

https://drivers.amd.com/drivers/linux/amdgpu-pro-20.20-1089974-ubuntu-20.04.tar.xz

请您根据您实际的情况下载对应的驱动

然后安装驱动:

$ mkdir amd-gpu
$ cd amd-gpu/
$ tar xvf /download/amdgpu-pro-20.20-1089974-ubuntu-20.04.tar.xz
$ cd amdgpu-pro-20.20-1089974-ubuntu-20.04/
$ sudo ./amdgpu-install

安装完成后需要重启电脑(祝您好运~)

然后安装clinfo工具查看显卡对OpenCL的支持情况:

$ sudo apt-get install clinfo
$ cliinfo
nickli@Earth:/opt/work$ clinfo 
Number of platforms                               1
  Platform Name                                   AMD Accelerated Parallel Processing
  Platform Vendor                                 Advanced Micro Devices, Inc.
  Platform Version                                OpenCL 2.1 AMD-APP (3110.6)
  Platform Profile                                FULL_PROFILE
  Platform Extensions                             cl_khr_icd cl_amd_event_callback cl_amd_offline_devices 
  Platform Host timer resolution                  1ns
  Platform Extensions function suffix             AMD

  Platform Name                                   AMD Accelerated Parallel Processing
Number of devices                                 1
  Device Name                                     Ellesmere
  Device Vendor                                   Advanced Micro Devices, Inc.
  Device Vendor ID                                0x1002
  Device Version                                  OpenCL 1.2 AMD-APP (3110.6)
  Driver Version                                  3110.6
  Device OpenCL C Version                         OpenCL C 1.2 
... ...

安装OpenCL的头文件和库:

nickli@Earth:/opt/work$ sudo apt-get install opencl-headers
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  guile-2.0-libs libgsoap-2.8.91 libm17n-0 libotf0 libqt5opengl5 libvncserver1 m17n-db virtualbox-dkms
... ...
Setting up opencl-clhpp-headers (2.1.0~~git51-gc5063c3-1) ...
Setting up opencl-c-headers (2.2~2019.08.06-g0d5f18c-1) ...
Setting up opencl-headers (2.2~2019.08.06-g0d5f18c-1) ...

nickli@Earth:/opt/work$ sudo apt install opencl-dev
[sudo] password for liyang: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Note, selecting 'ocl-icd-opencl-dev' instead of 'opencl-dev'
The following packages were automatically installed and are no longer required:
  guile-2.0-libs libgsoap-2.8.91 libm17n-0 libotf0 libqt5opengl5 libvncserver1 m17n-db virtualbox-dkms
... ...
Unpacking ocl-icd-opencl-dev:amd64 (2.2.11-1ubuntu1) ...
Setting up ocl-icd-opencl-dev:amd64 (2.2.11-1ubuntu1) ...

假设:

源码路径:/opt/work/cl/

主机源码文件名: cl.c, 同级别目录编写CMakeLists.txt文件:

cmake_minimum_required( VERSION 2.8.10 )

project( Example )

find_package( OpenCL REQUIRED )

include_directories( ${OPENCL_INCLUDE_DIR} )

add_executable( example cl.c )

target_link_libraries( example ${OPENCL_LIBRARIES} )

执行cmake命令生成Makefile(/opt/work/cl/下):

$ mkdir build
$ cd build
$ cmake -DOPENCL_INCLUDE_DIR=/usr/include -DOPENCL_LIBRARIES=/lib/x86_64-linux-gnu/libOpenCL.so ..

然后编写cl.c源程序:

#define PROGRAM_FILE "matvec.cl"
#define KERNEL_FUNC "matvec_mult"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

#ifdef MAC
#include <OpenCL/cl.h>
#else
#include <CL/cl.h>
#endif

void show_float4(float data[4]) {
    int i = 0;

    for(i = 0; i < 4; i++) {
        if(i != 3) {
            printf("%f, ", data[i]);
        } else {
            printf("%f", data[i]);
        }
    }
    printf("\n\n");
}

int main() {
    cl_platform_id platform;
    cl_device_id device;
    cl_context context;
    cl_command_queue queue;
    cl_int i, err;

    cl_program program;
    FILE *program_handle;
    char *program_buffer, *program_log;
    size_t program_size, log_size;
    cl_kernel kernel;
    size_t work_units_per_kernel;

    float mat[16], vec[4], result[4];
    float correct[4] = {0.0f, 0.0f, 0.0f, 0.0f};
    cl_mem mat_buff, vec_buff, res_buff;

    for(i = 0; i < 16; i++) {
        mat[i] = i * 2.0f;
    }

    for(i = 0; i < 4; i++) {
        vec[i] = i * 3.0f;
        correct[0] += mat[i]        * vec[i];
        correct[1] += mat[i + 4]    * vec[i];
        correct[2] += mat[i + 8]    * vec[i];
        correct[3] += mat[i + 12]   * vec[i];
    }
    clGetPlatformIDs(1, &platform, NULL);
    clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL);
    context = clCreateContext(NULL, 1, &device, NULL, NULL, &err);
    program_handle = fopen(PROGRAM_FILE, "r");
    fseek(program_handle, 0, SEEK_END);
    program_size = ftell(program_handle);
    rewind(program_handle);
    program_buffer = (char *)malloc(program_size + 1);
    program_buffer[program_size] = '\0';
    fread(program_buffer, sizeof(char), program_size, program_handle);
    fclose(program_handle);

    program = clCreateProgramWithSource(context, 1, (const char **)&program_buffer, &program_size, &err);
    free(program_buffer);

    clGetProgramInfo(program, CL_PROGRAM_SOURCE, 0, NULL, &program_size);
    program_buffer = (char *)malloc(program_size);
    clGetProgramInfo(program, CL_PROGRAM_SOURCE, program_size, program_buffer, 0);
    printf("Program Source: \n%s\n\n", program_buffer);
    free(program_buffer);

    err = clBuildProgram(program, 0, NULL, NULL, NULL, NULL);
    if(err < 0) {
        printf("CL_PROGRAM_BUILD_STATUS: %d\n", err);
        clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size);
        printf("log_size: %ld\n", log_size);
        program_log = (char *) malloc (log_size + 1);
        program_log[log_size] = '\0';
        clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, log_size, program_log, NULL);
        printf("Program log: %s\n", program_log);
        free(program_log);
        exit(1);
    }

    kernel = clCreateKernel(program, KERNEL_FUNC, &err);
    if(0 > err) {
        printf("clCreateKernel status: %d\n", (int32_t)err);
        exit(1);
    }
    queue = clCreateCommandQueue(context, device, 0, &err);
    if(0 > err) {
        printf("clCreateCommandQueue status: %d\n", (int32_t)err);
        exit(1);
    }
    mat_buff = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float) * 16, mat, &err);
    vec_buff = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float) * 4, vec, &err);
    res_buff = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(float) * 4, NULL, &err);

    clSetKernelArg(kernel, 0, sizeof(cl_mem), &mat_buff);
    clSetKernelArg(kernel, 1, sizeof(cl_mem), &vec_buff);
    clSetKernelArg(kernel, 2, sizeof(cl_mem), &res_buff);

    work_units_per_kernel = 4;
    clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &work_units_per_kernel, NULL, 0, NULL, NULL);
    clEnqueueReadBuffer(queue, res_buff, CL_TRUE, 0, sizeof(float) * 4, result, 0, NULL, NULL);
    printf("Result: \n");
    show_float4(result);
    printf("Correct: \n");
    show_float4(correct);

    if((result[0] == correct[0]) && (result[1] == correct[1])
            && (result[2] == correct[2]) && (result[3] == correct[3])) {
        printf("Matrix-vector multiplication successful.\n");
    }
    else {
        printf("Matrix-vector multiplication unsuccessful.\n");
    }

    clReleaseMemObject(mat_buff);
    clReleaseMemObject(vec_buff);
    clReleaseMemObject(res_buff);
    clReleaseKernel(kernel);
    clReleaseCommandQueue(queue);
    clReleaseProgram(program);
    clReleaseContext(context);

    return 0;
}

然后编译:

nickli@Earth:/opt/work/cl$ cd build/; make; cd ..
[ 50%] Building C object CMakeFiles/example.dir/cl.c.o
In file included from /usr/include/CL/cl.h:32,
                 from /opt/work/cl/cl.c:12:
/usr/include/CL/cl_version.h:34:9: note: #pragma message: cl_version.h: CL_TARGET_OPENCL_VERSION is not defined. Defaulting to 220 (OpenCL 2.2)
   34 | #pragma message("cl_version.h: CL_TARGET_OPENCL_VERSION is not defined. Defaulting to 220 (OpenCL 2.2)")
      |         ^~~~~~~
/opt/work/cl/cl.c: In function 'main':
/opt/work/cl/cl.c:100:5: warning: 'clCreateCommandQueue' is deprecated [-Wdeprecated-declarations]
  100 |     queue = clCreateCommandQueue(context, device, 0, &err);
      |     ^~~~~
In file included from /opt/work/cl/cl.c:12:
/usr/include/CL/cl.h:1781:1: note: declared here
 1781 | clCreateCommandQueue(cl_context                     context,
      | ^~~~~~~~~~~~~~~~~~~~
[100%] Linking C executable example
[100%] Built target example

执行:

nickli@Earth:/opt/work/cl$ ./build/example 
Program Source: 
__kernel void matvec_mult(  __global float4* matrix, 
                            __global float4* vector, 
                            __global float* result) {
    int i = get_global_id(0);
    result[i] = dot(matrix[i], vector[0]);
}

Result: 
84.000000, 228.000000, 372.000000, 516.000000

Correct: 
84.000000, 228.000000, 372.000000, 516.000000

Matrix-vector multiplication successful.

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubuntu 20.04 LTS安装opencl 的相关文章

  • 将 Docker 与具有 Node-gyp 依赖项的 Nodejs 一起使用

    我计划使用 Docker 部署 node js 应用程序 该应用程序有几个需要node gyp的依赖项 Node gyp 根据交付平台上的编译库构建这些模块 例如 canvas lwip qrcode 根据我的经验 这些构建可能高度依赖于操
  • 如何在 Emgu CV 项目中利用 OpenCL

    我是使用 Emgu CV 的新手 并开始创建小型示例项目 例如面部检测 眼睛检测等 如果我可以利用 OpenCL 来加速使用 GPU 的过程 那就太好了 否则 当我降低scaleFactor时 它会导致大量的CPU利用率 我怎样才能做到这一
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • 伪分布式模式下的 Hadoop。连接被拒绝

    P S 请不要将此标记为重复 Hi 我一直在尝试以伪分布式模式设置和运行 Hadoop 当我运行 start all sh 脚本时 我得到以下输出 starting namenode logging to home raveesh Hado
  • NMCLI 设备不可用

    我正在尝试在 ubuntu core 16 04 上配置带有蜂窝接口的新设备 我有 NMCLI 包在上面运行 在添加连接之前 我检查了接口 nmcli dev DEVICE TYPE STATE CONNECTION eth1 ethern
  • Ubuntu 12.04 上的 DeepDive 安装指南

    在拥有以后很多问题 https stackoverflow com questions 22469188 deepdive installation postgresql error安装深潜项目 http deepdive stanford
  • 如何在 Ubuntu VirtualBox 中运行 Meteor 应用程序并使用 Windows 主机上的编辑器进行编辑?

    我希望在运行 Ubuntu 的 virtualbox 来宾中运行一个用于开发目的的流星服务器 该项目将位于主机上的一个文件夹内 该文件夹将共享给来宾 该文件夹本身位于 Dropbox 文件夹内 这样我可以在多个虚拟机和工作站之间共享开发 但
  • ubuntu 16.04.1 LTS 启动 Android 模拟器时崩溃

    我已经尝试过 Android studio 上的 AVD 和 Genymotion 模拟器 我的 ubuntu 16 04 1 在启动 android 模拟器时崩溃 冻结 我的电脑内存是16G 在我于 2016 年 9 月 19 日安装了
  • PHP 无法打开流:是一个目录

    非常简单的 PHP 脚本 我在我亲自设置的 Ubuntu Web 服务器上的 EE 模板中运行 我知道这与权限有关 并且我已经将我尝试写入的目录的所有者更改为 Apache 用户 我得到的错误是 遇到 PHP 错误 严重性 警告 消息 fi
  • Ubuntu 上的 Vim:文本渲染错误,奇怪地重复和消失

    不久前我在 ubuntu 12 04 上安装了 vim 有时 当我在代码上运行光标 使用键盘 而不是鼠标 时 文本会消失 就好像渲染字符时出现问题一样 当我再次运行光标时 它通常会重新出现 这似乎是随机发生的 但通常足以让人恼火 为了更清楚
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • Ubuntu 上的 Python 2.7

    我是 Python 新手 正在 Linux 机器 Ubuntu 10 10 上工作 它正在运行 python 2 6 但我想运行 2 7 因为它有我想使用的功能 有人敦促我不要安装 2 7 并将其设置为我的默认 python 我的问题是 如
  • Tomcat从Eclipse和startup.sh启动

    奇怪的事情发生了 我可以从 Eclipse 和startup sh 启动Tomcat 从 Eclipse 运行我可以访问 localhost 8080 而从startup sh 运行时我不能 可能是什么问题呢 Ubuntu 11 10 在
  • Gearman,php 扩展问题:使用终端在 .. 中找不到类“GearmanWorker”,但可以在浏览器上使用

    我最近在 ubuntu 10 04 上安装了 gearman 并安装了它的 pecl 扩展 现在 当我在浏览器中运行一个 php 文件时 其中包含 client new GearmanWorker die var Dump client I
  • uWSGI 皇帝权限被拒绝,除非 root

    我尝试使用二进制文件本身的标志 uid www data gid www data 并将其设置在我的配置中 uid www data gid www data 但套接字总是由我正在使用的帐户生成 因此我从 nginx 收到权限被拒绝的错误
  • 如何重命名 .tar.gz 文件而不提取内容并在 UBUNTU 中创建新的 .tar.gz 文件?

    我有一个命令将创建一个新的 tar gz现有文件中的文件 sudo tar zcvf Existing tar gz New tar gz 该命令将创建一个新的New tar gz从现有的文件Existing tar gz file 谁能告
  • 在 Ubuntu 中与未编译的着色器链接

    我需要加载 glsl 来绘制一些东西 我的环境是Ubuntu 13 04 因此它不存在GLuint InitShader GLuint GLuint 这是我的对象创建 预链接步骤和链接的配置 不幸的是 它仍然出现错误 该错误与未编译的着色器
  • dpkg 错误:pycompile:未找到

    sudo apt get remove purge mysql server mysql client mysql common 当我尝试使用上述命令删除 mysql 时 出现以下错误 Reading package lists Done
  • OpenSSL 未签名证书静默

    遇到了麻烦 还有其他一些相关的帖子 但没有那么具体 我正在尝试为开发机器默默地生成证书 这些是我最初运行的命令 但被要求输入密码 openssl genrsa des3 out server key 1024 openssl req new
  • 如何在特定的Java版本上运行应用程序?

    如何运行具有特定 Java 版本的应用程序 我安装了三个 Java 版本 myuser mysystem sudo update alternatives config java There are 3 choices for the al

随机推荐

  • Vue3-减少应用部署打包体积的N种方式【持续更新】

    Vue3默认支持OptionsAPI和Composition API 混编的方式进行开发 xff0c 如果在新系统建设过程中完全抛弃了OptionsAPI方式 xff0c 可以使用vite定义全局变量来告诉Vue关闭对OptionsAPI的
  • Golang-简单-找不同

    题 xff1a 给定两个字符串 s 和 t xff0c 它们只包含小写字母 字符串 t 由字符串 s 随机重排 xff0c 然后在随机位置添加一个字母 请找出在 t 中被添加的字母 示例 1 xff1a 输入 xff1a s 61 abcd
  • Golang-简单-判断子序列

    题 xff1a 给定字符串 s 和 t xff0c 判断 s 是否为 t 的子序列 字符串的一个子序列是原始字符串删除一些 xff08 也可以不删除 xff09 字符而不改变剩余字符相对位置形成的新字符串 xff08 例如 xff0c 34
  • Android NDK开发基础

    文章目录 cmake语法基础cmake添加日志 xff1a cmake增加宏字符串比较cmake在build gradle中传递编译参数到cmake 通过javah生成native对应的c 43 43 头文件jni和java之间字符串的相互
  • iOS 使用科大讯飞技术实现语音转文字(语音听写)

    本文主要介绍的是利用科大讯飞技术实现语音转文字的功能 语音听写 首先 注册讯飞账号 xff0c 申请APPID 然后 下载科大讯飞SDK将开发工具包中lib目录下的iflyMSC framework添加到新建工程中 按下图添加 SDK 所需
  • Pycharm的汉化方法(pycharm改为中文版)

    很多开始接触python的朋友都会用到一款工具 xff1a pycharm xff0c 但默认是英文版的不知从何下手 xff0c 本文介绍两种不同的pycharm汉化方法 xff0c 将其变为中文版的界面 xff08 对于windows电脑
  • ubuntu14.04服务器版本搭建OpenStack+附上资源链接(稳成功的那种)

    ubuntu14 04服务器版本搭建OpenStack 43 附上资源链接 xff08 稳成功的那种 xff09 一 想必大家在搭建过程中 xff0c 遇见了很多的困难是吗 xff1f 没事 xff0c 今天小编就带你搭建属于你自己的Ope
  • 部署taokeeper

    环境 span class hljs title wget span https mirrors tuna tsinghua edu cn apache tomcat tomcat span class hljs number 7 span
  • 字符串排序(C语言实现)

    习题8 7 字符串排序 xff08 C语言实现 xff09 方法一 xff1a 选择排序 span class token macro property span class token directive keyword include
  • DVWA简介

    DVWA部署完成后通过默认账号密码 xff08 admin password xff09 进入欢迎界面 xff08 Home页面 xff09 xff0c 欢迎页面对DVWA平台做了简单的介绍 xff0c 如果需要对DVWA平台有一个更加深入
  • ios 导航控制器(navigationController)代码方式创建

    NavigationCOntroller 使用 BooL application UIApplication application didFinishLaunchingWithOptions NSDictionary launchOpti
  • ansible 简介和基本安装

    目录 ansible 简介和基本安装 自动化运维 运维的自动化发展历程运维工程师的职能划分自动化运维的应用场景企业实际应用场景分析 Dev开发环境测试环境发布环境生产环境 灰度环境 生产环境的一部分 常用的自动化运维工具ansible基本介
  • 使用OpenCV进行摄像机标定

    Cv照相机定标和三维重建 目录 隐藏 1 针孔相机模型和变形 2 照相机定标 2 1 ProjectPoints2 2 2 FindHomography 2 3 CalibrateCamera2 2 4 FindExtrinsicCamer
  • distributor之Interrupt Set-Enable Registers, GICD_ISENABLERn

    相对于distributor基地址偏移区间在0x100 0x17C 此寄存器就是把对应的中断使能 xff0c 使之可以被触发上报处理器 xff1b 此寄存器是写0无效的 xff0c 所以在写此寄存器时可以直接写 xff0c 不用再先读再或再
  • pip怎么安装到用户目录(不需要管理员权限),怎样安装指定python版本的包

    1 pip怎么安装到用户目录 xff08 不需要管理员权限 xff09 在用户的Home目录底下有个 pip目录 xff0c 即 pip xff0c 在这里面新建一个pip conf xff0c 里面写上 install install o
  • 时间机器测试

    这创意实在太搞 xff0c 不得不转载 xff1a 1 准备一张厚厚的 xff0c 防水的 xff0c 质量好的纸 xff0c 至少要100克的 xff0c 但表面不能太光滑 xff0c 防止墨迹脱落 2 在纸上用郑重的语气写上 xff0c
  • Android输入系统流程介

    Android输入系统的工作原理概括来说 xff0c 就是监控 dev input 下的所有设备节点 xff0c 当某个节点有数据可读时 xff0c 将数据读出并进行一系列的翻译加工 xff0c 然后在所有的窗口中寻找合适的事件接收者 xf
  • IntelliJ IDEA 恢复出厂设置

    引言 如果你不小心修改了设置 xff0c 导致出现问题且不知道解决办法 xff0c 可以尝试恢复出厂设置 IDEA 恢复出厂设置 IDEA 2021 之后 xff0c 在顶部工具栏 xff0c 选择 File Manage IDE Sett
  • Ozone调试

    SEGGER Ozone调试器使用攻略 xff01
  • Ubuntu 20.04 LTS安装opencl

    CPU AMD Ryzen threadripper 3970x 32 core processor 64 内存 220 1 GiB 图形 AMD Radeon rx 580 2048sp DiskCapacity 3 8 TB OS Na