我想计算矩阵的两个子矩阵之间的成对距离。例如,我有一个矩阵 A (MxN) 和该矩阵 B1 (mxn) 和 B2 (kxt) 的两个块。更具体地说,我想计算 B1(1,1) 元素与 B2 的所有其他元素的距离,并对所有 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 的新手,所以我发现它有点复杂。从现在开始,我认为我已经理解了在矩阵级别分配块线程的逻辑,但事实上我有两个不同大小的矩阵部分 CoordsofB1 和 CoordsofB2,这让我有点困惑如何访问它们采取坐标并在孔矩阵中使用它们。我认为我们应该使用约束在 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(:,: )) ]。