나는 윈도우 잉 방법을 사용하여 FFT와 교차 상관을 비교하려고합니다.Matlab과 CUDA 상관 관계 비교 및 2D 배열에서의 감소
내 MATLAB 코드는 다음과 같습니다
isize = 20;
n = 7;
for i = 1:n %%7x7 xcorr
for j = 1:n
xcout(i,j) = sum(sum(ffcorr1 .* ref(i:i+isize-1,j:j+isize-1))); %%ref is 676 element array and ffcorr1 is a 400 element array
end
end
유사한 CUDA 커널 : 나는
어떻게 든int blocksize = 64; //multiple of 32
int nblocks = (pix3+blocksize-1)/blocksize; //round to max pix3 = 400
xc_corr <<< nblocks,blocksize >>> (ffcorr1, ref_d, pix3, isize, npix, xcout, xc_partial);
cudaThreadSynchronize();
로 내 커널이 호출 한
__global__ void xc_corr(double* in_im, double* ref_im, int pix3, int isize, int n, double* out1, double* temp1, double* sum_temp1)
{
int p = blockIdx.x * blockDim.x + threadIdx.x;
int q = 0;
int i = 0;
int j = 0;
int summ = 0;
for(i = 0; i < n; ++i)
{
for(j = 0; j < n; ++j)
{
summ = 0; //force update
for(p = 0; p < pix1; ++p)
{
for(q = 0; q < pix1; ++q)
{
temp1[((i*n+j)*pix1*pix1)+p*pix1+q] = in_im[p*pix1+q] * ref_im[(p+i)*pix1+(q+j)];
sum_temp1[((i*n+j)*pix1*pix1)+p*pix1+q] += temp1[((i*n+j)*pix1*pix1)+p*pix1+q];
out1[i*n+j] = sum_temp1[((i*n+j)*pix1*pix1)+p*pix1+q];
}
}
}
}
, 나는 DIFF에 대한 작업을 수행 할 때 출력 파일을 보면, CUDA 커널은 처음 400 개 요소 만 계산합니다.
이 커널을 작성하는 올바른 방법은 무엇입니까 ??
또한 커널에서 아래와 같이 i, j를 선언 할 때의 차이점은 무엇입니까 ??
int i = blockIdx.x * blockDim.y + threadIdx.x * threadIdx.y;
int j = blockIdx.y * blockDim.x + threadIdx.x * threadIdx.y;
pix3이란 무엇입니까? 픽셀 길이? 또는 다른 것? – Xzhsh
@Xzhsh pix3은 픽셀의 길이이며 팁에 대해 감사 드리며 400 (20x20) – vivekv80