Ubuntu 安装 CUDA 与 OPENCL

2023-09-20 15:58:10

        前言:最近需要做一些GPU并行计算,因而入坑CUDA和OPENCL,两者都有用到一些,刚好有点时间,同时记录一些学习过程,排掉一些坑,这篇是环境安装篇,基本跟着走就没什么问题,环境:ubuntu18.04 / ubuntu20.04 显卡:Nvidia

一、CUDA安装

        1.查看电脑是否识别GPU
lspci | grep -i nvidia

在这里插入图片描述

        2.查看电脑可以安装的显卡驱动版本
  ubuntu-drivers devices

在这里插入图片描述

        3.安装显卡驱动,选择上图的recommended
sudo apt install nvidia-driver-XXX
reboot #重启
        4.查看显卡信息
nvidia-smi

在这里插入图片描述

        5.安装CUDA

        到nivida官网下载自己可安装的版本

在这里插入图片描述

        复制Base Installer的执行代码,下载脚本(3个多G,可能有点久)

wget https://developer.download.nvidia.com/compute/cuda/11.4.0/local_installers/cuda_11.4.0_470.42.01_linux.run #选择自己的版本

        运行脚本进行安装cuda库

sudo sh cuda_11.4.0_470.42.01_linux.run

        在弹出的安装界面中选“continue”,如果选了会跳出安装,就说明安装失败,给了失败日志的路径,可以自己查看原因。
在这里插入图片描述

        进入下一步,输入accept

在这里插入图片描述

        把Driver选项的X去掉,不然它会再给你装一次驱动,会冲突,报错。然后选择Install

在这里插入图片描述

        等待安装,没什么问题就成功了。

        6.配置环境变量
gedit ~/.bashrc

        最后一行增加

export PATH=$PATH:/usr/local/cuda/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda

        注意查看自己的cuda真是安装路径

        7.检查是否安装成功

        重新打开终端

nvcc -V

在这里插入图片描述

        8.添加cuda lib 路径

        注意自己的版本号

sudo echo '/usr/local/cuda-11.4/lib64/' >> /etc/ld.so.conf
sudo ldconfig

        CUDA安装成功之后会在终端当前所在目录库生成一个NVIDIA_CUDA-11.4_Samples的编程例子的文件夹,可以用来测试。直接进去目录里面make就行。

二、OPENCL安装

        1.安装

        其实CUDA安装是包含了OPENCL的,但是你要使用OPENCL还需要配置一下。

        也可以单独安装头文件和库

sudo apt install opencl-headers 
sudo apt install ocl-icd-libopencl1 
sudo apt install ocl-icd-opencl-dev
sudo apt install clinfo
#sudo apt install intel-opencl-icd  #Install NEO OpenCL runtime for Intel GPU

        查看电脑当前安装信息

clinfo

在这里插入图片描述

        基本OK,接下来就可以愉快的写代码了。

        2.测试opencl
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
 
#ifdef MAC  
#include <OpenCL/cl.h>  
#else  
#include <CL/cl.h>  
#endif  
 
