Ubuntu 安装 CUDA 与 OPENCL

        前言:最近需要做一些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.rhkb.cn/news/140112.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt5开发及实例V2.0-第二十一章-Qt.Quick Controls开发基础

Qt5开发及实例V2.0-第二十一章-Qt.Quick Controls开发基础 第21章 Qt Quick Controls开发基础21.1 Qt Quick Controls概述21.1.1 第一个Qt Quick Controls程序21.1.2 Qt Quick窗体应用程序的构成 21.2 Qt Quick控件21.2.1 概述21.2.2 基本控件21.2.3 高级控件21.2.4 样式定制 2…

基于MUSIC算法的二维超声波成像matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、基本原理 4.2、数学公式 4.3、实现过程 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..........................................…

比特币的蒙提霍尔问题

把钱放在嘴边 我们在比特币上建立了蒙提霍尔问题模拟。 如果您知道概率谜题的正确答案&#xff0c;不仅炫耀您的数学技能&#xff0c;还会获得金钱奖励。 它完全无需信任地在链上运行。 蒙提霍尔问题 蒙提霍尔问题&#xff08;三门问题&#xff09;是一个以蒙提霍尔命名的概率…

力扣-234.回文链表

Idea 用一个数组或者字符串将链表中的值依次存入&#xff0c;然后利用数组遍历方法比较双端元素 AC Code class Solution { public:bool isPalindrome(ListNode* head) {string s "";ListNode* p head;while(p ! nullptr){s.append(to_string(p->val));p p-&g…

SQL 如何提取多级分类目录

前言 POI数据处理&#xff0c;原始数据为csv格式&#xff0c;整理入库至PostGreSQL&#xff0c;本例使用PostGreSQL13版本。 一、POI POI&#xff08;一般作为Point of Interest的缩写&#xff0c;也有Point of Information的说法&#xff09;&#xff0c;通常称作兴趣点&am…

程序运行时增加语音提示

目录 前言 一、认识SAPI 二、使用方法 三、测试效果​编辑 总结 前言 在测试过程中为了更高效的提示操作者&#xff0c;在程序执行时增加语音提醒会方便很多&#xff0c;利用微软的SAPI可以很方便的在程序有问题时提示操作者。 一、认识SAPI SpVoice类是支持语音合成(TTS)的核…

ARP协议-介于数据链路层和网络层之间的协议

通过上一篇 IP协议 我们知道 目标IP目标网络 目标主机 &#x1f64b;‍ 也就是说 必须知道 接收方的接收方的 MAC地址 > 没有MAC地址无法封装 MAC帧 在网络层&#xff0c;我们可以知道目标主机的 IP 地址&#xff0c; 但是 我们不知道对方的MAC地址 。 在同一个网段&…

Tessy 5.0.4

Tessy 5.0.4 Linux 2692407267qq.com&#xff0c;更多内容请见http://user.qzone.qq.com/2692407267/

【Vue+Element-UI】实现登陆注册界面及axios之get、post请求登录功能实现、跨域问题的解决

目录 一、实现登陆注册界面 1、前期准备 2、登录静态页实现 2.1、创建Vue组件 2.2、静态页面实现 2.3、配置路由 2.4、更改App.vue样式 2.5、效果 3、注册静态页实现 3.1、静态页面实现 3.2、配置路由 3.3、效果 二、axios 1、前期准备 1.1、准备项目 1.2、安装…

H.264编码

1.为什么要对视频进行编码 视频是连续的图像序列&#xff0c;由连续的帧构成&#xff0c;一帧即为一幅图像&#xff0c;由于人眼的视觉暂留效应&#xff0c;当帧序列以一定的速率播放时&#xff0c;我们看到的就是动作连续的视频&#xff0c;这么多连续的图像数据如果不经过编码…

正则表达式:整数

正则表达式&#xff1a;整数 校验字符串&#xff0c;为有效的整数。 校验规则 只能为&#xff1a;整数&#xff08;包括&#xff1a;正整数、负整数、零&#xff09; 不能为&#xff1a;非数值型的字符串 不能为&#xff1a;小数 不能为&#xff1a;一连串的0&#xff08;比…

算法通关村第16关【青铜】| 滑动窗口思想

1. 滑动窗口的基本思想 一句话概括就是两个快慢指针维护的一个会移动的区间 固定大小窗口&#xff1a;求哪个窗口元素最大、最小、平均值、和最大、和最小 可变大小窗口&#xff1a;求一个序列里最大、最小窗口是什么 2. 两个入门题 &#xff08;1&#xff09;子数组最大平…

使用 Elasticsearch、OpenAI 和 LangChain 进行语义搜索

在本教程中&#xff0c;我将引导您使用 Elasticsearch、OpenAI、LangChain 和 FastAPI 构建语义搜索服务。 LangChain 是这个领域的新酷孩子。 它是一个旨在帮助你与大型语言模型 (LLM) 交互的库。 LangChain 简化了与 LLMs 相关的许多日常任务&#xff0c;例如从文档中提取文本…

vue3 - Element Plus暗黑模式适配、切换及自定义颜色

GitHub Demo 地址 在线预览 Element Plus 2.2.0 版本开始支持暗黑模式&#xff0c;启用方式参考 Element Plus 官方文档 - 暗黑模式 demo通过Element Plus和VueUse 的 useDark 方法实现具有自动数据持久性的响应式暗黑模式。 安装 npm install element-plus --save npm in…

一个关于 i++ 和 ++i 的面试题打趴了所有人

前言 都说大城市现在不好找工作&#xff0c;可小城市却也不好招人。 我们公司招了挺久都没招到&#xff0c;主管感到有些心累。 我提了点建议&#xff0c;是不是面试问的太深了&#xff0c;在这种小城市&#xff0c;能干活就行。 他说自己问的面试题都很浅显&#xff0c;如果答…

HUAWEI华为荣耀猎人游戏本V700 i7独显2060(FRD-WFD9)原装出厂Windows10系统工厂模式(含F10还原)

华为HONOR荣耀笔记本原厂系统镜像包&#xff0c;安装恢复时自动创建F10一键智能还原功能 链接&#xff1a;https://pan.baidu.com/s/1_px_3Fr9qEE6jExz1eKKKg?pwdk6uc 提取码&#xff1a;k6uc 系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件、华为电脑管家等预装程序…

ChatGLM GPT原理介绍

图解GPT 除了BERT以外,另一个预训练模型GPT也给NLP领域带来了不少轰动,本节也对GPT做一个详细的讲解。 OpenAI提出的GPT-2模型(https://openai.com/blog/better-language-models/) 能够写出连贯并且高质量的文章,比之前语言模型效果好很多。GPT-2是基于Transformer搭建的,相…

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

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

QT:使用行编辑器、文本编辑器、单选按钮、水平布局、垂直布局做一个小项目

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLineEdit> //行编辑器 #include <QTextEdit> //文本编辑器 #include <QRadioButton> //单选按钮class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *pare…

项目进度网络图

概念 项目网络图是项目所有活动及其之间逻辑关系&#xff08;依赖关系&#xff09;的一个图解表示&#xff0c;并从左到右来表示项目的时间顺序。 可手工编制也可用计算机实现。可包括整个项目的全部细节&#xff0c;也可包含一个或多个概括性活动&#xff0c;还相应伴有一个…