Parallel processing 在CUDA中查找最大值

Parallel processing 在CUDA中查找最大值,parallel-processing,cuda,reduction,Parallel Processing,Cuda,Reduction,我正在尝试用CUDA编写一个代码来查找最大值 对于给定的一组数字 假设您有20个数字,内核运行在2块5个线程上。现在假设10个线程同时比较前10个值,线程2找到一个最大值,因此线程2正在更新全局内存中的最大值变量。当线程2正在更新时,将使用旧值进行比较的其余线程(1,3-10)会发生什么情况 如果我使用atomicCAS()锁定全局变量,线程(1,3-10)会使用旧的最大值进行比较吗?如何克服这个问题?这是一个纯粹的减少问题。这里有一个由NVIDIA提供的优化减少GPU的好方法。您可以使用相同的

我正在尝试用CUDA编写一个代码来查找最大值 对于给定的一组数字

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


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

这是一个纯粹的减少问题。这里有一个由NVIDIA提供的优化减少GPU的好方法。您可以使用相同的技术来查找所有元素的最小值、最大值或总和。

除非您试图编写精简内核,否则最简单的方法就是简单地使用。

推力库的链接已断开
如果有人认为在这种情况下使用它很有用,您可以在此处找到文档:

我也在寻找同样的答案,但发现大多数答案对我这样的新手来说都太可怕了。这里是我的示例代码,以找到最大值。请让我知道这是否正确使用

__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]);
    }
}
\u全局__
无效查找最大值(整数最大值x,整数最大值y,浮点*tot,浮点*x,浮点*y)
{
int i=blockIdx.x*blockDim.x+threadIdx.x;
int j=blockIdx.y*blockDim.y+threadIdx.y;

如果(ix[i]
,并且您的函数甚至不使用
y[]
arg。)将所有内容原子地交换到一个共享计数器中,而不是在多个点上使用一个本地最大值,然后在最后合并来自多个线程的结果,这看起来也非常低效。(我不知道CUDA所以IDK怎么做。)