J'essaie de comparer la corrélation croisée en utilisant FFT vs en utilisant la méthode de fenêtrage.comparaison Matlab vs CUDA corrélation et réduction sur un tableau 2D
Mon code Matlab est:
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
similaire noyau CUDA:
__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];
}
}
}
}
Je l'ai appelé dans mon noyau comme
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();
D'une certaine façon, quand je fais un diff sur le fichier de sortie, je vois que le noyau CUDA ne calcule que les 400 premiers éléments.
Quelle est la bonne façon d'écrire ce noyau ??
Aussi, quelle est la différence en déclarant i, j comme indiqué ci-dessous dans mon noyau ??
int i = blockIdx.x * blockDim.y + threadIdx.x * threadIdx.y;
int j = blockIdx.y * blockDim.x + threadIdx.x * threadIdx.y;
Qu'est-ce que pix3? longueur du pixel? ou autre chose? – Xzhsh
@Xzhsh pix3 est la longueur du pixel et est égal à 400 (20x20) – vivekv80