下面是我期望能夠使用的cuda代碼。我得到一個「雙重免費或腐敗」的錯誤。經過大量的調試,我發現有問題的一行是「cudaMemcpy(out,out_device ...),我完全傻眼了,爲什麼這個錯誤仍然存在,任何幫助將不勝感激。 。cuda glib error
void covariance2(float alpha, complex float* in, complex float* out, int dims[5])
{
int x = dims[0];
int y = dims[1];
int z = dims[2];
int N = dims[3];
int M = dims[4];
ComplexFloat* in_device;
ComplexFloat* out_device;
int siz = x*y*z*N*(N+1)/2;
assert(cudaMalloc(&in_device, sizeof(ComplexFloat)*x*y*z*N*M) == cudaSuccess);
assert(cudaMalloc(&out_device, sizeof(ComplexFloat)*siz) == cudaSuccess);
assert(cudaMemcpy(in_device, in, sizeof(ComplexFloat)*x*y*z*N*M, cudaMemcpyHostToDevice) == cudaSuccess);
dim3 numBlocks(x,y,z);
dim3 numThreads(1);
size_t sharedMem = N*M + N*(N+1)/2;
cudaMemcpy(out, out_device, sizeof(ComplexFloat)*siz, cudaMemcpyDeviceToHost);
cudaFree(in_device);
cudaFree(out_device);
}
int main()
{
int xxx = 2;
int yyy = 2;
int zzz = 1;
int MMM = 7;
int NNN = 3;
int dims[5] = { xxx, yyy, zzz, MMM, NNN };
float alpha = 5.;
complex float a = 1.314 + 5.42*_Complex_I;
complex float* in = (complex float*) malloc(sizeof(complex float)*NNN*MMM*xxx*yyy*zzz);
for (int i = 0; i < xxx*yyy*zzz*MMM*NNN; i++)
in[i] = a*pow(i,2);
complex float* out = (complex float*) malloc(sizeof(complex float)*xxx*yyy*zzz*NNN*(NNN+1)/2);
assert(out);
covariance2(alpha, in, out, dims);
for (int i = 0; i < NNN*(NNN+1)/2; i++)
printf("i = %d, real = %f, imag = %f\n", i, __real__(out[i]), __imag__(out[i]));
free(out);
}
您是否故意在那裏沒有內核調用?目前,您正在將某些內容複製到內存中,然後將其他內容複製到內存中。其他的東西將會是垃圾,除非你有所作爲。 你應該檢查sizeof(ComplexFloat)== sizeof(複數浮點數)。 還有一件事:爲什麼你會想要多個塊,每個塊只有一個活動線程?無論您實際使用的是多少個,您只能獲得最大性能的1/32,即可以這種方式進行 - GPU處理32個線程的變形。 – 3Pi
我確實有一個內核調用,我只是爲了這個問題而刪除它。一旦這個工作,我會添加更多的線程。 sizeof(複數浮點數)== sizeof(float2)。 – user1850462