问题说明了一切;
假设每个线程都在执行类似
的操作value=blockDim.x*blockIdx.x+threadIdx.x;
result=f(value);
其中f是一个设备函数,它很容易通过添加atomicMax()调用找到最大结果,但是你怎么能找出它的值是什么?
答案 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语句方法也可能在缩减结束时起作用。我可能必须在我的代码中尝试...)