CUDA可以做argmax吗?

时间:2011-04-18 23:24:15

标签: c cuda mapreduce gpgpu

问题说明了一切;

假设每个线程都在执行类似

的操作
value=blockDim.x*blockIdx.x+threadIdx.x;
result=f(value);

其中f是一个设备函数,它很容易通过添加atomicMax()调用找到最大结果,但是你怎么能找出它的值是什么?

1 个答案:

答案 0 :(得分:1)

这有意义吗?只需添加一个if语句,将最大结果与线程结果进行比较。如果匹配,则保存线程的值。

value=blockDim.x*blockIdx.x+threadIdx.x;
result=f(value);
atomicMax(max,result);

if result==*max:
    max_value = value;

或者,如果多个线程具有最大结果,则可能需要指定行为...例如,采用最低线程:

value=blockDim.x*blockIdx.x+threadIdx.x;
result=f(value);
atomicMax(max,result);

if result==*max:
    atomicMin(max_value,value);

也就是说,如果你从每个线程中找到最大结果,你将需要使用简化而不是atomicMax。如果我理解正确的话,atomicMax函数基本上将按顺序执行,而减少将在很大程度上并行执行。当您使用缩减时,您可以手动跟踪值以及结果 - 这就是我所做的。 (虽然上面的if语句方法也可能在缩减结束时起作用。我可能必须在我的代码中尝试...)