2013-04-21 84 views
0

我想從設備複製到主機8650752字節,但我越來越堆棧溢出錯誤,令人驚訝的是我可以從主機複製相同的數據到設備,但計算後,無法取回。代碼非常簡單,所以不知道什麼是錯將數據從設備複製到主機是否有任何限制?

代碼:

__global__ 
void kernel(....) 
{ 
    int x=threadIDX.x; 

    for (int j=0; j<256; j++) 
    { 
     for (int i=0; i<256; i++) 
     { 
      int index = 256*256*x + 256*j + i;  
      dVOL_in[(x*65536)+(256*j)+i]=index; 
     } 
    } 

} 

int main(void) 
{ 
    const int VOL_SIZE = 8650752;       
    const int VOL_BYTES = VOL_SIZE * sizeof(float); 
    float hVOL[VOL_SIZE]; 
    float * dVOL_in; 

    gpuErrchk(cudaMalloc((void**) &dVOL_in, VOL_BYTES)); 

    // volume data read from some file 
    gpuErrchk(cudaMemset(dVOL_in,0,VOL_BYTES)); 
    gpuErrchk(cudaMemcpy(dVOL_in,Vol,VOL_BYTES, cudaMemcpyHostToDevice)); //works fine 

    kernel<<<1,132>>>(....); 
    cudaMemcpy(hVOL, dVOL_in, VOL_BYTES, cudaMemcpyDeviceToHost); //stack overflow error 
} 
+0

「hVOL」數組爲33 MB。內核可能沒有太多的堆棧空間。 – Barmar 2013-04-21 03:06:13

+2

因此,用'malloc'來創建你的主機數組'hVOL'。 – 2013-04-21 04:37:41

+0

如果您打算在此處提出更多問題,請遵守格式化您的代碼的習慣,以便那些試圖幫助您閱讀的人很容易。這真是太糟糕了...... – talonmies 2013-04-21 11:21:04

回答

4

當函數體定義爲局部變量:

int main(void) 
{ 
    const int VOL_SIZE = 8650752; 
    float hVOL[VOL_SIZE]; 

編譯器將分配對象hVol在疊加。但是這個對象不適合最大堆棧大小,所以你得到這個錯誤。對於如此大的對象,您需要動態分配內存:

float *hVOL = malloc(sizeof(float) * VOL_SIZE); 
相關問題