cuda学习(3):核函数

news/2025/1/12 4:07:11/

1. 核函数介绍

    1. 核函数是cuda编程的关键
    1. 通过xxx.cu创建一个cudac程序文件,并把cu交给nvcc编译(nvcc 是nvidia的c++编译器,编译cudac程序,是c++的超集),才能识别cuda语法
      在这里插入图片描述
      可以看到红框2中,编译.cpp文件用的CXX来做的,编译.cu文件是通过cuda操作的。
    1. __global__表示核函数,由host调用。__device__表示为设备函数,由device调用。
      在这里插入图片描述
      核函数内部的代码是在GPU上运行的,因此如果现在核函数内部调用某个函数,需要用__device__修饰,比如在核函数内部调用sigmoid函数,如果没有加device修饰则会报错,如下:
      在这里插入图片描述
      提示不能在__global__函数内调用host函数,应该写成device格式,因此在sigmoid函数前加上__device__前缀,就可以成功执行了,如下:
      在这里插入图片描述
      按道理print函数,包括exp也是host函数,为什么能够在核函数内部被正常调用呢?因为这些常规的函数,在GPU上都是有对应的实现的,invidia已经帮我们封装好了,都有相应的device版本和host版本。
    1. __host__表示为主机函数,由host调用。__shared__表示变量为共享变量。对于主机函数默认可以不用加__host__。但如果一个函数定义为device函数,但同时也想被host函数中去调用,则需要同时加上__host____device__
      在这里插入图片描述
    1. host调用核函数:function<<<gridDim,blockDim,sharedMemorySize,stream>>>(args...);
      函数以<<< >>>尖括号的形式包裹,中间包括4个参数,其中stream做异步的时候用流来控制,sharedMemorySize共享内存的大小,如果不需要共享内存的话,直接给个0就好了。gridDim,blockDim告诉GPU这个函数需要启动多少个线程。
      1) grimDim 和 blockDim的类型为dim3,dim3是有默认参数的dim3(unsigned int vx=1,unsigned int vy=1,unsigned int vz=1)
      在这里插入图片描述
      如果参数没有填,默认值为1,如果dim3(2),则对应为x=2,y=1,z=1
    1. 总的线程数的计算: nthreads = gridDim.x*gridDim.y*gridDim.z*blockDim.x*blockDim.y*blockDim.z
      在这里插入图片描述
      gridDim的上限值为gridDim(21亿,65536,65536) blockDim(1024,64,64),同时blodkDim还有另一个约束:blockDim.x*blockDim.y*blockDim.z <=1024
    1. 只有__global__修饰的函数(核函数)才可以用<<< >>>的方式调用
    1. 调用核函数是传值的,不能传引用,可以传递类、结构体等,核函数可以是模板,另外返回值必须是void
    1. 核函数的执行是异步的,也就是立即返回,如果给nullptr表示默认流,如果给的是stream就会加到stream里面去
    1. 线程layout主要用到blockDim,gridDim
    1. 核函数内访问线程索引主要用到threadIdx,blockIdx,blockDim,gridDim这些内置变量,我们定义了核函数执行的线程数,如果想知道当前执行的这段代码是在·第几个线程,它的Id是多少·,可以通过int idx = threadIdx.x + blockIdx.x * blockDim.x;;进行计算就可以得到线程索引。

2. 线程索引计算

核函数有4个内置变量:threadIdx,blockIdx,blockDim,gridDim,在核函数里面把blockDim,gridDim看作shape,告诉我们线程启动的总数目是多少,把threadIdx,blockIdx看作为index.
1) gridDim 定义为网格大小,对应的索引为blockIdx,比如grid为3,则blockIdx索引为0,1,2; blockIdx < gridDim
1) blockDim 定义为块大小,每个块有多少个线程,就是threadIdx: threadIdx < blockDim

2.1 索引计算方式

可以按照维度高低排序看待这个信息。dims:gridDim.z gridDim.y gridDim.x blockDim.z blockDim.y blockDim.x ;indexs:blockIdx.z,blockIdx.y,blockIdx.x,threadIdx.z,threadIdx.y.threadId.x,线程的绝对索引可以根据划线的方式计算:左乘右加,如下所示
在这里插入图片描述

也可以通过代码计算,计算线程的索引伪代码为:

