2
我自學CUDA與pyCUDA。在這個練習中,我想將簡單的1024個浮點數組發送到GPU並將其存儲在共享內存中。正如我在下面的參數中指定的那樣,我只在1024線程的單個塊上運行這個內核。我應該如何解釋這個CUDA錯誤?
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)
奇怪的是,我得到這個錯誤。
[[email protected] 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例如)。我也嘗試改變我的塊和網格大小無濟於事。
什麼可能是錯的?什麼是死亡環境?任何建議或想法表示讚賞。
我看到的另一個問題是內核沒有返回任何結果,所以編譯器可能會優化內核爲空。在這裏看到類似的問題:http://stackoverflow.com/questions/12883377/how-to-compile-cuda-kernel-without-optimizing-at-all –
謝謝! @brano提出的設置共享內存大小的建議訣竅!感謝布蘭登。在這種情況下,你認爲我應該返回什麼結果並將結果發送回CPU? – dangerChihuahua007
@David將第二個數組傳遞給第二個數組,在第一個數組上執行一個小型計算(如加倍),並將結果存儲在第二個數組中。然後檢查CPU上的結果以確認一切正常。 –