CUDA简介, 配置和运行第一个CUDA程序(Windows和Linux)

CUDA简介

CUDA(Compute Unified Device Architecture)是由NVIDIA开发的一种通用并行计算架构。CUDA允许程序员利用NVIDIA GPU的并行计算能力,加速各种计算密集型应用程序。

CUDA技术基于GPU的并行计算原理。传统的CPU处理器拥有少量的核心,可以同时执行少量的线程。但是,现代GPU拥有数百甚至上千个核心,可以同时执行大量的线程,实现高度并行计算。CUDA技术通过将CUDA代码编译成针对GPU的指令,利用GPU的并行处理能力,加快程序执行速度。

CUDA提供了一个基于C语言的编程模型和一组库,使程序员能够轻松地编写并行计算代码。CUDA代码可以在主机CPU和GPU之间进行协作,实现数据传输和计算划分。CUDA还提供了一些高级功能,例如共享内存、纹理内存和图像处理,以及支持异步和流处理等技术,可最大化地利用GPU处理器的性能。

CUDA技术在各种应用程序中广泛应用,包括科学计算、大数据分析、机器学习和图形处理等领域。CUDA在科学计算中已经取得了很大的成功,如在天文学、生物学、物理学等领域基础研究中的应用。同时,CUDA还在深度学习、计算机视觉和自然语言处理等人工智能领域获得了越来越多的应用。

cuda

异构计算架构

GPU并不是一个独立运行的计算平台,而需要与CPU协同工作,可以看成是CPU的协处理器,CPU会对GPU进行任务下达指令部署,因此当我们在说GPU并行计算时,其实是指的基于CPU+GPU的异构计算架构

在异构计算架构中,GPU与CPU通过PCIe总线连接在一起来协同工作,CPU所在位置称为为主机端(host),而GPU所在位置称为设备端(device)
cuda2

特点CPUGPU
运算核心运算核心少,但可以实现复杂的逻辑运算,适合控制密集型任务运算核心数多,适合数据并行的计算密集型任务,如大型矩阵运算
线程线程是重量级的,上下文切换开销大多核心,因此线程是轻量级的

CUDA下载


Windows下配置和测试运行

前言

在Windows下做CUDA编程最好使用Vistual Studio(使用命令行运行会出现一些配置上的问题)而在Vistual Studio中不会出现这些问题,Vistual Studio可以直接创建一个CUDA的项目

vscuda

当然,这样便需要提前下载好Vistual Studio,网络上有很多教程,比较基础,我这里就不在演示了(要提前下好VS!)因为有些较低版本CUDA在安装过程中可以会让你选择是否Visual Studio Integration(下方图片是CUDA10.1版),这个选项的作用:是否在VS里出现创建CUDA项目的选项,较高版不一定会有这个选项,默认配置到VS)

vshc

开始安装

CUDA对于电脑支持的最高版本有很大的限制(受到显卡架构调整要求),首先要知道自己电脑支持的最高CUDA版本,打开命令行,输入

nvidia -smi

会出现以下界面(如果你的电脑没装NVIDIA的显卡,那么恭喜你,后面的内容就都和你没关系了,CUDA是基于NVIDIA开发的,没有NVIDIA显卡自然就做不了CUDA编程)

nvidia-smi
标红的部分便是CUDA支持的最高版本号,可以看见我的电脑支持的最高版本是12.0,所以我可以下载12.0及以下的版本使用,切记,不能高于最高版本号,可能出现结果输出异常等情况(亲测)接下来我们进入下载界面,这是CUDA官网各个版本号的地址:https://developer.nvidia.com/cuda-toolkit-archive,进入后的界面如下:

xiazai

这里我选择11.8.0版本下载,点击 CUDA Toolkit 11.8.0, 进入下面界面:

xiazai2

Version如果你用win10选择10,win11选择11,Installer Type选择local即可,点击DownLoad,可以用迅雷接管下载,速度比较快,下载好后会得到一个exe的安装程序,点击即可安装

<必装CUDA,其他情况自己选择>

anzhuan3
<自定义路径 Document与Development路径>

anzhuan4
<等待安装完成即可>

anzhaun5

安装完成后,会自动在环境变量中添加两个配置,可自行查看

path1
在path中还会自动添加(如果没有则自己手动添加):

path2

测试是否安装成功,打开终端输出:

nvcc -V

出现如下则说明安装成功

nvccV

测试运行

