你的問題很難回答,因爲你混合的東西。有理論(抽象)實體,例如工作項和波前(據我所知,「Wavefront」= NVIDIA的術語中的「Warp」)以及諸如處理器和多處理器(nvidia)等物理部分。
理論抽象是爲了使您的程序獨立於底層硬件配置而發明的。因此,您不會爲處理器的計算索引感到煩惱,該處理器將完成16處理器GPU的工作,然後爲32處理器GPU執行新計算, 您只需考慮具有恆定大小的波前(warps) 。
讓我們回到你的問題:
「我知道,一般的GPU具有高內存訪問時間。然而,性能沒有很大的訪問時間是由執行其它指令‘隱藏’的阻礙。同時等待內存訪問。「
實施例(它不是技術上是正確的,但作爲一個例證):
假設我們正在做100個算術指令,然後遇到的存儲器請求。在物理層面上,由warp/wavefront完成的指令執行是在幾個硬件週期內完成的。這裏的存儲器操作是如何發:
Requested address : a, b, c, d, -, -, -, -, -, -, -, -, -, -, -, -
Abstract WorkItems : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
SIMD Hardware cores : 0, 1, 2, 3, -, -, -, -, -, -, -, -, -, -, -, -
NVIDIA的經線需要4個週期來計算:
Requested address : a, b, c, d, e, f, g, h, -, -, -, -, -, -, -, -
Abstract WorkItems : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
SIMD Hardware cores : *, *, *, *, 0, 1, 2, 3, -, -, -, -, -, -, -, -
允許跳過3-RD週期。
Requested address : a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p
Abstract WorkItems : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
SIMD Hardware cores : *, *, *, *, *, *, *, *, *, *, *, *, 0, 1, 2, 3
在這4個週期內存儲請求被累計。
根據請求的地址和硬件的智能程度,根據硬件規格合併這些請求。假設a..p
在0xFFF0..0xFFFF
範圍內按順序排序,則所有請求將在一個合併內存操作中提供服務。如果硬件遇到不喜歡的地址(根據規格),它會將內存訪問限制在幾個內存操作中。
由於當前warp請求的內存操作,它暫停並且硬件將物理處理器切換到下一個warp。新的扭曲從100條指令開始,與前面的扭曲/波前完成相同。在遇到併發出記憶操作後,第二個warp/wavefront也會暫停。此時,根據您的工作組大小和其他參數,硬件可能會恢復之前的扭曲或繼續下一個扭曲。
在內核執行期間warp的數量是恆定的,並且在主機開始執行之前計算,這意味着如果在內存請求之前沒有這100條有用的指令,那麼最終會讓所有的warp處於暫停狀態狀態,這將導致硬件暫停和性能損失。