int main() {  
 
    /* Host data structures */  
    cl_platform_id *platforms;  
    //每一个cl_platform_id 结构表示一个在主机上的OpenCL执行平台,就是指电脑中支持OpenCL的硬件,如nvidia显卡,intel CPU和显卡,AMD显卡和CPU等  
    cl_uint num_platforms;  
    cl_int i, err, platform_index = -1;  
 
    /* Extension data */  
    char* ext_data;                           
    size_t ext_size;     
    const char icd_ext[] = "cl_khr_icd";  
 
    //要使platform工作,需要两个步骤。1 需要为cl_platform_id结构分配内存空间。2 需要调用clGetPlatformIDs初始化这些数据结构。一般还需要步骤0:询问主机上有多少platforms  
 
    /* Find number of platforms */  
    //返回值如果为-1就说明调用函数失败,如果为0标明成功  
    //第二个参数为NULL代表要咨询主机上有多少个platform,并使用num_platforms取得实际flatform数量。  
    //第一个参数为1,代表我们需要取最多1个platform。可以改为任意大如:INT_MAX整数最大值。但是据说0,否则会报错,实际测试好像不会报错。下面是步骤0:询问主机有多少platforms  
    err = clGetPlatformIDs(5, NULL, &num_platforms);          
    if(err < 0) {          
        perror("Couldn't find any platforms.");           
        exit(1);                              
    }                                     
 
    printf("I have platforms: %d\n", num_platforms); //本人计算机上显示为2,有intel和nvidia两个平台  
 
    /* Access all installed platforms */  
    //步骤1 创建cl_platform_id,并分配空间  
    platforms = (cl_platform_id*)                     
        malloc(sizeof(cl_platform_id) * num_platforms);   
    //步骤2 第二个参数用指针platforms存储platform  
    clGetPlatformIDs(num_platforms, platforms, NULL);         
 
    /* Find extensions of all platforms */  
    //获取额外的平台信息。上面已经取得了平台id了,那么就可以进一步获取更加详细的信息了。  
    //一个for循环获取所有的主机上的platforms信息  
    for(i=0; i<num_platforms; i++)   
    {  
        /* Find size of extension data */  
        //也是和前面一样,先设置第三和第四个参数为0和NULL,然后就可以用第五个参数ext_size获取额外信息的长度了。  
        err = clGetPlatformInfo(platforms[i],             
            CL_PLATFORM_EXTENSIONS, 0, NULL, &ext_size);      
        if(err < 0)   
        {  
            perror("Couldn't read extension data.");              
            exit(1);  
        }     
 
        printf("The size of extension data is: %d\n", (int)ext_size);//我的计算机显示224.  
 
        /* Access extension data */    
        //这里的ext_data相当于一个缓存,存储相关信息。  
        ext_data = (char*)malloc(ext_size);   
        //这个函数就是获取相关信息的函数,第二个参数指明了需要什么样的信息,如这里的CL_PLATFORM_EXTENSIONS表示是opencl支持的扩展功能信息。我计算机输出一大串,机器比较新(专门为了学图形学而购置的电脑),支持的东西比较多。  
        clGetPlatformInfo(platforms[i], CL_PLATFORM_EXTENSIONS,       
            ext_size, ext_data, NULL);                
        printf("Platform %d supports extensions: %s\n", i, ext_data);  
 
        //这里是输出生产商的名字,比如我显卡信息是:NVIDIA CUDA  
        char *name = (char*)malloc(ext_size);  
        clGetPlatformInfo(platforms[i], CL_PLATFORM_NAME,     
            ext_size, name, NULL);                
        printf("Platform %d name: %s\n", i, name);  
 
        //这里是供应商信息,我显卡信息:NVIDIA Corporation  
        char *vendor = (char*)malloc(ext_size);  
        clGetPlatformInfo(platforms[i], CL_PLATFORM_VENDOR,       
            ext_size, vendor, NULL);                  
        printf("Platform %d vendor: %s\n", i, vendor);  
 
        //最高支持的OpenCL版本,本机显示:OpenCL1.1 CUDA 4.2.1  
        char *version = (char*)malloc(ext_size);  
        clGetPlatformInfo(platforms[i], CL_PLATFORM_VERSION,      
            ext_size, version, NULL);                 
        printf("Platform %d version: %s\n", i, version);  
 
        //这个只有两个值:full profile 和 embeded profile  
        char *profile = (char*)malloc(ext_size);  
        clGetPlatformInfo(platforms[i], CL_PLATFORM_PROFILE,      
            ext_size, profile, NULL);                 
        printf("Platform %d full profile or embeded profile?: %s\n", i, profile);  
 
        /* Look for ICD extension */     
        //如果支持ICD这一扩展功能的platform,输出显示,本机的Intel和Nvidia都支持这一扩展功能  
        if(strstr(ext_data, icd_ext) != NULL)   
            platform_index = i;  
        //std::cout<<"Platform_index = "<<platform_index<<std::endl;  
        printf("Platform_index is: %d\n", platform_index);  
        /* Display whether ICD extension is supported */  
        if(platform_index > -1)  
            printf("Platform %d supports the %s extension.\n",   
            platform_index, icd_ext);  
 
 
        //释放空间  
        free(ext_data);  
        free(name);  
        free(vendor);  
        free(version);  
        free(profile);  
    }  
 
    if(platform_index <= -1)  
        printf("No platforms support the %s extension.\n", icd_ext);  
 
    /* Deallocate resources */  
    free(platforms);  
    return 0;  
}   

        用gcc编译以上程序:

gcc opencl_hello.c -o opencl_hello -lOpenCL

        若有类似如下输出,则表示opencl配置正确:
在这里插入图片描述

更多推荐

高教杯数学建模A题程序设计要点与思路

2023年是我最后一次参加高教杯大学生数学建模竞赛以后不会再参加了(大四参加意义不太,研究生有研究生的数学建模大赛)很遗憾由于各种原因我们没有能够完成赛题2022年美赛2022年MathorCup2022年国赛2022亚太杯2023年美赛2023年国赛我和我的朋友一共参加了6次比赛6次比赛我交到了很好的朋友然鹅成绩比较

