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実際には、スタックにサイズの配列を静的に割り当てることは期待できません。

代わりに、 a を使用しstd::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 に答える