私はpyCUDAでCUDAを教えています。この演習では、1024 個の float の単純な配列を GPU に送信し、共有メモリに格納します。以下の引数で指定するように、このカーネルを 1024 スレッドの 1 つのブロックだけで実行します。
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 を使用します)。また、ブロックとグリッドのサイズを変更しようとしましたが、役に立ちませんでした。
何が間違っている可能性がありますか?デッドコンテキストとは?アドバイスやアイデアをいただければ幸いです。