Java 8 新特性解读及应用实践

Java8新特性解读及应用实践一、简介二、Lambda表达式三、流式编程四、日期/时间API1.概述2.LocalDate、LocalTime、LocalDateTime等类的使用3.格式化与解析五、重复注解和类型注解1.概念与作用2.重复注解实例3.类型注解实例六、小结回顾一、简介Java8带来了众多重大改进和新特性

【网络协议】Http-上

Http请求结构:结构图1:实验解析请求报文:1.在Edge浏览器上输入ip地址+端口号+文件资源,也就是下图中的120.XX.139.29:8888/A/B/c.html2.我的程序接收到了一个没有有效载荷的http请求(呼应上面的结构图1),如下GET/1/2/3.htmlHTTP/1.1//请求行(请求方法+请求

关于路由懒加载

路由懒加载是一种优化技术,它是可以延迟加载应用程序的某些模块或者组件,而不是在初始加载时一次性加载所有内容,这样可以减少初始加载的文件体积,提高应用程序的加载速度1.懒加载是在什么时候加载路由懒加载是在用户访问相应的路由时才进行加载。它延迟加载路由组件,使得在初始加载时只加载必要的代码,而将其他路由的代码推迟到需要时再

实验篇——根据群体经纬度提取环境数据(先导)

实验篇——根据群体经纬度提取环境数据(先导)文章目录前言一、获取数据文件1.1.经纬度文件1.2.环境数据的tif文件二、R语言代码实现三、环境文件介绍3.1.bio3.2.prec3.3.elev3.4.tmin3.5.tmax3.6.vapr13.7.tavg3.8.srad3.9.wind四、后续总结前言首先得到

LLM - 大模型技术报告与训练细节 By Baichuan2

目录一.引言二.Introduction-LLM相关进展1.模型参数越大,模型能力越强2.开源模型促进LLM领域快速发展3.开源模型集中在英文领域,其他语言能力有限4.训练数据2.6亿Token遥遥领先5.优化人类指令发布对应Chat模型6.公布了训练过程中的CKPT促进领域研究发展三.Pre-training-Bai

Vue路由与nodejs环境搭建

目录一、Vue路由1.1SPA简介1.2路由简介1.3路由实现思路1.3.1引入vue-router的js依赖1.3.2定义组件1.3.3定义路由1.3.4组装路由器1.3.5将路由挂载根实例1.3.6定义触发路由的按钮1.3.7定义锚点1.4示例二、nodejs环境搭建2.1nodejs简介2.2nodejs下载2.

权威敏捷产品经理(CSPO)企业培训

课程简介优秀的产品通常包括以下三个特征:第一:能够抓住用户痛点,帮助用户解决问题;第二:容易使用,极致的用户体验;第三:质量好、性能稳定。这是一个两天的面向产品经理的实训课程,课程旨在帮助学员掌握按照敏捷和互联网思维进行产品研发,打造用户喜爱的产品的思路及实践。课程内容涵盖了产品思维、用户需求挖掘、痛点分析,价值驱动、

APP产品经理岗位的具体内容(合集)

APP产品经理岗位的具体内容11、负责项目产品团队的管理工作,对项目产品团队考核目标负责;2、全面负责“工务园”所有产品,全方位负责其生命周期管理;3、按照产品管理相关的计划和规范,对产品版本的更新及发布负责,完善产品的各种技术文档;4、深刻理解业务需求并转化为系统需求,撰写产品需求文档和需求规格说明书;编写帮助文档、

GLTF编辑器如何快速重置模型原点

1、什么是模型原点?模型原点是三维建模中的概念,它是指在一个虚拟三维空间中确定的参考点。模型原点通常位于模型的几何中心或基本组件的中心位置。如图所示:可以看到模型的原点在模型的几何中心2、模型原点的作用知道了什么是模型原点,那么模型原点有那些作用呢?以下是模型原点的作用点:位置确定:模型原点可以帮助确定模型在三维空间中

PWA及小程序在系统生态方面的支持对比

PWA代表“渐进式网络应用”(ProgressiveWebApplication)。它是一种结合了网页和移动应用程序功能的技术概念。PWA旨在提供类似于原生应用程序的用户体验,包括离线访问、推送通知、后台同步等功能,同时又具有网页的优势,如跨平台、无需下载安装等。PWA这个概念在行业内发展的挺快,基于Chromium的

热文推荐