2010-11-04 37 views
1

我在使用常量緩存的內核上運行了一些測試。如果我使用16,000浮點數(16,000 * 4KB = 64KB),那麼一切運行順利。如果我使用16,200,它仍然運行平穩。如果我使用16,400浮點數,我會在結果中得到錯誤(而不是來自OpenCL)。技術上可以有64.x KB的常量緩存嗎?如果我正好使用16,000個浮點數,我還應該相信我的代碼嗎?通常情況下,我希望代碼在你使用的東西達到規定的限制時會中斷。當我使用多於64kb的常量緩存時,爲什麼我的內核不會失敗? (OpenCL/CUDA)

+1

如果你的GPU有64 KB的物理常量內存,那麼它應該不會令人感到意外當你嘗試超過這個時,你的代碼失敗。 – 2010-11-04 20:55:16

+2

當你說「1kB」時,你的意思是「1000B」還是「1024B」?我想這裏64 kB = 65,536 B = 16,384 * 4 B ...略多於16,200個浮點數,稍小於16,400個浮點數。 – Schnouki 2010-11-05 14:15:25

+0

Schnouki你的權利,16,384是我可以去的最高的。當我使用大於此數的任何數字時,我會收到一個錯誤。感謝您的確切答案:) – smuggledPancakes 2010-11-05 16:19:00

回答

3

您可以並且應該使用OpenCL clGetDeviceInfo API和參數CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE來查詢它。 OpenCL 1.1規範說明一致性實現必須提供至少64K字節,這可能是您的設備正在實現的。

如果你超過了這個限制,那麼OpenCL應該給你一個錯誤,或者把你常量數組傳給你的全局內存數組。

如果它沒有返回錯誤,但是給你的結果不好,那是你的OpenCL實現中的一個錯誤。不足爲奇,他們都沒有成熟。您一定要向供應商報告錯誤。 (我認爲是NVidia是因爲你引用了CUDA)(當然,確保你已經安裝了最新版本)。

0

我甚至沒有看過GPU規格,找出哪些機器沒有64KB常量內存的硬限制;我假設你已經確定這實際上是你卡上的限制。

雖然通常GPU和CUDA/OpenCL /無論運行時間對於捕獲或標記錯誤都不是非常積極,但我會添加觀察,並且當使用無效參數時肯定不會失敗。雖然我從來沒有看到它明確表示,但我的理解是,這部分是爲了避免開銷,但主要是儘可能寬容;在一場比賽中,最好是怪物手臂看起來有趣,而不是整個比賽死亡,因爲有人做出了一次出界限制。

對於那些進行GPGPU編程的人來說,這很尷尬 - 確保所有參數和內存使用都是有效的,否則結果可能會很奇怪:有時候它會起作用,並且通常它慣於。但事情就是這樣。我當然不會指望那些可靠的失敗,並且如果你超出了給定的內存限制,有一些明顯而有用的方法。

+0

我會說事情正在不斷改進GPU如何捕獲和報告錯誤。確實遊戲更寬容,但CUDA/OpenCL廣泛用於遊戲以外。 – Tom 2010-11-05 08:09:15

相關問題