2013-07-09 77 views
0

我正嘗試在CUDA(200x200x100)中使用3D數組。三維陣列的分割錯誤

當我將z維(model_num)從4更改爲5時,出現了分段錯誤。爲什麼,我該如何解決它?

const int nrcells = 200; 
const int nphicells = 200; 
const int model_num = 5; //So far, 4 is the maximum model_num that works. At 5 and after, there is a segmentation fault 

    __global__ void kernel(float* mgridb) 
{ 
    const unsigned long long int i = (blockIdx.y * gridDim.x + blockIdx.x) * blockDim.x + threadIdx.x; 

    if(tx >= 0 && tx < nphicells && ty >=0 && ty < nrcells && tz >= 0 && tz < model_num){ 
     //Do stuff with mgridb[i] 
    } 
} 

int main (void) 
{ 

    unsigned long long int size_matrices = nphicells*nrcells*model_num; 
    unsigned long long int mem_size_matrices = sizeof(float) * size_matrices; 

    float *h_mgridb = (float *)malloc(mem_size_matrices); 
    float mgridb[nphicells][nrcells][model_num]; 

    for(int k = 0; k < model_num; k++){ 
     for(int j = 0; j < nrcells; j++){ 
      for(int i = 0; i < nphicells; i++){ 
       mgridb[i][j][k] = 0; 
      } 
     } 
    } 
    float *d_mgridb; 

    cudaMalloc((void**)&d_mgridb, mem_size_matrices); 
    cudaMemcpy(d_mgridb, h_mgridb, mem_size_matrices, cudaMemcpyHostToDevice); 

    int threads = nphicells; 
    uint3 blocks = make_uint3(nrcells,model_num,1); 
    kernel<<<blocks,threads>>>(d_mgridb); 
    cudaMemcpy(h_mgridb, d_mgridb, mem_size_matrices, cudaMemcpyDeviceToHost); 
    cudaFree(d_mgridb); 
    return 0; 
} 
+0

請多關注一下您在問題中發佈的代碼的格式和內容。您發佈的代碼不必要的難以閱讀並且包含不平衡{}。 – talonmies

+0

會做。謝謝。 –

回答

3

這是得到存儲在堆棧上:

float mgridb[nphicells][nrcells][model_num]; 

你的棧空間是有限的。當您超過可存儲在堆棧上的金額you are getting a seg fault時,無論是在分配點,還是嘗試訪問它時。

改爲使用malloc。這分配堆存儲,它有更高的限制。

以上都與CUDA無關。

您可能還需要調整訪問數組的方式,但使用指針索引處理a flattened array並不困難。

您的代碼實際上是奇怪的看,因爲你正在使用malloc創建一個適當大小的數組h_mgridb,然後複製該數組到設備(進入d_mgridb)。目前還不清楚mgridb在代碼中的作用。 h_mgridbmgridb是不一樣的。

+0

謝謝你,羅伯特!這解決了這個問題。 –

+0

這解決了這個問題。我將float mgridb [nphicells] [nrcells] [model_num]更改爲float * mgridb =(float *)malloc(mem_size_matrices)。此外,在初始化「for」循環中,我將它引用爲一維數組,因此mgridb [i +(j * nphicells)+(k * nphicells * nrcells)] = 0。我可以看到你在說什麼,它如果我已經分配了mgridb,那麼擁有h_mgridb沒有什麼意義。 –