4

我正在尝试在 CUDA 中编写代码来查找给定数字集的最大值。

假设您有 20 个数字,并且内核在 2 个 5 个线程的块上运行。现在假设 10 个线程同时比较前 10 个值,线程 2找到一个最大值,因此线程 2 正在更新全局内存中的最大值变量。当线程 2 更新时,将使用旧值进行比较的剩余线程 (1,3-10) 会发生什么情况?

如果我使用 atomicCAS() 锁定全局变量,线程 (1,3-10) 是否会使用旧的最大值进行比较?我该如何克服这个问题?

4

4 回答 4

10

这纯粹是一个减少问题。这是 NVIDIA 的一个很好的演示,用于优化 GPU 上的缩减。您可以使用相同的技术来找到所有元素的最小值、最大值或总和。

于 2011-03-10T06:12:04.630 回答
1

Thrust 库的链接已损坏。
如果有人发现在这种情况下使用它很有用,您可以在此处找到文档:
推力,极值减少

于 2017-08-11T08:30:48.843 回答
-1

除非您尝试编写缩减内核,否则最简单的方法就是使用CUBLAS

于 2011-03-10T07:42:13.153 回答
-1

我寻找了相同的答案,但发现大多数对于像我这样的新手来说都太强大了。这是我查找最大值的示例代码。请让我知道这是否正确使用。

__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]);
    }
}
于 2019-10-17T15:18:56.753 回答