1

首先是错误: 分段错误(在突出显示的 cudaMalloc 行,如果我创建 > 大约 61432)

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 时有效,有时则无效。我无法理解为什么。

此外,这仅适用于 1D 网格块的启动。我的意图是启动一个 3D 网格 [a*a*a]。

4

1 回答 1

1

您的代码存在段错误,因为数组result太大。实际上,您不能真正期望33 * 61432在堆栈上静态分配大小数组。

相反,使用 astd::vector动态分配数组并将指向指针数据的指针传递给cudaMemcpy

#include <vector>
...
std::vector<int> result(33 * 1);
...
cudaMemcpy(&result[0], dev_result, 33 * a * sizeof(int), cudaMemcpyDeviceToHost);
于 2012-09-11T18:02:56.677 回答