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

news2025/2/24 18:20:46

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.coloradmin.cn/o/1285853.html

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

相关文章

Zabbix自定义监控内容

自定义监控客户端服务器登录的人数 需求&#xff1a;限制登录人数不超过 3 个&#xff0c;超过 3 个就发出报警信息 1.在客户端创建自定义key //明确需要执行的 linux 命令 who | wc -l//创建 zabbix 的监控项配置文件&#xff0c;用于自定义 key vim /etc/zabbix/zabbix_ag…

零基础入坑Python爬虫的全面学习指南

文章目录 首先爬虫是什么&#xff1f;1. Python学习2.Python urllib和urllib2 库的用法3.Python 正则表达式4.爬虫框架Scrapy爬虫基本原理关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工…

Shopee买家通系统自动下单更方便

Shopee购物平台的买家通系统为用户提供了一种便捷的自动下单方式&#xff0c;通过这一系统&#xff0c;用户可以轻松实现在虾皮平台购买商品的自动化操作。下面将介绍具体的操作流程&#xff0c;确保用户可以顺利完成整个购物流程。 首先&#xff0c;用户需要准备一个可用的虾皮…

(2/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)

附录 A1 - 《PMBOK指南》映射 表A1显示了第六版《PMBOK指南》中定义的项目管理过程组与知识领域之间的对应关系 本附录说明了如何利用混合和敏捷方法处理《PMBOK指南》知识领域&#xff08;请参见表A1-2&#xff09;中所述的属性&#xff0c;其中涵盖了相同和不同的属性&…

Apollo新版本Beta技术沙龙参会感受:未来的自动驾驶之旅

Apollo新版本Beta技术沙龙参会感受&#xff1a;未来的自动驾驶之旅 &#x1f697;&#x1f4a1; 文章目录 Apollo新版本Beta技术沙龙参会感受&#xff1a;未来的自动驾驶之旅 &#x1f697;&#x1f4a1;摘要引言正文&#x1f4cd; 参会流程介绍&#x1f31f; 参会收获&#x1…

力扣 790. 多米诺和托米诺平铺(一维dp)

题目描述&#xff1a; 有两种形状的瓷砖&#xff1a;一种是 2 x 1 的多米诺形&#xff0c;另一种是形如 "L" 的托米诺形。两种形状都可以旋转。 给定整数 n &#xff0c;返回可以平铺 2 x n 的面板的方法的数量。返回对 109 7 取模 的值。 平铺指的是每个正方形都…

并行流(Parallel Streams)

并行流&#xff08;Parallel Streams&#xff09;是Java 8引入的一种并行处理集合数据的机制&#xff0c;它允许将操作并行化以提高处理速度。然而&#xff0c;并行流可能存在一些安全问题&#xff0c;特别是在多线程环境下。 以下是一些与并行流相关的安全问题&#xff1a; 共…

08、分析测试执行时间及获取pytest帮助

官方用例 # content of test_slow_func.py import pytest from time import sleeppytest.mark.parametrize(delay,(1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,1.0,0.1,0.2,0,3)) def test_slow_func(delay):print("test_slow_func {}".format(delay))sleep(delay)assert…

每日一练 | 华为认证真题练习Day142

1、路由器的主要功能&#xff0c;以下说法错误的是&#xff1f;&#xff08;多选&#xff09; A. 通过多种协议建立路由表 B. 根据路由表指导数据转发 C. 根据收到数据包的源IP地址进行转发 D. 实现相同网段设备之间相互通信 2、管理员发现无法通过TFTP传输文件到华为AR200…

深入学习锁--Lock各种使用方法

一、什么是Lock Lock是一个接口,通常所说的可重入锁是指Lock的一个实现子类ReentrantLock 二、Lock实现步骤&#xff1a; ①创建锁对象Lock lock new ReentrantLock(); ②加锁lock.lock(); ③释放锁lock.unlock(); import java.util.concurrent.locks.Lock; import java.util…

十年数据分析师告诉你,这款国产数据分析工具真的很好用!

今天早上上班的时候经过一同事&#xff0c;看见他正苦大仇深的做着数据分析报告&#xff0c;老李走上前一问才知道&#xff0c;他的EXCEL又双叒罢工了。   数据分析师的核心能力是思维&#xff0c;而次核心能力就是工具。如古人云打仗需要一把趁手的兵器。对于初入行业的数据分…

DBET-6X/200G24-8K4V直动式比例溢流阀放大器

DBETX-1X/50G24-8NZ4M、DBETX-1X/180G24-8NZ4M、DBETX-1X/250G24-8NZ4M、DBETX-1X/315G24-8NZ4M、DBETX-1X/80G24-8NZ4M、DBET-6X/200G24-8K4V直动式比例溢流阀&#xff0c;用来限制系统压力&#xff0c;通过电磁铁控制电流可调节压力&#xff0c;参考特性曲线即使出现电气故障…

一文回顾 Polkadot 跨链技术演进,了解 Polkadot 2.0 的未来

Polkadot 的起源、完善和上线过程经历了怎样的技术迭新与路线升级&#xff1f;深入把握 Polkadot 技术模型与生态合约才能让我们更好地深耕 Polkadot 生态。 11 月 25 日晚上&#xff0c;Substrate Saturday 第 19 期活动如期举行&#xff0c;Parity 工程师 Suvi Dong、Kaicha…

外包干了4年,技术退步明显...

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

预付费用电管理系统在商场及宿舍的应用

安科瑞电气股份有限公司 上海嘉定 201801 【摘要】本文主要讨论了预付费用电管理系统软、硬件的构建方法&#xff0c;软件系统的各个模块设计&#xff0c;以及软、硬件设计过程中解决的主要问题。1联5系8电2话171微3信5同2号2 【关键词】预付费电能表硬件设计软件设计 引言 …

香港服务器时间不准,差8小时

解决方案1 1、timedatectl查看系统时间 2、查看系统时区 ls /usr/share/zoneinfo 3、删除当前系统所处时区 rm /etc/localtime 4、创建软链接&#xff0c;以替换当前的时区信息 ln -s /usr/share/zoneinfo/Universal /etc/localtime 解决方案2 手动设置硬件时钟 1、设置系…

Hadoop学习笔记(HDP)-Part.13 安装Ranger

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

JSP控制项目启动后默认去访问指定的WebServlet 而不是index.jsp

我的 index.jsp 代码是这样 现在每次启动 访问的都是index.jsp 这也是它的默认配置 我这里写了一个 WebServlet 代码是这样 简单可以理解为 我们定义了WebServlet 访问路径为1cginServlet 其中在request作用域中 定义了一个userName值为 欢迎来到jsp世界 然后 跳转向 page.j…

Selenium自动化测试技巧还不知道吗?

1、前言 与以前瀑布式开发模式不同&#xff0c;现在软件测试人员具有使用自动化工具执行测试用例套件的优势&#xff0c;而以前&#xff0c;测试人员习惯于通过测试脚本执行来完成测试。 但自动化测试的目的不是完全摆脱手动测试&#xff0c;而是最大程度地减少手动运行的测试…

ROS话题通信基本操作(C++)

目录 一、发布 1、实现步骤 2、代码实例 二、接收 1、实现步骤 2、代码实例 三、配置运行 1、修改CMakeLists.txt 2、运行结果 一、发布 1、实现步骤 1.包含头文件 2.初始化 ROS 节点:命名(唯一) 3.实例化 ROS 句柄 4.实例化 发布者 对象 5.组织被发布的数据&#…