【CUDA】《CUDA编程:基础与实践》Hello CUDA
创始人
2024-06-02 01:37:13
0

CUDA Hello World!

简介

本文主要实现CUDA的 Hello World 。介绍了nvcc CUDA 编译时虚拟架构算力指定和真实架构算力指定,最后使用xmake编译CUDA程序。

CUDA 代码

  • 一个真正利用GPU的CUDA程序既有主机Host(CPU)代码,也有设备Devie(GPU)代码。
  • 主机对设备的调用时通过 核函数来实现。
    • 核函数可以使用 global 修饰
    • 核函数必须是 void
    // src/main.cu
    #include 
    __global__ void hello_from_gpu() {printf("Hello World the GPU! \n");
    }int main() {hello_from_gpu<<<1,1>>>();cudaDeviceSynchronize();return 0;
    }
    
  • 核函数调用 hello_from_gpu<<<线程块数(), >>>

编译

虚拟算力和实际算力设置

CUDA 编译过程

  • CUDA的编译器驱动 nvcc 先将全部源码分离为主机代码和设备代码。主机代码(CPU)完整地支持C++语法,但设备代码(GPU)只部分支持C++。
  • nvcc先将设备代码编译为PTX(Parallel Thread eXecution)伪汇编代码。
  • 将PTX代码编译为二进制cubin目标代码。

虚拟架构和真实架构算力指定

  • 在将源码编译为PTX代码时,需要用选项 -arch=comput_XY 指定一个虚拟架构的计算能力,用以确定代码中能够使用的CUDA功能。
  • 将PTX代码编译为cubin代码时,需要用选项-code=sm_ZW指定一个真实架构的计算能力。
  • 真实架构的算力必须大于或等于指定算力的虚拟架构算力。

比如这里我们可以选择 虚拟架构算力为3.5 真实架构算力为6.0:

-arch=compute_35 -code=sm_60

但是不允许 虚拟架构算力大于真实架构算力

-arch=compute_60 -code=sm_35

如何设置?

如我们指定算力选项为:

-arch=compute_35 -code=sm_35

编译出来的可执行文件只能在帕斯卡架构的GPU中执行。如果希望编译出来的可执行文件能够在更多的GPU中执行,可以同时指定多组计算能力,每一组用如下形式的编译选项:

-gencode arch=compute_35 code=sm_35
-gencode arch=compute_50 code=sm_50
-gencode arch=compute_60 code=sm_60
-gencode arch=compute_70 code=sm_70

这样在不同GPU中运行会自动选择对应的二进制版本。

xmake 编译PTX编译设置

  • 指定虚拟架构算力 add_cugencodes(“sm_35”)
  • add_cugencodes(“native”) 根据当前CUDA 架构指定最低的算力
  • 指定实际架构算力 add_cugencodes(“compute_35”)
 -- generate SASS code for SM architecture of current hostadd_cugencodes("native")-- generate PTX code for the virtual architecture to guarantee compatibilityadd_cugencodes("compute_35")-- -- generate SASS code for each SM architecture-- add_cugencodes("sm_35", "sm_37", "sm_50", "sm_52", "sm_60", "sm_61", "sm_70", "sm_75")-- -- generate PTX code from the highest SM architecture to guarantee forward-compatibility-- add_cugencodes("compute_75")

xmake 编译脚本

add_rules("mode.debug", "mode.release")target("LearningCUDA")set_kind("binary")add_files("src/*.cu")-- generate relocatable device code for device linker of dependents.-- if __device__ or __global__ functions will be called cross file,-- or dynamic parallelism will be used,-- this instruction should be opted in.-- add_cuflags("-rdc=true")-- generate SASS code for SM architecture of current hostadd_cugencodes("native")-- generate PTX code for the virtual architecture to guarantee compatibilityadd_cugencodes("compute_35")-- -- generate SASS code for each SM architecture-- add_cugencodes("sm_35", "sm_37", "sm_50", "sm_52", "sm_60", "sm_61", "sm_70", "sm_75")-- -- generate PTX code from the highest SM architecture to guarantee forward-compatibility-- add_cugencodes("compute_75")
--

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...