CUDA可以做argmax吗?

| 问题说明了一切; 假设每个线程都在做类似的事情
value=blockDim.x*blockIdx.x+threadIdx.x;
result=f(value);
其中f是设备函数,它很容易通过添加atomicMax()调用来找到最大结果,但是如何找到该值呢?
已邀请:
这有意义吗?只需添加一条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语句方法也可能在简化的结尾起作用。我可能必须在我的代码中尝试一下...)

要回复问题请先登录注册