![]() |
1
83
块和网格变量可以是1、2或3维。处理一维数据时,通常只创建一维块和网格。 在CUDA文档中,定义了这些变量 here
特别是,当x维中的线程总数(griddim.x*blockdim.x)为
小于
我希望处理的数组的大小,然后创建一个循环并让线程网格在整个数组中移动是常见的做法。在这种情况下,在处理一个循环迭代之后,每个线程必须移动到下一个未处理的位置,该位置由
你可以考虑参加一些介绍性的CUDA网络研讨会 NVIDIA webinar page . 例如,这2:
如果你想更好地理解这些概念,那就花2个小时吧。 网格跨步循环的一般主题将在一些细节中介绍 here . |
|
2
46
转述自 CUDA Programming Guide :
你似乎对cuda的线程层次结构有点困惑;简而言之,对于内核,将有1个网格(我总是将其视为一个三维立方体)。它的每个元素都是一个块,这样一个声明为
也就是说,只使用块和网格的x维是很常见的,这就是您所讨论的代码所做的事情。如果你使用的是一维数组,这一点尤其重要。那样的话,你的
所以如果你用参数启动一个内核
然后在你的内核里
因此在计算中
但是,如果你有
那么你基本上会有:
|
![]() |
3
1
在这个源代码中,我们甚至有4个线程,内核函数可以访问所有10个数组。怎么用?
为什么我们不创建10个线程(例如)
这个源代码就是这个例子。 数组为10,CUDA线程为4。 如何仅通过4个线程访问所有10个数组。 请参阅cuda详细信息中关于threadidx、blockidx、blockdim、griddim含义的页面。 在这个源代码中,
我们的线程数是4,因为2*2(块*线程)。 在add内核函数中,我们可以访问线程的0、1、2、3索引
-gt;
0+0×2=0 1+0×2=1 0+1×2=2 –1+1*2=3英镑 如何访问索引4、5、6、7、8、9的其余部分。 while循环中有一个计算
**内核的首次调用** -1回路:0+2*2=4 -2回路:4+2*2=8 -3循环:8+2*2=12(但这个值是假的,而不是!) **内核第二次调用** -1回路:1+2*2=5 -2回路:5+2*2=9 -3循环:9+2*2=13(但此值为false,而out!) **内核第三次调用** -1回路:2+2*2=6 -2循环:6+2*2=10(但这个值是假的,而不是!) **内核第四次调用** -1回路:3+2*2=7 -2循环:7+2*2=11(但这个值是假的,而不是!) 因此,0、1、2、3、4、5、6、7、8、9的所有索引都可以通过tid值访问。 请参阅本页。 http://study.marearts.com/2015/03/to-process-all-arrays-by-reasonably.html 我不能上传图片,因为名声不好。 |