1

次の単純な CUDA カーネルを作成しました。

__global__ void pr_kernel(float* O, const float* I, const float* W, int N)
{
  int x = threadIdx.x;
  float sum;
  int i;
  if (x < N) {
    for (i = 0; i < N; i++) {
      if (i == x) continue;
      sum += W[x*N+i] * I[x];
    }
    O[x] = (0.15 / N) + 0.85 * sum;
  }
}

変数は Python で次のように割り当てられます。

N      = np.int32(4)
W      = np.float32(np.asarray(
         [0, 1, 0, 1, 1, 0, 1, 1, 
         0, 1, 0, 1,1, 1, 0]))
I      = np.float32(np.asarray(
         [0.25, 0.25, 0.25, 0.25]))
O      = np.float32(np.zeros(N))

を使用して変数を転送gpuarray.to_gpuし、次の行で Tesla C2070 のカーネルを呼び出しています。

pr_kernel(O_d, I_d, W_d, N_d, block=blocksize, grid=gridsize)

どこ:

blocksize = (128, 1, 1)
gridsize = (1, 1)

エラーメッセージが表示されます:

pycuda.driver.LaunchError: cuLaunchKernel failed: launch out of resources.

これは、ブロックサイズを のように減らしても発生し(8, 1, 1)ます。ブロックサイズが の GPU で他の CUDA プログラムを実行できる(512, 1, 1)ので、これは GPU 構成の問題によるものではないと確信しています。

私は何を間違っていますか?助けてくれてありがとう。

4

2 に答える 2

1

問題は、を使用して整数NをGPUに転送していたことでした。ここで、関数gpuarray.to_gpuに直接渡す必要がありました。Npr_kernel

于 2012-11-05T02:01:09.107 に答える
0

定義で別の型を使用し、カーネルへの引数として使用したときに、同様の問題が発生しました。おそらく、後者がより多くのリソースを必要としたという事実がエラーを生成します。

于 2015-09-30T03:00:25.490 に答える