我正在尝试在 CUDA 中编写代码来查找给定数字集的最大值。
假设您有 20 个数字,并且内核在 2 个 5 个线程的块上运行。现在假设 10 个线程同时比较前 10 个值,线程 2找到一个最大值,因此线程 2 正在更新全局内存中的最大值变量。当线程 2 更新时,将使用旧值进行比较的剩余线程 (1,3-10) 会发生什么情况?
如果我使用 atomicCAS() 锁定全局变量,线程 (1,3-10) 是否会使用旧的最大值进行比较?我该如何克服这个问题?
我正在尝试在 CUDA 中编写代码来查找给定数字集的最大值。
假设您有 20 个数字,并且内核在 2 个 5 个线程的块上运行。现在假设 10 个线程同时比较前 10 个值,线程 2找到一个最大值,因此线程 2 正在更新全局内存中的最大值变量。当线程 2 更新时,将使用旧值进行比较的剩余线程 (1,3-10) 会发生什么情况?
如果我使用 atomicCAS() 锁定全局变量,线程 (1,3-10) 是否会使用旧的最大值进行比较?我该如何克服这个问题?
这纯粹是一个减少问题。这是 NVIDIA 的一个很好的演示,用于优化 GPU 上的缩减。您可以使用相同的技术来找到所有元素的最小值、最大值或总和。
Thrust 库的链接已损坏。
如果有人发现在这种情况下使用它很有用,您可以在此处找到文档:
推力,极值减少
除非您尝试编写缩减内核,否则最简单的方法就是使用CUBLAS。
我寻找了相同的答案,但发现大多数对于像我这样的新手来说都太强大了。这是我查找最大值的示例代码。请让我知道这是否正确使用。
__global__
void find_max(int max_x, int max_y, float *tot, float *x, float *y)
{
int i = blockIdx.x*blockDim.x + threadIdx.x;
int j = blockIdx.y*blockDim.y + threadIdx.y;
if(i < max_x && j<max_y) {
if(*tot < x[i])
atomicExch(tot, x[i]);
}
}