我有一个 CUDA 卡,具有: Cuda 计算功能 (3.5) 如果我有一个诸如 <<<2000,512>>> 的调用,内核中发生的迭代次数是多少?我以为是(2000*512),但测试并不能证明这一点?我还想确认我计算变量的方式是正确的。
情况是,在内核中,我根据线程号递增传递的全局内存号:
int thr = blockDim.x * blockIdx.x + threadIdx.x;
worknumber = globalnumber + thr;
Run Code Online (Sandbox Code Playgroud)
因此,当我返回到 CPU 时,我想确切地知道有多少增量,以便我可以跟踪,这样当我调用内核 GPU 处理下一组数字时,我就不会重复或跳过数字。
编辑 :
__global__ void allin(uint64_t *lkey, const unsigned char *d_patfile)
{
uint64_t kkey;
int tmp;
int thr = blockDim.x * blockIdx.x + threadIdx.x;
kkey = *lkey + thr;
if (thr > tmp) {
tmp = thr;
printf("%u \n", thr);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您使用配置启动内核<<<X,Y>>>,并且没有违反 CUDA 使用的任何规则,那么启动的线程数实际上将为 X*Y(或者如果我们谈论的是 2 或 3,则对其进行适当的修改)维度线程块和/或网格,即X.x*X.y*X.z*Y.x*Y.y*Y.z)。
printfCUDA 内核有各种限制。因此,从 CUDA 内核生成大量printf输出通常是不明智的,并且对于验证大型网格中启动的线程数量可能没有用。
如果您想跟踪实际启动的线程数,您可以使用全局变量并让每个线程自动更新它。像这样的东西:
$ cat t848.cu
#include <stdio.h>
__device__ unsigned long long totThr = 0;
__global__ void mykernel(){
atomicAdd(&totThr, 1);
}
int main(){
mykernel<<<2000,512>>>();
unsigned long long total;
cudaMemcpyFromSymbol(&total, totThr, sizeof(unsigned long long));
printf("Total threads counted: %lu\n", total);
}
$ nvcc -o t848 t848.cu
$ cuda-memcheck ./t848
========= CUDA-MEMCHECK
Total threads counted: 1024000
========= ERROR SUMMARY: 0 errors
$
Run Code Online (Sandbox Code Playgroud)
请注意,原子操作可能相对较慢。出于性能原因,我不建议定期使用此类代码。但如果您想说服自己启动的线程数,它应该给出正确的答案。
| 归档时间: |
|
| 查看次数: |
4333 次 |
| 最近记录: |