2011-05-05 75 views
1

我知道GPU通常具有較高的內存訪問時間。然而,由於在等待內存訪問時執行其他指令而導致訪問時間「隱藏」,性能不會受到很大阻礙。GPU隱藏內存訪問時間

我只是想知道,如果您有一個具有64個工作項目和16個處理器內核的波陣面,則每個處理器內核將擁有64/16 = 4工作項目。而且,所有內核必須並行執行所有工作項目。

因此,如果工作項需要內存訪問,會發生什麼?當然,因爲所有的指令都是相同的,你將有16個內存訪問來計算(或者只是1?)。那麼是否每個核心的4個工作項目中的另一個被替換開始執行?這是否意味着所有16個處理器內核現在都在執行相同的新工作項目。

回答

4

你的問題相當以AMD爲中心,這是一個我不那麼流利的體系結構,但是NVIDIA架構採用了一種內存控制器設計,可以將DRAM訪問請求融合爲單個事務(NVIDIA的「內存合併」), 。

其基本思想是內存控制器會將位於小地址範圍I內的請求融合到單個加載或存儲中,以便爲執行加載的SIMD組中的每個線程提供服務。最新的硬件支持32,64,128和256字節的事務大小,並且內存控制器也足夠聰明,可以在訪問的內存區域不與事務大小的邊界對齊的情況下,將額外的單個字大小的ansaction添加到大型事務中。

0

你的問題很難回答,因爲你混合的東西。有理論(抽象)實體,例如工作項和波前(據我所知,「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..p0xFFF0..0xFFFF範圍內按順序排序,則所有請求將在一個合併內存操作中提供服務。如果硬件遇到不喜歡的地址(根據規格),它會將內存訪問限制在幾個內存操作中。

由於當前warp請求的內存操作,它暫停並且硬件將物理處理器切換到下一個warp。新的扭曲從100條指令開始,與前面的扭曲/波前完成相同。在遇到併發出記憶操作後,第二個warp/wavefront也會暫停。此時,根據您的工作組大小和其他參數,硬件可能會恢復之前的扭曲或繼續下一個扭曲。

在內核執行期間warp的數量是恆定的,並且在主機開始執行之前計算,這意味着如果在內存請求之前沒有這100條有用的指令,那麼最終會讓所有的warp處於暫停狀態狀態,這將導致硬件暫停和性能損失。