我在使用常量緩存的內核上運行了一些測試。如果我使用16,000浮點數(16,000 * 4KB = 64KB),那麼一切運行順利。如果我使用16,200,它仍然運行平穩。如果我使用16,400浮點數,我會在結果中得到錯誤(而不是來自OpenCL)。技術上可以有64.x KB的常量緩存嗎?如果我正好使用16,000個浮點數,我還應該相信我的代碼嗎?通常情況下,我希望代碼在你使用的東西達到規定的限制時會中斷。當我使用多於64kb的常量緩存時,爲什麼我的內核不會失敗? (OpenCL/CUDA)
回答
您可以並且應該使用OpenCL clGetDeviceInfo API和參數CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE來查詢它。 OpenCL 1.1規範說明一致性實現必須提供至少64K字節,這可能是您的設備正在實現的。
如果你超過了這個限制,那麼OpenCL應該給你一個錯誤,或者把你常量數組傳給你的全局內存數組。
如果它沒有返回錯誤,但是給你的結果不好,那是你的OpenCL實現中的一個錯誤。不足爲奇,他們都沒有成熟。您一定要向供應商報告錯誤。 (我認爲是NVidia是因爲你引用了CUDA)(當然,確保你已經安裝了最新版本)。
我甚至沒有看過GPU規格,找出哪些機器沒有64KB常量內存的硬限制;我假設你已經確定這實際上是你卡上的限制。
雖然通常GPU和CUDA/OpenCL /無論運行時間對於捕獲或標記錯誤都不是非常積極,但我會添加觀察,並且當使用無效參數時肯定不會失敗。雖然我從來沒有看到它明確表示,但我的理解是,這部分是爲了避免開銷,但主要是儘可能寬容;在一場比賽中,最好是怪物手臂看起來有趣,而不是整個比賽死亡,因爲有人做出了一次出界限制。
對於那些進行GPGPU編程的人來說,這很尷尬 - 確保所有參數和內存使用都是有效的,否則結果可能會很奇怪:有時候它會起作用,並且通常它慣於。但事情就是這樣。我當然不會指望那些可靠的失敗,並且如果你超出了給定的內存限制,有一些明顯而有用的方法。
我會說事情正在不斷改進GPU如何捕獲和報告錯誤。確實遊戲更寬容,但CUDA/OpenCL廣泛用於遊戲以外。 – Tom 2010-11-05 08:09:15
- 1. 當我使用CGAffineTransformRotate時,爲什麼我的按鈕會消失?
- 2. 當內核3.2上的緩衝大於2M時,dma_alloc_coherent失敗
- 3. 爲什麼我的sed命令在使用變量時失敗?
- 4. 爲什麼nginx不會緩存我的內容?
- 5. Rspec:當我預計失敗時,nil.should_not be_nil會通過。爲什麼?
- 6. 爲什麼用於OpenCL的英特爾內核生成器告訴我,我的內核不是矢量化的?
- 7. 爲什麼當我傳入一個變量時,我的連接/查找失敗?
- 8. 當我嘗試使用返回值時,爲什麼我的AJAX代碼失敗?
- 9. 爲什麼當使用定義的常量時,__autoload會給我e_notice警告?
- 10. 爲什麼當我使用xs:long添加數值條件時,此XQuery會失敗?
- 11. 爲什麼我的Perl腳本死於「內存不足」異常?
- 12. 爲什麼我的python進程會佔用這麼多內存?
- 13. 當我試圖將我的代碼放入Swift的類中時,爲什麼對常量的引用會消失?
- 14. 爲什麼當我使用bootstrap datepicker時,Ember.js會丟失valueBinding?
- 15. 爲什麼Django的緩存會與locmem一起使用,但memcached會失敗?
- 16. 爲什麼我使用operator *失敗?
- 17. 當我調用Shoes#'visit'時,爲什麼我會失去實例變量?
- 18. 當我使用'sudo'時,爲什麼我的shell會更改?
- 19. 爲什麼我的Web部署因超時異常而失敗
- 20. 當請求的緩衝區大小大於可用數據量時,爲什麼recv會失敗?
- 21. 如何在我的內核中訪問我的常量內存?
- 22. 爲什麼當我調用方法時,execvp失敗?
- 23. 爲什麼我的matlab程序使用這麼多的內存?
- 24. 爲什麼我的Julia程序使用這麼多的內存?
- 25. 爲什麼我的查詢在使用AnalysisException時失敗?
- 26. 爲什麼我的構建在使用jaxws-maven-plugin時失敗?
- 27. 爲什麼我的PLSQL觸發器驗證不會失敗?
- 28. 當我按下RETURN鍵時,爲什麼我的鍵盤不會消失?
- 29. 我的應用程序失敗了,我不知道爲什麼
- 30. 什麼內存使用量閾值,當我收到的iOS
如果你的GPU有64 KB的物理常量內存,那麼它應該不會令人感到意外當你嘗試超過這個時,你的代碼失敗。 – 2010-11-04 20:55:16
當你說「1kB」時,你的意思是「1000B」還是「1024B」?我想這裏64 kB = 65,536 B = 16,384 * 4 B ...略多於16,200個浮點數,稍小於16,400個浮點數。 – Schnouki 2010-11-05 14:15:25
Schnouki你的權利,16,384是我可以去的最高的。當我使用大於此數的任何數字時,我會收到一個錯誤。感謝您的確切答案:) – smuggledPancakes 2010-11-05 16:19:00