我该如何解释这个CUDA错误?

时间:2012-11-07 09:16:37

标签: cuda pycuda

我用pyCUDA教自己CUDA。在本练习中,我想将一个简单的1024个浮点数组发送到GPU并将其存储在共享内存中。正如我在下面的参数中指出的那样,我只用一个1024个线程的块来运行这个内核。

import pycuda.driver as cuda
from pycuda.compiler import SourceModule
import pycuda.autoinit
import numpy as np
import matplotlib.pyplot as plt

arrayOfFloats = np.float64(np.random.sample(1024))
mod = SourceModule("""
  __global__ void myVeryFirstKernel(float* arrayOfFloats) {
    extern __shared__ float sharedData[];

    // Copy data to shared memory.
    sharedData[threadIdx.x] = arrayOfFloats[threadIdx.x];
  }
""")
func = mod.get_function('myVeryFirstKernel')
func(cuda.InOut(arrayOfFloats), block=(1024, 1, 1), grid=(1, 1))
print str(arrayOfFloats)

奇怪的是,我收到了这个错误。

[dfaux@harbinger CUDA_tutorials]$ python sharedMemoryExercise.py 
Traceback (most recent call last):
  File "sharedMemoryExercise.py", line 17, in <module>
    func(cuda.InOut(arrayOfFloats), block=(1024, 1, 1), grid=(1, 1))
  File "/software/linux/x86_64/epd-7.3-1-pycuda/lib/python2.7/site-packages/pycuda-2012.1-py2.7-linux-x86_64.egg/pycuda/driver.py", line 377, in function_call
    Context.synchronize()
pycuda._driver.LaunchError: cuCtxSynchronize failed: launch failed
PyCUDA WARNING: a clean-up operation failed (dead context maybe?)
cuMemFree failed: launch failed
PyCUDA WARNING: a clean-up operation failed (dead context maybe?)
cuModuleUnload failed: launch failed

我试图通过更改我发送到GPU的元素类型来调试此错误(而不是float64,我使用float32)。我也尝试改变我的块和网格尺寸无济于事。

可能有什么不对?什么是死亡背景?任何建议或想法都赞赏。

1 个答案:

答案 0 :(得分:4)

我在您的代码中看到的一个问题是您使用extern __shared__ ..,这意味着您需要在启动内核时提交共享内存的大小。

在pycuda中,这可以通过以下方式完成:
func(cuda.InOut(arrayOfFloats), block=(1024, 1, 1), grid=(1, 1),shared=smem_size)
其中smem_size是共享内存的大小(以字节为单位)。

在你的情况下,smem_size = 1024 * sizeof(float)。