2012-07-18 86 views
1

首先錯誤: 分段錯誤(在高亮cudaMalloc行,如果使一個>約61432)cudaMalloc段故障高值

unsigned int xarray[a]; 
unsigned int *dev_a; 
int result[33*a]; 
int *dev_result; 

**cudaMalloc((void **)&dev_a,a * sizeof(unsigned int));** 

cudaMemcpy(dev_a,xarray,a*sizeof(int),cudaMemcpyHostToDevice); 

kernel<<<a,66>>>(dev_a,dev_result); 

cudaMemcpy(result,dev_result,33*a*sizeof(int),cudaMemcpyDeviceToHost); 

爲什麼我提到「大約」以上是因爲有時其原因它在a = 61432時有效,有時不適用。我無法理解爲什麼。

此外,這僅適用於一維網格塊的啓動。我的意圖是推出3D網格[a * a * a]。

+2

你不能指望編譯器能夠靜態分配的數組('result' )在堆棧上很大。改爲使用'std :: vector '。 – 2012-07-18 18:35:08

+0

你想分配一個'61432³'電網嗎?你從哪裏得到一個8PB內存的GPU? – leftaroundabout 2012-07-18 18:51:42

+0

我用malloc來代替,它似乎解決了這個問題。謝謝 ! – dparkar 2012-07-18 19:06:15

回答

1

因爲數組result太大,您的代碼是segfaulting。在實踐中,你不能真正期望在堆棧上靜態分配一個大小爲33 * 61432的數組。

相反,使用std::vector動態分配數組和指針傳遞到指針的數據cudaMemcpy

#include <vector> 
... 
std::vector<int> result(33 * 1); 
... 
cudaMemcpy(&result[0], dev_result, 33 * a * sizeof(int), cudaMemcpyDeviceToHost);