接下来便在Windows下可以运行第一个CUDA程序(Vistual Studio):

打开VS,新建一个CUDA项目

xjxm2
xjxm
然后VS会给你一段测试代码(会出现一个报错,但实际上没错,猜测应该是VS的一个bug):

shili

直接运行这个代码,就会得到如下结果:
yunxin

这便是Windows系统下通过CUDA调用GPU做的一个运算!至此,Windows下的配置CUDA基础环境便介绍完毕,博客上还有很多教程顺便介绍了怎么配置cuDNN(CUDA下的一个深度神经网络库)这里我先不做介绍,由于我后面会用到它和CUDA的其他一些库,到那个时候我再统一介绍怎么安装和使用这些库。

Linux下配置和测试运行

前言

我个人比较建议在学习阶段的话尽量在Linux下做CUDA编程,因为在Windows下只能通过VS配置项目的方式才能用CUDA(目前我只找到这一种方法),比较不方便,在Linux下可以用命令行的方式对CUDA程序进行编译,比较方便也能更好的体会到CUDA的工作原理。

如果第一次或者对Linux用的不熟的情况下,我推荐使用Ubuntu(建议使用18.04版)(基于Linux内核的一个发行版)怎么使用呢,我提供两种思路,一是使用双系统,二是使用WSL(Windows下的一个子系统)不要使用虚拟机,因为虚拟机无法调用显卡(技术很难以实现)

选择双系统或WSL使用,下面是二者各自的优点:

双系统:完全独立的操作系统,具备完整的系统性能,最大的兼容性
WSL:无需重启系统,简化的开发环境,良好的集成性

要是有朋友没有接触过两个技术的话可以选择其中一种到网上找教程安装(由于安装难度不大,我便不再演示)如果是初学CUDA,我建议选用WSL即可,比较方便,下面我将演示WSL环境下Ubuntu系统的CUAD安装(双系统的配置过程完全一致,只需按照自己需求选择不同的版本即可)

开始安装

我采用的是WSL2下的Ubuntu18.04版(推荐),打开WSL,由于是Windows的子系统,所以直接输入nvidia-smi 如果Windows系统能正常显示界面的话,WSL也能显示如下界面:

windowsnviia
WSLnvidia
支持CUDA的最高版本依旧是12.0,这次我们尝试下载12.0版,进入CUDA Toolkit 12.0.0,与Windows不同,这次版本选择Linux:
WSLxuanz

Distribution选择WSL-Ubuntu,Installer选择local,(runfile() 和 deb() 都是命令行工具,runfile(local) 是 NVIDIA 针对自己的显卡发布的一个安装脚本。相比于 runfile(local) 命令,deb(local) 命令使用更加方便。deb(local) 命令是针对基于 Debian Linux 的系统设计的,在这些系统上可以使用 apt 命令安装软件包,推荐使用 deb(local))

选择好配置后会出下如下命令(Windows是一个exe的下载链接,也体现出了Linux使用命令行下载的方便)
wsl12.0

打开WSL终端,依次复制指令输入即可。

下载完毕后需要配置环境变量(Windows会自动配置,Linux需要手动输入路径到配置配置环境)

查看下载后的版本号(文件名):

banbenhao
记住这个标红的文件夹名!

配置环境,在终端中输入:

sudo nano  ~/.bashrc

便会用nano打开.bashrc文件(nano是Linux中的一个轻量级的命令行文本编辑器,不习惯命令行的朋友可以使用gedit,一款图形化文本编辑器)

打开.bashrc后其他的配置千万不要更改!查看版本号后在文件最后加入如下配置(更改版本号为自己下载的的版本!)

添加配置:

#config cuda
export LD_LABRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-12.0/lib64
export PATH=$PATH:/usr/local/cuda-12.0/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda-12.0
export PATH=/usr/local/cuda/bin:$PATH

保存退出即可,然后输入如下指令使刚才的配置生效:

source ~/.bashrc

同样输入nvcc -V查看是否配置成功

nvccWSL

出现如上则说明配置成功

测试运行:

下面在WSL下测试和运行第一个CUDA程序(终端):

创建一个文件命名为 “test.cu”,写入代码:

# include <stdio.h>__global__ void hello_from_GPU()
{printf("hello from GPU \n");}int main(void){hello_from_GPU<<<4, 4>>>();cudaDeviceSynchronize();return 0;
}

