2012-12-20 32 views
0

下面是我期望能夠使用的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); 
    } 
+0

您是否故意在那裏沒有內核調用?目前,您正在將某些內容複製到內存中,然後將其他內容複製到內存中。其他的東西將會是垃圾,除非你有所作爲。 你應該檢查sizeof(ComplexFloat)== sizeof(複數浮點數)。 還有一件事:爲什麼你會想要多個塊,每個塊只有一個活動線程?無論您實際使用的是多少個,您只能獲得最大性能的1/32,即可以這種方式進行 - GPU處理32個線程的變形。 – 3Pi

+0

我確實有一個內核調用,我只是爲了這個問題而刪除它。一旦這個工作,我會添加更多的線程。 sizeof(複數浮點數)== sizeof(float2)。 – user1850462

回答

1

裏面你covariance2功能,您有:

int N = dims[3]; 
int M = dims[4]; 

但裏面你main()您有:

int dims[5] = { xxx, yyy, zzz, MMM, NNN }; 

注意,M是前述N A參數在dims[]

由於你的malloc(的out)和cudaMalloc(的out_device)取決於N,使用兩個不同的值N(3和7)來計算尺寸。這意味着outout_device的大小不一樣,我認爲這不是您的意圖。由於(大小)out的計算結果是N爲3,並且(大小)out_device的計算結果爲N爲7,所以您試圖將更大的數據結構cudaMemcpy放到較小的數據結構中。該修復大概是這樣的在協方差2中:

int M = dims[3]; 
int N = dims[4]; 
+0

這就是這樣的狡猾的事情,讓你的腳趾:P – 3Pi