2013-10-28 82 views
0

我正在試驗OpenCL(C++接口),並且沒有注意到它,我使用等於10的緩衝區大小創建了10個整數的緩衝區,而不是10 * sizeof(int),但代碼顯然沒有問題。現在在OpenCL中的邊界檢測

,我相信,這可能是可能的,因爲我創造了緩衝區CL_MEM_USE_HOST_PTR標誌,這成爲可能訪問了邊界存儲器(雖然我不知道這個問題)。

所以,我的問題是:是否有可能在OpenCL中強制執行超出界限的錯誤檢查,以便報告超出特定區域的任何訪問?

+0

我對OpenCL沒有經驗,所以我不知道是否是這種情況,但知道您的代碼是否編譯爲發佈版或調試版可能很有用。我知道只有在調試模式下才使用這種斷言和/或異常的庫很少。 – luk32

回答

2

正如其他海報已經指出的那樣,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),以查找違規操作發生的位置。

+0

這很有趣,謝謝! – AkiRoss

1

簡答題:沒有。

長時間回答:ATI和NVIDIA對訪問內存出界非常寬容,但英特爾會崩潰(沒有測試AMD cpus)。

對於像各向異性過濾器那樣訪問n,n + 1和n-1的東西,您應該使用全局偏移來避免訪問內存越界或使用if語句檢查內核。全局偏移很好,但NVIDIA不支持它,所以就是這樣。

不幸的是,在主機代碼上使用try/catch似乎不起作用,因爲在您要鏈接的OpenCL.dll中存在魔法。

注意:這是SDK和約4個月大的代碼,不知道是否自那時起發生了變化。

+1

作爲附加信息。這不是ATI/nVIDIA的缺失功能。只是GPU在這些方面受到限制,並且關心所有內存訪問將是一個大問題。因此,如果GPU訪問超出限制,您將無法看到它。它會向OpenCL調用返回某種錯誤。沒有更多的信息,我害怕。 – DarkZeros

+0

我通常不會從GPU中獲取錯誤,只是損壞了數據。即使是出乎意料的超出界限的東西。 – Austin

+0

取決於出界性質。如果你重疊一個區域,那麼你會得到損壞的數據。如果您訪問GPU的某個受保護區域,則內核將「無提示」失敗,或者導致計算機崩潰。如果它靜默失敗,那麼錯誤代碼只會在內核事件或clEnqueueBufferRead()調用(CL_OUT_OF_RESOURCES)中出現,當然會給出損壞的數據。至少這對於nVIDIA來說是有效的。 – DarkZeros

2

你可能想嘗試的WebCL驗證:https://github.com/KhronosGroup/webcl-validator

這是一個命令行工具,儀器儀表與運行時檢查你的OpenCL內核源代碼的出界外存儲器訪問。它仍在進行中,所以任何反饋都將非常感謝。