这段代码的意思大概是定义了一个核函数,作用是输出"hello from GPU" , 然后在main函数里调用这个函数,<<<4, 4>>>意思是使用4个线程块,每个线程块打开4个线程,即输出16次 “hello from GPU” 这便是一个最简单的CUDA的helloworld程序。

写入代码后用如下指令编译:

nvcc -o test test.cu

这段编译指令和gcc的一模一样(只有编译器名字不同),编译结果便是得到一个名为 “test”(自己设定的名字)的二级制执行文件,直接执行这个文件即可 ./test,注意:前面要加相对路径./ 否则找不到文件。

编译和执行结果的全过程如下:

mlhwsl

这样便完成了在WSL下的CUDA配置和第一个helloworld程序的运行。当然如果主系统中有vscode的话也可以用vscode打开test.cu(不必再WSL子系统中单独下载vscode)

code ./test.cu

打开后界面如下:

codeWSL
左下角蓝色部分表示用主系统的vscode连接上了WSL,这样即可以使用WSL的Linux的终端窗口,又可以高效的利用vscode良好的生态来管理代码和文件,调试代码非常方便,十分推荐!



关于CUDA的简介,以及在Windows和Linux下的配置过程,和在不同系统下分别测试运行第一个CUDA程序就到此结束,后面将会介绍CUDA的编程学习(用WSL为主)

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

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

相关文章

js中继承的方法

前言: 本人刚写了一篇原型链的封装继承多态,用家有儿女做的demo。其实我个人感觉封装和多态都容易去理解与实现。关键在于继承,js的才是比较难的,也容易让人混乱,至少我是因为继承头大过\(^o^)/~ js中有很多方法可以实现继承,这篇文章主要对继承的方法进行学习与测试。 这里…

