算上GPU平方欧氏距离矩阵(Calculate squared Euclidean distance

2019-07-30 02:24发布

p是第一组位置,每一行给出了一个具体的点的坐标的矩阵。 类似地,令q为第二组位置,其中每一行给出的特定点的坐标的矩阵。

然后式两两平方欧氏距离为:

k(i,j) = (p(i,:) - q(j,:))*(p(i,:) - q(j,:))', 

其中p(i,:)表示i第矩阵的行p ,和p'表示的转置p

我想计算矩阵k上支持CUDA的GPU(的NVidia特斯拉)的C ++。 我的OpenCV V.2.4.1与GPU的支持,但我接受其他的选择,比如推力库。 不过,我不是太熟悉的GPU编程。 您能否提供一个有效的方法来完成这项任务? 我应该使用什么C ++库?

Answer 1:

这个问题看起来很简单,以使库矫枉过正。

如果不知道的范围ij ,我建议你分区k成每32个线程的多块,并在每个块中,计算

float sum, myp[d];
int i = blockIdx.x*blockDim.x + threadIdx.x;
for ( int kk = 0 ; kk < d ; kk++ )
    myp[kk] = p(i,kk);
for ( j = blockIdx.y*blockDim.y ; j < (blockIdx.y+1)*blockDim ; j++ ) {
    sum = 0.0f;
    #pragma unroll
    for ( int kk = 0 ; kk < d ; kk++ ) {
        temp = myp[kk] - q(j,kk);
        sum += temp*temp;
        }
    k(i,j) = sum;
    }

其中我假设数据已经d尺寸和写入p(i,k) q(j,k)k(i,j)为表示于二维阵列的访问。 我也冒昧的假设,你的数据类型为float

请注意,这取决于如何k存储,例如行优先或列为主,你可能要循环i每个线程,而不是让凝聚的写入k



文章来源: Calculate squared Euclidean distance matrix on GPU