2013-04-30 169 views
3

有什麼辦法通過OpenCL API殺死正在運行的OpenCL內核?我沒有在規範中找到任何內容。我可以想到的唯一解決方案是1)定期檢查內核中的一個標誌,當主機想要內核停止時它會寫入內核,或者2)在單獨的進程中運行內核並且終止整個進程。我不認爲這兩種解決方案都是非常優雅的,我不確定#1是否能夠可靠工作。殺死OpenCL內核

+0

我不確定第二個選項是否如此好。即使您終止了進程,內核仍然在GPU上運行。我試圖在我的射線追蹤器中做類似的事情。我在單獨的線程中檢查鍵盤而不是內核。如果用戶按下'ESCAPE',我希望程序立即結束。最後,我看着它,當編程結束時,我正在獲得核心轉儲。 – 2013-05-01 08:19:46

+0

我完全同意,他們都是不好的選擇。我希望有更好或更標準的選擇。 – agrippa 2013-05-01 14:19:35

+0

拔出插頭,認真的你最好將內核分割成定義好的(和短時間)計算部分,並將控制決定留給主機端。例如,如果nvidia驅動程序在幾秒內沒有完成並且您的GPU連接到顯示器,則它會殺死您的內核 – 2013-05-02 14:05:54

回答

1

不,OpenCL API不允許中斷正在運行的內核。在某些系統上,運行超過幾秒鐘的內核將被驅動程序終止。

Ref。對於Windows:Timeout Detection and Recovery of GPUs through WDDM,對於Linux + NVidia:Using CUDA and X

標準中的任何內容都不能保證您的選項1可以正常工作。它幾乎肯定不會。 您的選項2將起作用,但您必須與其他進程進行通信。

按照註釋中的建議,在較小的內核中分割內核可能是最好的選擇。