2012-06-25 5 views
3

p은 각 행이 특정 점의 좌표를 제공하는 위치의 첫 번째 세트의 행렬입니다. 마찬가지로 q을 각 행이 특정 점의 좌표를 제공하는 두 번째 위치 집합의 행렬이라고 합니다.GPU에서 제곱 유클리드 거리 행렬을 계산하십시오.

이어서 페어에 대한 수식의 제곱 유클리드 거리이다 :

k(i,j) = (p(i,:) - q(j,:))*(p(i,:) - q(j,:))', 
p(i,:) 매트릭스 pi 번째 행을 나타내고

pp'는의 전치를 나타낸다.

C++의 CUDA 지원 GPU (NVidia Tesla)에서 k 행렬을 계산하고 싶습니다. OpenCV v.2.4.1은 GPU를 지원하지만 다른 라이브러리 (예 : 추력 라이브러리)에 개방되어 있습니다. 그러나 GPU 프로그래밍에 익숙하지 않습니다. 이 작업을 수행하는 효율적인 방법을 제안 할 수 있습니까? 어떤 C++ 라이브러리를 사용해야합니까?

+1

그런데 유클리드 거리의 제곱을 계산하고있는 중입니다 ... – Pedro

+0

@ 페드로 : "pairwise * 제곱 * 유클리드 거리"(emphasis mine)로 묘사 된 것 같습니다. ..... – talonmies

+0

@talonmies : 그래, 편집 타임 스탬프의 외모에 의해, 그냥 내 의견과 겹쳤습니다. – Pedro

답변

3

문제는 라이브러리 과다 사용으로 인해 간단 해 보입니다.

ij의 범위를 모른 채, 나는 당신의 데이터를 가지고 있다고 가정하고 어디

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++) { 
    #pragma unroll 
    for (sum = 0.0f , int kk = 0 ; kk < d ; kk++) { 
     temp = myp[kk] - q(j,kk); 
     sum += temp*temp; 
     } 
    k(i,j) = sum; 
    } 

계산하면 32 개 스레드 각각의 각 블록에 복수의 블록으로 k 분할 좋을 것 d 치수 및 쓰기 p(i,k), q(j,k)k(to mean an access to a two-dimensional array. I also took the liberty in assuming that your data is of type float`.

k이 저장되는 방법에 따라 다릅니다. 행 메이저 또는 열 메이저 일 경우 합계 쓰기를 k으로하려면 대신 스레드 당 i을 반복 할 수 있습니다.

+0

쿠다 C 코드에 감사드립니다! GPU 매트릭스 연산을 지원하는 OpenCV 라이브러리 (필자는 어쨌든 사용합니다)를 가지고 있으므로 먼저 시도해보십시오. – Alexey

관련 문제