我使用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);
=錯....
謝謝你的回答。爲什麼指針數組不適合GPU? – Madrugada 2011-05-04 15:18:58
由於指針數組需要兩次內存事務才能從全局內存中檢索一個值。全局內存訪問在GPU上具有非常高的延遲,因此兩次訪問全局內存以獲得一個值遠不如一個加幾個IOP更好,這是一個線性一維內存分配成本的索引。 – talonmies 2011-05-04 15:26:47
did you mean:cudaMemcpy(pah [i],A [i],N * sizeof(float),cudaMemcpyHostToDevice);在之後的第一行爲? (A應該是我的程序中的矩陣,因此A [i]是一個向量) – Madrugada 2011-05-04 17:52:40