我最近在编程中遇到了一个简单的概念,但是当我尝试在 cuda 中实现它时我卡住了。假设我有数千个元素,我想找到它们之间最近的一对。我atomicMIN
在全局内存中使用(假设我们不想减少),所以如果每个线程计算的距离小于存储在全局变量中的距离,atomicCAS 将用较小的值替换它。例如我有全局变量float gbl_min_dist
为此,我使用以下代码:
__device__ inline float atomicMin(float *addr, float value){
float old = *addr, assumed;
if( old <= value ) return old;
do{
assumed = old;
old = atomicCAS((unsigned int*)addr, __float_as_int(assumed), __float_as_int(value));
}while( old!=assumed );
return old;
}
现在假设我们想要存储靠得更近的两个点的索引,并且atomicMIN
已经成功地将旧的最小距离替换为由这两个点计算出的最小距离。我的意思是,当且仅当它的距离刚刚在全局变量中成功交换时,我只想存储当前距离较小的两个点的索引
typedef struct {float gbl_min_dist,
unsigned int point1,
unsigned int point2;} global_closest_points;
因此,在这里,当一个线程执行时atomicMIN
,如果该线程建议的要比较的值被交换,gbl_min_dist
那么我还需要将 p1、p2 与线程中的值交换。如果gbl_min_dist
没有交换,那么我不想存储这些点,因为这会给出错误的点但正确的最小距离。
是否有任何返回值来检查是否atomicCAS
进行了交换?
关于如何在 中实现这一点的任何想法atomicMIN
?
提前致谢