Ubuntu 安装 CUDA 与 OPENCL

news2024/9/28 23:37:19

        前言:最近需要做一些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配置正确:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1025852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字节跳动大规模多云CDN管理与产品化实践

近日&#xff0c;火山引擎边缘云融合CDN团队负责人孙益星在LiveVideoStack Con 2023上海站围绕融合CDN团队持续建设多云CDN平台的演进过程&#xff0c;结合建设过程中面临的难点和挑战&#xff0c;介绍了融合CDN团队接下来的主要投入方向&#xff0c;分享了火山引擎在多云应用架…

tp5.1 致命错误: Call to undefined method think\Cache::get()

致命错误: 致命错误: Call to undefined method think\Cache::get() 原因&#xff1a;&#xff08;引用类错误&#xff09; thinkphp5.1中有两个Cache类&#xff1a;think\Cache和think\facade\Cache。 官方文档中说使用think\Cache&#xff0c;但实际是使用think\facade\Cac…

SQL Server数据库中了360后缀勒索病毒怎么办,勒索病毒解密数据恢复

随着互联网的发展&#xff0c;网络安全问题日益凸显&#xff0c;勒索病毒已经成为当今数字威胁中的一大主要犯罪行为之一。其中&#xff0c;360后缀勒索病毒作为一种常见的数据库攻击形式&#xff0c;对数据库的安全性提出了极大挑战。近期我们收到很多企业的求助&#xff0c;企…

RocketMQ 源码分析——NameServer

文章目录 为什么要学RocketMQ源码RocketMQ源码中的技术亮点RocketMQ 模块结构NameServer 源码分析NameServer 整体流程NameServer 启动流程加载KV配置构建NRS通讯接收路由、心跳信息定时任务剔除超时Broker NameServer设计亮点读写锁存储基于内存NameServer无状态化 为什么要学…

SpringIOC之Lifecycle 接口

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

计算机等级考试信息安全三级填空题-二

1.信息安全的五个根本属性是&#xff1a;机密性、完整性可控性、不可否认性和完整性。 2.在Windows系统中&#xff0c;查看当前已经启动的效劳列表的命令是&#xff1a;net start 3.在数据库中&#xff0c;删除表的命令是&#xff1a;DROP 4.在信息资产治理中&#xff0c;标准…

zabbix的原理与安装

一、Zabbix介绍 1、zabbix 是什么&#xff1f; zabbix是一个开源的IT基础监控软件&#xff0c;能实时监控网络服务&#xff0c;服务器和网络设备的状态&#xff0c;如网络使用&#xff0c;CPU负载、磁盘空间等&#xff0c;主要是包括数据的收集、报警和通知的可视化界面zabbi…

Java下打印1-100以内的质数

代码如下&#xff1a; public class MyWork {public static void main(String[] args) {System.out.println("100以内的质数如下&#xff1a;");for (int num 0; num < 100; num) {if (2 num) {System.out.print(num " ");continue;}for (int i 2;…

晚上弱光拍照不够清晰,学会这几招画面清晰效果好

很多小伙伴喜欢夜晚拍摄&#xff0c;然而拍摄出来的照片经常画面偏暗甚至模糊不清&#xff0c;这是怎么回事&#xff1f; 弱光环境是很多人都比较头疼的拍摄场合&#xff0c;由于光线弱曝光不好把控&#xff0c;并且还很容易出现细节性问题&#xff0c;想要将照片拍好就非常不…

全网最详细的自动化测试(Jenkins 篇)

学习 Jenkins 自动化测试的系列文章 Robot Framework 概念Robot Framework 安装Pycharm Robot Framework 环境搭建Robot Framework 介绍Jenkins 自动化测试 1. Robot Framework 概念 Robot Framework是一个基于Python的&#xff0c;可扩展的关键字驱动的自动化测试框架。 …

MongoDB【部署 02】mongodb使用配置文件启动、添加为系统服务及自启动(一个报错:[13436][NotMasterOrSecondary])

