行列の 2 つのサブ行列間のペアごとの距離を計算したいと考えています。たとえば、行列 A (MxN) と、その行列 B1 (mxn) と B2 (kxt) の 2 つのブロックがあります。より具体的には、B2 の他のすべての要素からの B1(1,1) 要素の距離を計算し、すべての B1 要素に対してこのプロセスを実行したいと考えています。より明確にするために、B1とB2は行列のコンパクトな部分ではない可能性があり、基本的に私が知っている情報は、行列A上のB1とB2の要素の座標です。ここに例があります。
for(int i = 0; i < nRowsCoordsB1 ; i++ ){//nRows of B1
for(int j = 0; j < nRowsCoordsB2 ; j++ ){//nRows of B2
//CoordsofB1 is a nRowsB1x2 matrix that contains the element coordinates of the B1 sub matrix
a_x = CoordsofB1[ i ]; //take the x coord of the corresponding row i
a_y = CoordsofB1[ i + nRowsCoordsB1 ]; //take the y coord of the corresponding row
b_x = CoordsofB2[ j ];
b_y = CoordsofB2[ j + nRowsCoordsB2 ];
int element1 = A[ a_x + a_y*nRowsofA ];
int element2 = A[ b_x + b_y*nRowsofA ] ;
sum +=abs( element1 - element2 ) ;
}
}
*Output = sum/(float)(numberOfElementsofB1*numberOfElementsofB2);
今、私はCUDAで計算をスピードアップしたいと思っています:)私はCudaの視点が初めてなので、少し複雑でした。これで、Matrix レベルでブロック スレッドを割り当てるロジックは理解できたと思いますが、ここでは、CoordsofB1 と CoordsofB2 というサイズの異なる 2 つの異なるマトリックス部分があるため、それらにアクセスする方法について少し混乱します。座標を作成し、穴マトリックスで使用します。制約を使用して A で作業する必要があると考えましたが、明確な考えはありませんでした。
また、for ループの最後で合計が数量で除算されるという事実は、cuda 変換コードで誰を組み合わせるかについて私を混乱させます。
あらゆる提案、スニペット、例、参照は素晴らしいでしょう。
PS: 列優先の順序を使用する理由は、コードが matlab で評価されるためです。
更新:最大のサブ行列 B1 または B2 のサイズに等しいサイズのスレッド ブロックを割り当て、正しい条件を使用してそれらを操作できますか? どうすればいいのかわからなかったので、最後の行にコメントします。コメントはありますか?
int r = blockDim.x * blockIdx.x + threadIdx.x; // rows
if( r < nRowsCoordsB1 ){
a_x = CoordsofB1[ r ];
a_y = CoordsofB1[ r + nRowsCoordsB1 ];
if( r < nRowsCoordsB2 ;){
b_x = CoordsofB2[ r ];
b_y = CoordsofB2[ r + nRowsCoordsB2 ];
int element1 = A[ a_x + a_y*nRowsofA ];
int element2 = A[ b_x + b_y*nRowsofA ] ;
sum +=abs( element1 - element2 ) ;
}
}
//*Output = sum/(float)(numberOfElementsofB1*numberOfElementsofB2);
ここにスケッチ
B1 と B2 内の各要素の座標があり、値の差を計算したい
[ (B1(1,1) - B2(1,1)) + (B1(1,1) - B2(1,2)) + ... + (B1(1,1) - B2(:,: )) ] +
[ (B1(1,2) - B2(1,1)) + (B1(1,2) - B2(1,2)) + ... + (B1(1,2) - B2(:,: )) ] +
[ (B1(:,:) - B2(1,1)) + (B1(:,:) - B2(1,2)) + ... + (B1(:,:) - B2(:,:) )) ] .