2012-07-18 43 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);