2016-06-07 112 views
1

我實際上從來沒有遇到過需要我寫入全局內存的值被緩存的情況。但是我無法找到阻止GPU污染高速緩存的方法,因爲我可以通過使用非暫時寫入在CPU上執行此操作。我可以繞過OpenCL緩存嗎?

這是一個嚴重的問題,可以降低20%或更多的性能。

+0

如果您想重新使用您剛放入全局內存的任何值,請使用您已存儲在私有內存中的值。再次調用全局值會進行另一次讀取,因爲沒有任何內容確保工作項的值在寫入該值後未發生更改。實際上沒有涉及緩存。 – DarkZeros

+0

@DarkZeros那麼,爲什麼輸出一個整個工作組的結果總和會比輸出每個工作項目的結果更高的緩存命中率呢? – BlueWanderer

+0

在簡單的nbody內核中使用純全局內存作爲xyz座標,可以與本地內存優化的性能相媲美。性能比與本地/緩存帶寬比類似。這可能是緩存的工作,但我沒有檢查LLVM輸出,所以我不確定。 xyz的數據是768kB,因此可以放在二級緩存中。 –

回答

2

有關於此的最新信息很少,但您認爲寫入緩存的原因是什麼?除非您使用原子操作,否則GPU不關心一致性。如果在寫入內存位置後讀取內存位置,則即使在同一工作組內也會得到未定義的結果,除非在操作之間放置全局內存屏障。這意味着緩存寫入的值是沒有意義的,因爲在那時所有的着色器執行都必須已經寫入了他們的數據。你可以確定它不適合任何緩存! GPU是與CPU不同的完全不同的野獸。在一箇中找到的概念不容易轉化爲另一個。

這些只是我的假設,這可能是錯誤的,但我確信供應商會盡最大努力優化他們的GPU以完成目前最常見的操作,只是讓他們可以吹噓實現目前遊戲中的FPS略高於競爭對手。試圖智勝他們通常不是一個好主意。

+0

實際上,它是在文檔中寫入的,寫入緩存在GCN GPU上。寫入操作可以將緩存命中率從90%降低到50%。我同意緩存寫入在GPU上是毫無意義的,除非你的臨時結果不適合寄存器和不常見的LDS。所以我認爲可能有一種方法可以通過緩存寫入。無論如何,指令集中都存在緩存策略(儘管我沒有深入研究它)。 – BlueWanderer

+0

我認爲AMD正在放棄GPGPU ... – BlueWanderer