2012-06-30 55 views

回答

2

默認情況下,全局內存中的所有內存負載均緩存在L1中。全局內存加載的目標位置對L1緩存(無論是寄存器還是共享內存還是線程本地內存)都沒有影響。共享內存本身顯然不被緩存。

1

這只是爲了擴展@talonmies說的。

副本是兩個獨立的操作在低級別,負載和商店。如果加載和存儲訪問全局內存,則它們可以緩存在L1和L2中。

由於副本的加載部分來自全局內存,因此默認情況下它將被緩存在L1和L2中。因此,除非編譯器檢測到從全局共享內存複製到共享內存並使用未緩存的加載的特殊情況,否則最終會得到兩個數據副本,這些副本可以以相同的延遲訪問,因爲共享內存和L1緩存是通過相同的物理片上存儲器。

從CUDA C編程指南4.2:

存在L1高速緩存爲每個多處理器和通過所有 多處理器,共享的L2高速緩存兩者都用於緩存訪問本地或全局 存儲器,包括臨時登記泄漏。高速緩存行爲(例如,是否讀取 緩存在L1和L2中或僅L2中)可以使用對加載或存儲指令的修飾符在每次訪問的基礎上部分配置。

我找不到任何關於如何這種行爲可以從CUDA C.修改任何

+3

它不能在用戶代碼進行修改,但對於費米和開普勒的設備,它可以通過編譯器選項來修改。使用'-Xptxas =「 - dlcm = cg」'將強制彙編程序生成32字節而不是繞過L1緩存的128字節事務。 – talonmies