启动资源

时间:2012-11-04 22:28:20

标签: cuda pycuda

我编写了以下简单的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上使用(512, 1, 1)的块大小来运行其他CUDA程序,所以我相信这不是由于GPU配置问题。

我做错了什么?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

问题是我使用N将整数gpuarray.to_gpu传输到GPU,我应该直接将N传递给pr_kernel函数。

答案 1 :(得分:0)

当我在定义中使用不同的类型并作为内核的参数时,我遇到了类似的问题。可能后者需要更多资源的事实会产生错误。