2016-07-02 51 views
2

OpenCL和CUDA已經包含了幾年的原子操作(儘管顯然不是每個CUDA或OpenCL設備都支持這些操作)。但是 - 我的問題是關於由於非原子寫入而「與」種族共處的可能性。GPU上非原子寫入的弱保證?

假設網格中的多個線程全部寫入全局內存中的相同位置。我們保證,當內核執行結束時,其中一個寫入的結果將出現在該位置,而不是某些垃圾?

  • 內存空間:

    對於這個問題(任意選擇組合(一個或多個),編輯除了nVIDIA的CUDA +已其中有一個答案)相關參數全局內存;這個問題不是關於本地/共享/私有內存。

  • 對齊:在一個單獨的存儲寫入的寬度(例如在NVIDIA GPU 128位)
  • GPU廠商:AMD/NVIDIA
  • 編程框架:CUDA/OpenCL的
  • 存儲指令在代碼位置:的同一行代碼爲所有線程/不同的代碼行。
  • 寫入目的地址:固定地址/固定偏移量,來自功能參數地址/完全動態地址
  • 寫入寬度:8/32/64位。
+0

不可能是垃圾。在硬件層面上,它仍然是原子的 - 線程/ SM之一獲取總線,寫入數據並釋放總線,除非數據太寬而無法在一次操作中寫入。您可以添加與芯片設計相關的標籤 – kangshiyin

回答

5

難道我們保證,當內核執行的結論,其中一項寫入操作的結果將出現在那個位置,而不是一些垃圾?

對於CUDA GPU,我非常確定NVIDIA OpenCL的GPU,答案是肯定的。以下我的大多數術語都將考慮CUDA。如果您需要CUDA和OpenCL的詳盡答案,請告訴我,我將刪除此答案。無論如何,Very similar questions to this one已被問及答覆。 Here's another,我確定還有其他人。

當多個「同時」寫入發生在同一位置時,其中一個將會完好無損。

哪一個會贏是未定義的。非獲獎作品的行爲也是未定義的(它們可能會發生,但被獲勝者取代,或者根本不會發生)。存儲器位置的實際內容可能會通過各種值(例如原始值,加上任何有效的書面價值),但運輸不會通過「垃圾」值(即,那些尚未存在且未被任何線索寫入的值)。運輸最終以「勝利者」結尾。

示例1:

位置X包含零。線程1,5,32,30000和450000都向該位置寫入一個線程。如果沒有其他寫入數據流到該位置,那麼該位置最終將包含一個值(內核終止或更早)。

實施例2:

位置X含有5.螺紋32將1寫入X.螺紋90303寫入7至X.螺紋432322寫入972至X.如果沒有其他寫入流量到達該位置,則在內核終止或更早時,位置X將包含1,7或972.它不包含任何其他值,包括5.

我假定X是在全局內存中,並且所有到它的流量都自然地與它對齊,並且所有到它的流量具有相同的大小,儘管這些原則也適用於共享內存。我還假設您沒有違反CUDA編程原則,例如對設備內存位置的要求爲naturally aligned traffic。我在這裏查看的事務是源自單個SASS指令(每個線程)的那些事務。這種事務可以具有1,2,4,8或16個字節的寬度。我在這裏提出的聲明適用於寫入是源自「相同的代碼行」還是「不同的行」。

這是一個相當複雜的問題(特別是當我們因素緩存行爲,並會發生什麼,當我們扔在混合讀取),但「垃圾」的價值觀應該從未發生。應該在全局內存中出現的唯一值是那些開始的值,或者某個線程在某處寫入的那些值。

+0

您的答案非常適合nVIDIA + CUDA的情況。我編輯了我的答案,表明我對其他案例也感興趣(並且包含您的假設)。 – einpoklum