2015-05-07 132 views
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中做到這一點?謝謝。

回答

1

我想通了,所以張貼我的解決方案。即使異步memcpy是非阻塞的,我發現使用與正在運行的內核相同的流來執行memcpy不起作用。我的解決方案是創建另一個流:

strm2 = driver.Stream() 

,然後改變d_inShot像這樣:

d_inShot.set_async(h_inShot.astype(np.uint16), stream = strm2) 

這很適合我。