難道我們保證,當內核執行的結論,其中一項寫入操作的結果將出現在那個位置,而不是一些垃圾?
對於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個字節的寬度。我在這裏提出的聲明適用於寫入是源自「相同的代碼行」還是「不同的行」。
這是一個相當複雜的問題(特別是當我們因素緩存行爲,並會發生什麼,當我們扔在混合讀取),但「垃圾」的價值觀應該從未發生。應該在全局內存中出現的唯一值是那些開始的值,或者某個線程在某處寫入的那些值。
不可能是垃圾。在硬件層面上,它仍然是原子的 - 線程/ SM之一獲取總線,寫入數據並釋放總線,除非數據太寬而無法在一次操作中寫入。您可以添加與芯片設計相關的標籤 – kangshiyin