最近、プログラミングで単純な概念に遭遇しましたが、それを 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;
}
ここで、互いに接近していて、が古い最小距離をそれらの 2 つのポイントによって計算された距離に正常に置き換えた2 つのポイントのインデックスを保存したいとします。atomicMIN
つまり、グローバル変数で距離が正常にスワップされた場合にのみ、現在距離が小さい2つのポイントのインデックスのみを保存したいということです
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
ますか?
前もって感謝します