CUDA 之基础

回答此问题,先给出网络配置的参数形式——<<<Dg,Db,Ns,S>>>,各个参数含义如下:

Dg:定义整个grid的维度,类型Dim3,但是实际上目前显卡支持两个维度,所以,dim3<<Dg.x, Dg.y, 1>>>z维度默认只能为1,上面显示出这个最大有65536*65536*1,每行有65536block,每列有65536block,整个grid中一共有65536*65536*1个block

Db:定义了每个block的维度,类型Dim3,比如512*512*64,这个可以定义3维尺寸,但是,这个地方是有讲究了,三个维度的积是有上限的,对于计算能力1.01.1GPU,这个值不能大于768,对于1.21.3的不能大于1024,对于我们试一试的这块级别高点的,不能大于1536。这个值可以获取哦——maxThreadsPerBlock

Ns:这个是可选参数,设定最多能动态分配的共享内存大小,比如16k,单不需要是,这个值可以省略或写0

S也是可选参数,表示流号,默认为0流这个概念我们这里不说。

接着,我想解决几个你肯定想问的两个问题,因为我看很多人想我这样的问这个问题:

1 block内的thread我们是都饱和使用吗?

答:不要,一般来说,我们开128256个线程,二维的话就是16*16

2 grid内一般用几个block呢?

答:牛人告诉我,一般来说是你的流处理器的4倍以上,这样效率最高。

回答这两个问题的解释,我想抄袭牛人的一段解释,解释的好的东西就要推广呀:

GPU的计算核心是以一定数量的Streaming Processor(SP)组成的处理器阵列,NV称之为Texture Processing Clusters(TPC),每个TPC中又包含一定数量的Streaming Multi-Processor(SM),每个SM包含8SPSP的主要结构为一个ALU(逻辑运算单元),一个FPU(浮点运算单元)以及一个Register File(寄存器堆)SM内包含有一个Instruction Unit、一个Constant Memory、一个Texture Memory8192Register、一个16KBShare Memory8Stream Processor(SP)和两个Special Function UnitsSFU)。(GeForce9300M GS只拥有1SM ThreadCUDA模型中最基本的运行单元,执行最基本的程序指令。Block是一组协作ThreadBlock内部允许共享存储,每个Block最多包含512ThreadGrid是一组Block,共享全局内存。Kernel是在GPU上执行的核心程序,每一个Grid对应一个Kernel任务。 在程序运行的时候,实际上每32Thread组成一个Warp,每个 warp 块都包含连续的线程,递增线程 ID WarpMP的基本调度单位,每次运行的时候,由于MP数量不同,所以一个Block内的所有Thread不一定全部同时运行,但是每个Warp内的所有Thread一定同时运行。因此,我们在定义Block Size的时候应使其为Warp Size的整数倍,也就是Block Size应为32的整数倍。理论上Thread越多,就越能弥补单个Thread读取数据的latency ,但是当Thread越多,每个Thread可用的寄存器也就越少,严重的时候甚至能造成Kernel无法启动。因此每个Block最少应包含64Thread,一般选择128或者256,具体视MP数目而定。一个MP最多可以同时运行768Thread,但每个MP最多包含8Block,因此要保持100%利用率,Block数目与其Size有如下几种设定方式: Ø 2 blocks x 384 threads Ø 3 blocks x 256 threads Ø 4 blocks x 192 threads Ø 6 blocks x 128 threads Ø 8 blocks x 96 threads 

这些电很重要啊,必须要充!不然,我就很难理解为什么网络线程如何分配的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CUDA编程是一种用于并行计算的编程模型,它允许开发者利用GPU的并行计算能力来加速计算任务。CUDA编程的基本步骤包括编写源代码、预处理、编译、汇编和链接,最终生成可执行文件。\[1\]在CUDA程序中,可以使用主机函数和核函数。主机函数在主机上执行,而核函数在GPU上执行。编译器nvcc会将纯粹的C++代码交给C++编译器处理,而自己负责编译剩下的部分。CUDA程序的源文件扩展名通常是.cu。\[2\] 在CUDA编程中,核函数中的数据与线程是一一对应的。通过使用"单指令-多线程"的方式编写代码,可以将数组元素指标与线程指标对应起来。例如,可以使用以下代码来计算数组元素的索引: unsigned int idx_x = blockDim.x * blockIdx.x + threadIdx.x;\[3\] 总结来说,CUDA编程基础包括编写源代码、编译、汇编和链接,使用主机函数和核函数,以及将数据与线程对应起来。这些基础知识可以帮助开发者利用GPU的并行计算能力来加速计算任务。 #### 引用[.reference_title] - *1* *2* *3* [CUDA 编程 基础与实践(樊哲勇) 摘录](https://blog.csdn.net/weixin_47955824/article/details/116491638)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值