【发布时间】:2018-04-20 17:08:49
【问题描述】:
假设你有一个想要运行 2048 次的 cuda 内核,那么你可以这样定义你的内核:
__global__ void run2048Times(){ }
然后你从你的主代码中调用它:
run2048Times<<<2,1024>>>();
到目前为止一切似乎都很好。但是现在说,当您调用内核数百万次时,出于调试目的,您想要验证您实际调用内核的次数是多少次。
我所做的是将一个指针传递给内核,并在每次内核运行时对指针进行 ++ 处理。
__global__ void run2048Times(int *kernelCount){
kernelCount[0]++; // Add to the pointer
}
但是,当我将该指针复制回主函数时,我得到“2”。
起初它让我感到困惑,然后在 5 分钟的咖啡和来回踱步之后,我意识到这可能是有道理的,因为 cuda 内核同时运行 1024 个自身实例,这意味着内核覆盖了“kernelCount” [0]" 而不是真正添加它。
所以我决定这样做:
__global__ void run2048Times(int *kernelCount){
// Get the id of the kernel
int id = blockIdx.x * blockDim.x + threadIdx.x;
// If the id is bigger than the pointer overwrite it
if(id > kernelCount[0]){
kernelCount[0] = id;
}
}
天才!!我认为这可以保证工作。直到我运行它并得到了 0 到 2000 之间的各种数字。
这告诉我上面提到的问题在这里仍然发生。
有没有办法做到这一点,即使它涉及强制内核暂停并等待彼此运行?
【问题讨论】:
-
这听起来像是一个分析工作......