position=0
for i in 6:position *= dims[i]position +=indexs[i]

举例:
假设核函数:

test_print_kernel <<< dim3(2),dim3(10),0,nullptr>>>(pdata,ndata)

此时就有gridDim.x=2, blockDim.x=10 对应的参数如下:

	    dims                 indexs(索引)gridDim.z   1         blockIdx.z    0gridDim.y   1         blockIdx.y    0gridDim.x   2         blockIdx.x    0-1blockDim.z  1         threadIdx.z   0blockDim.y  1         threadIdx.y   0blockDim.x  10        threadIdx.x   0-9

根据左乘右加的计算原则,就有:

int idx = threadIdx.x + blockIdx.x * blockDim.x;

因为blockIdx.x索引为0,1,不是0,所以需要参与计算


http://www.ppmy.cn/news/401238.html

相关文章

傻白入门芯片设计,SystemVerilog Assertion(SVA)学习(二十一)

目录 一、什么是断言&#xff1f; 二、断言分类&#xff1f; &#xff08;一&#xff09;从断言的功能上来说&#xff0c;广义的断言分为四类&#xff0c;分别满足不同的验证需要。 &#xff08;二&#xff09;从断言的触发方式上来分&#xff0c;断言又可以分成两大类&…

python GUI入门小工具开发,一键查询电脑配置、保持至数据库

python GUI入门小工具开发 用来练练手 效果图 1、创建一个界面 显示对应的系统配置信息 2、人工还是自动获取本机信息&#xff0c;这里采用的是人工点击获取 3、获取完配置信息后&#xff0c;点击提交并退出软件&#xff0c;数据之间插入至数据库。字段不够自己加就行了 impo…

计算机绘图电脑配置要求,【2人回答】CAD对电脑配置有什么要求?-3D溜溜网

AutoCAD 2017系统环境配置要求如下 1、操作系统 Microsoft Windows 10&#xff1b; Microsoft Windows 8.1&#xff1b;Microsoft Windows 7 SP1。 2、CPU 类型 1 千兆赫 (GHz) 或更高频率的 32 位 (x86) 或 64 位 (x64) 处理器。 3、内存 用于32 位 AutoCAD 2017 &#xff1…

恩兔NS-1刷ARMBIAN教程

简介 恩兔NS-1是一款基于海思Hi3798MV200的云盘产品&#xff0c;原厂app目前已无法使用&#xff0c;这款盒子比较奇葩的是居然内置了SATA接口&#xff0c;可谓市场上独一无二了。据大佬说是砍了USB3.0而换来的SATA&#xff0c;所以折腾起来异常坎坷&#xff0c;再次特别感谢稍息…

proxmox VE GPU显卡穿透

gpu穿透实际意义并不是很大(一块物理显卡同时只能提供给一个虚拟机使用),读者可做为参考资料,了解一下技术实现。在常规的办公环境下,需要使用高配置专业显卡的用户比例一般不会很高,一个简单可行的办法是:大部分人办公使用桌面虚拟化,而作图、做视频处理的少数用户,单…

局域网电脑资产搜集管理

局域网电脑硬件信息收集 &#xff08;电脑硬件采集工具&#xff09; 可以通过局域网采集电脑配置信息并集中到服务端。 最新版本已更新 链接&#xff1a;https://pan.baidu.com/s/1Xs4xHZkLqAdjD52dXKa0Mg 提取码&#xff1a;kolh 新版本功能更丰富,联系我获取最新版本。 …

remix os显卡linux,Remix OS 系统 PC版下载和评测 | Remix OS是什么系统_什么值得买

Remix OS 系统 PC版 体验记 2016-01-13 13:52:50 19点赞 95收藏 39评论 Remix OS,是一个能够在传统计算机上,为用户带来类似Windows的Android体验的软件。简单来说,它就是一个装在U盘里可以随声携带插上电脑就能用的安卓系统。1月12日刚刚开放下载,官网请戳Remix OS for PC…

KVM+显卡直通(passthrough)

方法一&#xff1a;. 硬件条件 首先要确定主板和CPU都支持VT-d技术&#xff0c;即Virtualization Technology for Direct I/O&#xff08;英特尔虚拟技术&#xff09;。近年的产品应该都支持此技术。 在BIOS里将 还要确定要直通的显卡支持PCI Pass-through。似乎A卡对于直通的…