Intel RDT支援試玩

Intel RDT是一組CPU上的last level cache(LLC)和memory bandwidth監控及管理技術

AMD也有支援同樣的技術但叫作Platform QoS

RDT包含了

CMT可以監控cache misses和使用狀況
MBM可以監控使用的記憶體頻寬
CAT可以劃分特定區塊的LLC給core專用
CDP可以將LLC劃分為專門給code或data使用
MBA可以針對core指定可使用的記憶體頻寬上限

這系列技術主要可以用來在雲端上處理 noisy neighbor problem,提供使用者更精細的資源控制

intel也提供了工具包來方便進行控制

我們以內附的工具pqos來實驗


pqos -d可顯示CPU支援的技術

Hardware capabilities
    Monitoring
        Cache Monitoring Technology (CMT) events:
            LLC Occupancy (LLC)
        Memory Bandwidth Monitoring (MBM) events:
            Total Memory Bandwidth (TMEM)
            Local Memory Bandwidth (LMEM)
            Remote Memory Bandwidth (RMEM) (calculated)
        PMU events:
            Instructions/Clock (IPC)
            LLC misses
    Allocation
        Cache Allocation Technology (CAT)
            L3 CAT
                CDP: disabled
                Num COS: 16
        Memory Bandwidth Allocation (MBA)
            Num COS: 8

pqos -s -v可顯示目前的參數和設定

裡面重要的資訊如下,如果沒有顯示則不支援

INFO: L3 CAT details: CDP support=1, CDP on=0, #COS=16, #ways=11, ways contention bit-mask 0x600

表示支援CDP,開啟後能設定LLC是給data還是code使用
COS則是classes of service,一共有最多16種可以設定
ways則是LLC有幾路能夠使用,最多11路

INFO: MBA details: #COS=8, linear, max=90, step=10

表示支援MBA,最多8個等級的COS,最多可以設定到90%

L3CA/MBA COS definitions for Socket 0:
    L3CA COS0 => MASK 0x7ff
    L3CA COS1 => MASK 0x7ff
    ...
    MBA COS0 => 100% available
    MBA COS1 => 100% available
    ...

這邊顯示每個COS等級對應的CAT和MBA設定
CAT 0x7ff是用bitmask的方式表示11路cache皆可使用
MBA 100%是記憶體頻寬最高允許使用到100%

Core information for socket 0:
    Core 0, L2ID 16, L3ID 0 => COS0, RMID0
    Core 2, L2ID 4, L3ID 0 => COS0, RMID0
    Core 4, L2ID 9, L3ID 0 => COS0, RMID0
    Core 6, L2ID 19, L3ID 0 => COS0, RMID0
    Core 8, L2ID 2, L3ID 0 => COS0, RMID0
    Core 10, L2ID 18, L3ID 0 => COS0, RMID0
    Core 12, L2ID 17, L3ID 0 => COS0, RMID0
    Core 14, L2ID 27, L3ID 0 => COS0, RMID0

每個核心的COS等級設定


如果想開啟CDP則執行

pqos -R l3cdp-on reset所有設定並開啟CDP

INFO: L3 CAT details: CDP support=1, CDP on=1, #COS=8, #ways=11, ways contention bit-mask 0x600
...
    L3CA COS0 => DATA 0x7ff, CODE 0x7ff

則COS會減半並在LLC能分別對DATA或CODE設定bitmask


使用pqos -T則會顯示類似top的畫面來監控使用情況

其中MISSES為LLC misses,MBL為本地頻寬,MBR為遠端頻寬 (numa架構下)

TIME 2021-09-28 13:15:59
    CORE         IPC      MISSES     LLC[KB]   MBL[MB/s]   MBR[MB/s]
      10        0.62          0k      3528.0         0.0         0.0
       9        0.37          1k      3384.0         0.1         0.0
       6        0.62          2k      3312.0         0.0         0.2
      14        0.41          2k      3312.0         0.0         0.1
       0        0.67          1k      3096.0         0.0         0.2
       2        0.81          6k      3096.0         0.0         0.8
       1        0.48          2k      2592.0         0.1         0.0
      12        0.47          1k      2592.0         0.0         0.1
       3        0.37          1k      2376.0         0.0         0.0
       4        0.65          1k      2304.0         0.0         0.0
      13        0.44          2k      2160.0         1.6         0.0
       8        0.69          1k      2088.0         0.0         0.0
      11        0.31          2k      2016.0         0.0         0.0
      15        0.37          2k      2016.0         0.0         0.2
       7        0.29          2k      1872.0         0.0         0.0
       5        0.41          2k      1368.0         0.0         0.0

下列範例設定為:

COS1可以使用8way、COS2使用3way
核心0,4,8,12設定為COS1
核心2,6,10,14設定為COS2

pqos -e 'llc:1=0x0ff;llc:2=0x700'

pqos -a 'llc:1=0,4,8,12;llc:2=2,6,10,14'

如需還原回預設值則使用pqos -R


設定完成後使用STREAM benchmark測試cache misses狀況

並執行pqos -T紀錄數據

以測試的CPU cache大小為參考:

L2 cache = 8 x 1MB
L3 cache = 24.75 MB

將array size設定為

Array size = 600000 (elements), Offset = 0 (elements)
Memory per array = 4.6 MiB (= 0.0 GiB).
Total memory required = 13.7 MiB (= 0.0 GiB).

重複執行次數為 140000


使用整顆CPU 8個thread執行:

numactl --cpubind=0 --membind=0 ./stream_c.exe

期間misses約為10k

使用一半 4個thread執行:

numactl --cpubind=0 --membind=0 taskset -c 0,4,8,12 ./stream_c.exe

期間misses約為1500k

同時執行兩個task 使用不同core執行:

numactl --cpubind=0 --membind=0 taskset -c 0,4,8,12 ./stream_c.exe
numactl --cpubind=0 --membind=0 taskset -c 2,6,10,14 ./stream_c.exe

期間misses約為30000~40000k

如設定COS後則為 13000k 和 80000k

記憶體頻寬部分在以上實驗則沒有顯著變化,CAT主要還是影響cache misses和latency


附錄

好奇11-way到底是怎麼來的,貌似是每個核心上面都有一塊L3,組成一大塊shared cache

在塞東西進LLC時就需要均勻分布上去,所以需要一個hash算法把資料擺上去又能避免衝突

經過一通神秘操作最後就不是通常看到的二的冪次了,但Intel沒有公布細節

所以也僅止於推測內部結構

ref:

Cache Way Organization on Skylake
Address Hashing in Intel Processors