我正在試驗OpenCL(C++接口),並且沒有注意到它,我使用等於10
的緩衝區大小創建了10個整數的緩衝區,而不是10 * sizeof(int)
,但代碼顯然沒有問題。現在在OpenCL中的邊界檢測
,我相信,這可能是可能的,因爲我創造了緩衝區CL_MEM_USE_HOST_PTR
標誌,這成爲可能訪問了邊界存儲器(雖然我不知道這個問題)。
所以,我的問題是:是否有可能在OpenCL中強制執行超出界限的錯誤檢查,以便報告超出特定區域的任何訪問?
我正在試驗OpenCL(C++接口),並且沒有注意到它,我使用等於10
的緩衝區大小創建了10個整數的緩衝區,而不是10 * sizeof(int)
,但代碼顯然沒有問題。現在在OpenCL中的邊界檢測
,我相信,這可能是可能的,因爲我創造了緩衝區CL_MEM_USE_HOST_PTR
標誌,這成爲可能訪問了邊界存儲器(雖然我不知道這個問題)。
所以,我的問題是:是否有可能在OpenCL中強制執行超出界限的錯誤檢查,以便報告超出特定區域的任何訪問?
正如其他海報已經指出的那樣,OpenCL驅動程序目前不支持外出檢查。雖然像WebCL驗證工具這樣的工具在這方面很有前途,但我想提一下基於現有工具的另一種路徑,這些工具在過去幫助過我。通過使用依賴標準C++編譯器編譯內核的FreeOCL CPU driver(在源到源翻譯步驟之後),您可以在最終程序中使用類似valgrind
的工具,並獲得如下所示的典型valgrind
錯誤消息:
==5863== Thread 6:
==5863== Invalid write of size 1
==5863== at 0xD61FA5D: __FCL_kernel_krnl_route_pkt (filehFymmN:27)
然後,您可以直接引用內核的C++版本(示例中爲/tmp/filehFymmN
行27),以查找違規操作發生的位置。
這很有趣,謝謝! – AkiRoss
簡答題:沒有。
長時間回答:ATI和NVIDIA對訪問內存出界非常寬容,但英特爾會崩潰(沒有測試AMD cpus)。
對於像各向異性過濾器那樣訪問n,n + 1和n-1的東西,您應該使用全局偏移來避免訪問內存越界或使用if
語句檢查內核。全局偏移很好,但NVIDIA不支持它,所以就是這樣。
不幸的是,在主機代碼上使用try/catch似乎不起作用,因爲在您要鏈接的OpenCL.dll中存在魔法。
注意:這是SDK和約4個月大的代碼,不知道是否自那時起發生了變化。
作爲附加信息。這不是ATI/nVIDIA的缺失功能。只是GPU在這些方面受到限制,並且關心所有內存訪問將是一個大問題。因此,如果GPU訪問超出限制,您將無法看到它。它會向OpenCL調用返回某種錯誤。沒有更多的信息,我害怕。 – DarkZeros
我通常不會從GPU中獲取錯誤,只是損壞了數據。即使是出乎意料的超出界限的東西。 – Austin
取決於出界性質。如果你重疊一個區域,那麼你會得到損壞的數據。如果您訪問GPU的某個受保護區域,則內核將「無提示」失敗,或者導致計算機崩潰。如果它靜默失敗,那麼錯誤代碼只會在內核事件或clEnqueueBufferRead()調用(CL_OUT_OF_RESOURCES)中出現,當然會給出損壞的數據。至少這對於nVIDIA來說是有效的。 – DarkZeros
你可能想嘗試的WebCL驗證:https://github.com/KhronosGroup/webcl-validator
這是一個命令行工具,儀器儀表與運行時檢查你的OpenCL內核源代碼的出界外存儲器訪問。它仍在進行中,所以任何反饋都將非常感謝。
我對OpenCL沒有經驗,所以我不知道是否是這種情況,但知道您的代碼是否編譯爲發佈版或調試版可能很有用。我知道只有在調試模式下才使用這種斷言和/或異常的庫很少。 – luk32