gpt4 book ai didi

cuda - 如何计算正在启动的 CUDA 线程数?

转载 作者:行者123 更新时间:2023-12-03 09:20:50 25 4
gpt4 key购买 nike

我有一个 CUDA 卡,具有:Cuda 计算能力 (3.5) 如果我有一个诸如 <<<2000,512>>> 的调用,内核中发生的迭代次数是多少?我以为是(2000*512),但测试并不能证明这一点?我还想确认我计算变量的方式是正确的。

情况是,在内核中,我根据线程号递增传递的全局内存号:

  int thr = blockDim.x * blockIdx.x + threadIdx.x;
worknumber = globalnumber + thr;

因此,当我返回到 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);
}
}

最佳答案

如果您使用配置 <<<X,Y>>> 启动内核,并且您没有违反 CUDA 使用的任何规则,那么启动的线程数实际上将为 X*Y (或者如果我们谈论 2 或 3 维线程 block 和/或网格,则对其进行适当的修改,即X.x*X.y*X.z*Y.x*Y.y*Y.z)。

printf来自 CUDA 内核有各种 limitations 。因此,产生大量的printf CUDA 内核的输出通常是不明智的,并且对于验证大型网格中启动的线程数量可能没有用。

如果您想跟踪实际启动的线程数,您可以使用全局变量并让每个线程自动更新它。像这样的事情:

$ 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
$

请注意,原子操作可能相对较慢。出于性能原因,我不建议定期使用此类代码。但如果您想说服自己启动的线程数,它应该给出正确的答案。

关于cuda - 如何计算正在启动的 CUDA 线程数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31627410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com