1
我試圖在pyCUDA中啓動一個內核,然後通過寫入GPU全局內存位置來終止內核。下面是一個簡單的例子內核,我希望能夠在某些時候終止它的狀態時,無限後循環:異步內核啓動後在pyCUDA中返回主機代碼
__global__ void countUp(u16 *inShot, u64 *counter) {
while(inShot[0]) {
counter[0]++;
}
}
從我所瞭解的CUDA流,我應該能夠推出這個內核創建一個流後,它將在主機上無阻塞,即。在內核啓動並運行後,我應該能夠在主機上執行一些操作。我編譯上面的內核到的cubin文件並啓動它pyCUDA像這樣:
import numpy as np
from pycuda import driver, compiler, gpuarray, tools
# -- initialize the device
import pycuda.autoinit
strm1 = driver.Stream()
h_inShot = np.zeros((1,1))
d_inShot = gpuarray.to_gpu_async(h_inShot.astype(np.uint16), stream = strm1)
h_inShot = np.ones((1,1))
h_counter = np.zeros((1,1))
d_counter = gpuarray.to_gpu_async(h_counter.astype(np.uint64), stream = strm1)
testCubin = "testKernel.cubin"
mod = driver.module_from_file(testCubin)
countUp = mod.get_function("countUp")
countUp(d_inShot, d_counter,
grid = (1, 1, 1),
block = (1, 1, 1),
stream = strm1
)
運行此腳本導致內核進入無限循環,同時出於顯而易見的原因。在ipython環境中啓動這個腳本似乎並沒有在內核啓動後將控制權交還給主機(因爲我猜測它等待內核完成了,所以我不能輸入新的命令)。我想控制返回到主機,以便我可以更改GPU全局內存指針d_inShot中的值,並讓內核退出while循環。這甚至是可能的,如果是這樣,我怎麼在pyCUDA中做到這一點?謝謝。