[STM32-1.点灯大师上线】

学习了江协科技的前4课&#xff0c;除了打开套件的第一秒是开心的&#xff0c;后面的时间都是在骂娘。因为51的基础已经几乎忘干净&#xff0c;c语言已经还给谭浩强&#xff0c;模电数电还有点底子&#xff0c;硬着头皮上吧。 本篇主要是讲述学习点灯的过程和疑惑解释。 1.工…

【3】密评-物理和环境安全测评

0x01 依据 GB/T 39786 -2021《信息安全技术 信息系统密码应用基本要求》针对等保三级系统要求&#xff1a; 物理和环境层面&#xff1a; a&#xff09;宜采用密码技术进行物理访问身份鉴别,保证重要区域进入人员身份的真实性&#xff1b; b&#xff09;宜采用密码技术保证电子门…

[HTML]Web前端开发技术7(HTML5、CSS3、JavaScript )CSS的定位机制——喵喵画网页

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

电音制作入门软件FL Studio21.2.0最新永久免费版

FL Studio是一款出色的编曲软件&#xff0c;最新版本的FL Studio21新增了四款全新的插件&#xff0c;覆盖了音频设计、延迟、相位器等等。通过软件的不断更新&#xff0c;我们可以享受到更加智能的电子音乐创作工具&#xff0c;目前&#xff0c;FL Studio的正式版已经推出了超过…

内核启动时间信息打印

文章目录 一 串口打印1 借助串口助手2 dmesg自带时间3 内核显示时间信息4 借助initcall_debug二 图形花显示1 bootgraph工具使用2 Bootchart工具使用3 Grabserial工具使用一 串口打印 1 借助串口助手 2 dmesg自带时间 root@xboard:~# dmesg [ 0.000000] Booting Linux on …

操作系统概论:揭秘计算机背后的神秘力量

操作系统概论 & 功能 概述定义操作系统功能作为系统资源的管理者向上层提供方便易用的服务作为最接近硬件的层次 主页传送门&#xff1a;&#x1f4c0; 传送 概述 概念&#xff1a; 定义 控制和管理计算机硬件和软件资源的程序一种系统软件为上层用户、应用程序提供简单易…

uniapp开发小程序经验记录

uniapp开发小程序的过程中会遇到很多问题&#xff0c;这里记录一下相关工具优化&#xff0c;便于后来者参考。 每次保存代码后&#xff0c;小程序都跳回首页 针对这个问题&#xff0c;常规的做法就是修改pages配置文件&#xff0c;但是这种方式不便于路由参数的设置&#xff…

某60区块链安全之JOP实战一学习记录

区块链安全 文章目录 区块链安全Jump Oriented Programming实战一实验目的实验环境实验工具实验原理实验内容Jump Oriented Programming实战一 实验步骤分析合约源代码漏洞Jump Oriented Programming实战一 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约中中Ju…

CPP-SCNUOJ-Problem P24. [算法课贪心] 跳跃游戏

Problem P24. [算法课贪心] 跳跃游戏 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标。 输入 输入一行数组nums 输出 输出true/fasle 样例 标准输入 2 3 1 …

【Wireshark工具使用】Wireshark无法抓取TwinCAT的EtherCAT包(已解决)

写在前面 因项目需要&#xff0c;近期在在深入研究EtherCAT协议&#xff0c;之后会将协议做一个系统的总结&#xff0c;分享在这个分栏。在研究EtherCAT协议帧时&#xff0c;使用了一个网络数据分析工具Wireshark&#xff0c;本文是关于EtherCAT数据帧分析工具使用中遇到的一个…

【设计模式】策略模式设计-电影票打折功能

任务二&#xff1a;使用策略模式设计电影票打折功能 某电影院售标系统为不同类型的用户提供了不同的打折方式&#xff08;Discount&#xff09;&#xff0c;学生凭学生证可享受8折优惠**&#xff08;StudentDiscount&#xff09;&#xff0c;儿童可享受减免10元的优惠&#xf…

「Verilog学习笔记」时钟分频(偶数)

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1nsmodule even_div(input wire rst ,input wire clk_in,output wire clk_out2,output wire clk_out4,output wire clk_out8); //********…

新华三数字大赛复赛知识点 VLAN基本技术

VLAN IEEE 802.1Q 交换机端口类型 MVRP协议 VLAN Virtual LAN虚拟局域网。LAN可以是由几台少数家用计算机构成的网络&#xff0c;也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络–也就是广播域。将一个物理的局域网在逻辑上划分成多个广播域…

苹果IOS在Safari浏览器中将网页添加到主屏幕做伪Web App,自定义图标,启动动画,自定义名称,全屏应用pwa

在ios中我们可以使用Safari浏览自带的将网页添加到主屏幕上&#xff0c;让我们的web页面看起来像一个本地应用程序一样&#xff0c;通过桌面APP图标一打开&#xff0c;直接全屏展示&#xff0c;就像在APP中效果一样&#xff0c;完全体会不到你是在浏览器中。 1.网站添加样式 在…

时间复杂度为 O(n^2) 的排序算法 | 京东物流技术团队

对于小规模数据&#xff0c;我们可以选用时间复杂度为 O(n2) 的排序算法。因为时间复杂度并不代表实际代码的执行时间&#xff0c;它省去了低阶、系数和常数&#xff0c;仅代表的增长趋势&#xff0c;所以在小规模数据情况下&#xff0c; O(n2) 的排序算法可能会比 O(nlogn) 的…

Stable Diffusion教程:4000字说清楚图生图

原文&#xff1a;Stable Diffusion教程&#xff1a;4000字说清楚图生图 - 知乎 目录 收起 基本使用 涂鸦绘制 局部绘制 局部绘制&#xff08;涂鸦蒙版&#xff09; 局部绘制&#xff08;上传蒙版&#xff09; 批量处理 总结 资源下载 “图生图”是 Stable Diffusion…

【Android知识笔记】架构专题(三)

如何用工程手段,提高写代码的生产力?(元编程) 即如何写同样多的代码,花费更少的时间?如何自动生成代码,哪种代码可以被自动生成?哪些环节能够作为自动生成代码的切入点? 代码自动生成技术 代码自动生成,指的并不是让计算机凭自己的意愿生成代码。而是让预先实现好…

windows运行orb-slam3遇到的问题

windows版代码地址&#xff1a;https://github.com/melhashash/orbslam3-windows 编译完成&#xff0c;出现初始化不成功的现象。 问题一&#xff1a; 相机参数中没有相机类型&#xff0c;导致畸变参数初始化失败。 GrabImageRGBD中frame对象实例化时&#xff0c;缺少相机参数…

【Windows】永久屏蔽系统更新

永久关闭电脑更新服务 操作思路&#xff1a; 第一步 winR 输入 services.msc 回车 进入服务管理窗口第二步 进入窗口后 找到 w 开头的文件夹 并找到Windows Update 双击打开 Windows Update 将启动类型&#xff08;E&#xff09; 改为禁用 上方的 “常规” “登录” “恢…