2012-11-07 63 views
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例如)。我也嘗試改變我的塊和網格大小無濟於事。

什麼可能是錯的?什麼是死亡環境?任何建議或想法表示讚賞。

回答

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)。

+0

我看到的另一個問題是內核沒有返回任何結果,所以編譯器可能會優化內核爲空。在這裏看到類似的問題:http://stackoverflow.com/questions/12883377/how-to-compile-cuda-kernel-without-optimizing-at-all –

+0

謝謝! @brano提出的設置共享內存大小的建議訣竅!感謝布蘭登。在這種情況下,你認爲我應該返回什麼結果並將結果發送回CPU? – dangerChihuahua007

+0

@David將第二個數組傳遞給第二個數組,在第一個數組上執行一個小型計算(如加倍),並將結果存儲在第二個數組中。然後檢查CPU上的結果以確認一切正常。 –