2011-05-04 75 views
3

我使用cudaMalloc和cudaMemcpy分配一個矩陣,並拷貝到陣列的載體,就像這樣:使用cudaMalloc分配矩陣

float **pa;  
cudaMalloc((void***)&pa, N*sizeof(float*)); //this seems to be ok 
for(i=0; i<N; i++) { 
    cudaMalloc((void**) &(pa[i]), N*sizeof(float)); //this gives seg fault 
    cudaMemcpy (pa[i], A[i], N*sizeof(float), cudaMemcpyHostToDevice); // also i am not sure about this 
} 

什麼是錯我的指示? 在此先感謝

P.S. A [i]爲載體


現在我試圖矩陣從設備複製到來自主機的矩陣:

假如我有** PC的設備,和** PGPU是在主機:

cudaMemcpy (pgpu, pc, N*sizeof(float*), cudaMemcpyDeviceToHost); 
for (i=0; i<N; i++) 
    cudaMemcpy(pgpu[i], pc[i], N*sizeof(float), cudaMemcpyDeviceToHost); 

=錯....

回答

5

pa是在設備內存中,所以&(pa[i])不會做你期待什麼會。這將起作用

float **pa; 
float **pah = (float **)malloc(pah, N * sizeof(float *));  
cudaMalloc((void***)&pa, N*sizeof(float*)); 
for(i=0; i<N; i++) { 
    cudaMalloc((void**) &(pah[i]), N*sizeof(float)); 
    cudaMemcpy (pah[i], A[i], N*sizeof(float), cudaMemcpyHostToDevice); 
} 
cudaMemcpy (pa, pah, N*sizeof(float *), cudaMemcpyHostToDevice); 

即,在主機內存中構建指針數組,然後將其複製到設備。 我不確定你希望從 A中讀到什麼,但我懷疑內部 cudaMemcpy可能沒有按照你想要的那樣書寫。

請注意,從性能角度來看,指針數組在GPU上並不是一個好主意。

+0

謝謝你的回答。爲什麼指針數組不適合GPU? – Madrugada 2011-05-04 15:18:58

+0

由於指針數組需要兩次內存事務才能從全局內存中檢索一個值。全局內存訪問在GPU上具有非常高的延遲,因此兩次訪問全局內存以獲得一個值遠不如一個加幾個IOP更好,這是一個線性一維內存分配成本的索引。 – talonmies 2011-05-04 15:26:47

+0

did you mean:cudaMemcpy(pah [i],A [i],N * sizeof(float),cudaMemcpyHostToDevice);在之後的第一行爲? (A應該是我的程序中的矩陣,因此A [i]是一個向量) – Madrugada 2011-05-04 17:52:40

2

這段代碼的最終目標是什麼?正如上面所暗示的那樣,將pa平鋪到一維陣列中以便在GPU上使用可能會符合您的最佳利益。例如:

float *pa; 
cudaMalloc((void**)&pa, N*N*sizeof(float)); 

不幸的是,您必須調整A [i]以這種方式執行內存複製。

+0

謝謝你的回答。什麼talonmies說完全適合我的要求 – Madrugada 2011-05-06 07:22:16