在CUDA中查找最大值

时间:2011-03-10 05:44:48

标签: parallel-processing cuda reduction

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

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

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

3 个答案:

答案 0 :(得分:10)

这纯粹是一个减少问题。这是NVIDIA优化presentation以优化GPU的减少。您可以使用相同的技术来查找所有元素的最小值,最大值或总和。

答案 1 :(得分:-1)

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

答案 2 :(得分:-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]);
    }
}