MongoDB使用配置文件启动、添加为系统服务及设置自启动 1.是什么2.下载安装启动配置2.1 下载2.2 安装2.3 配置2.4 使用配置文件启动 3.设置系统服务及自启动3.1 设置为系统服务3.2 自启动 1.是什么 【以下内容来自ChatGPT3.5】 MongoDB是一个流行的开源文档型数据库管理系统&a…

IP地址与代理IP:了解它们的基本概念和用途

在互联网世界中&#xff0c;IP地址和代理IP是两个常见但不同的概念&#xff0c;它们在网络通信、隐私保护和安全方面发挥着重要作用。本文将介绍什么是IP地址和代理IP&#xff0c;以及它们在网络中的作用和应用。 IP地址是什么&#xff1f; IP地址&#xff0c;全称为Internet…

大健康行业千城万企信用建设工作启动大会在京召开

9月19日&#xff0c;为响应商务部、中宣部、国家发改委等13个部门共同举办的“诚信兴商宣传月”活动&#xff0c;中国国际电子商务中心所属北京国富泰信用管理有限公司联合北京华商国医堂集团及旗下东方岐黄商学院&#xff0c;北京华商国医堂中医药研究院举办的共筑信用月&…

solid works草图绘制与设置零件特征的使用说明

&#xff08;1&#xff09;草图绘制 • 草图块 在 FeatureManager 设计树中&#xff0c;您可以隐藏和显示草图的单个块。您还可以查看块是欠定义 (-)、过定义 () 还是完全定义。 要隐藏和显示草图的单个块&#xff0c;请在 FeatureManager 设计树中右键单击草图块&#xff0c;…

国内券商有没有提供股票量化交易,程序化交易接口的,怎么用?

有的&#xff0c;python语言&#xff0c;免费使用&#xff0c;个人账户可开&#xff0c;直连交易所&#xff0c;行情及时准确 以前想实现股票的程序化交易门槛很高&#xff0c;要么资金实力足&#xff0c;要么技术实力强&#xff0c;小散户根本不用想&#xff0c;现在不一样了…

leetcode:剑指 Offer 17. 打印从1到最大的n位数(python3解法)

难度&#xff1a;简单 输入数字 n&#xff0c;按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3&#xff0c;则打印出 1、2、3 一直到最大的 3 位数 999。 示例 1: 输入: n 1 输出: [1,2,3,4,5,6,7,8,9]说明&#xff1a; 用返回一个整数列表来代替打印n 为正整数 题解&…

实时车辆行人多目标检测与跟踪系统(含UI界面,Python代码)

算法架构&#xff1a; 目标检测&#xff1a;yolov5 目标跟踪&#xff1a;OCSort其中&#xff0c; Yolov5 带有详细的训练步骤&#xff0c;可以根据训练文档&#xff0c;训练自己的数据集&#xff0c;及其方便。 另外后续 目标检测会添加 yolov7 、yolox&#xff0c;目标跟踪会…

单例模式(饿汉模式 懒汉模式)与一些特殊类设计

文章目录 一、不能被拷贝的类 二、只能在堆上创建类对象 三、只能在栈上创建类对象 四、不能被继承的类 五、单例模式 5、1 什么是单例模式 5、2 什么是设计模式 5、3 单例模式的实现 5、3、1 饿汉模式 5、3、1 懒汉模式 &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &#x…

2023-09-20 Android CheckBox 让文字显示在选择框的左边

一、CheckBox 让文字在选择框的左边 &#xff0c;在布局文件里面添加下面一行就可以。 android:layoutDirection"rtl" 即可实现 android:paddingStart"10dp" 设置框文间的间距 二、使用的是left to right <attr name"layoutDirection">&…

无代码开发和低代码开发的本质区别

目录 一、两者的概念区别 二、两者面向的人群不同 三、集成能力的区别 四、扩展能力的区别 五、选购建议 无代码和低代码开发都是目前新兴的一种软件开发方式。 一、两者的概念区别 低代码开发&#xff08;Low-Code Development&#xff09;是一种通过使用图形界面和预先构建的…