@(System)
姚偉峰
深度學(xué)習(xí)等計算密集型任務(wù)很關(guān)注設(shè)備的峰值算力屑那,落實到具體指標(biāo),就是大家都很關(guān)心T(FL)OPS (Tera (FLoat) OPerations per Second)祸憋。這里,operations具體指的就是乘加操作练湿。該指標(biāo)在GPU上是明確標(biāo)示供查的忽肛,但CPU目前并不會在spec中暴露TOPS指標(biāo)。
一種方法可以通過跑BLAS的benchmark來測量的损敷,這種方法有兩個問題:一是需要一定的操作成本葫笼,二是受軟件優(yōu)化的影響(所以,如果出了問題就容易不知道這是硬件能力不行還是軟件優(yōu)化沒到位)拗馒。因此路星,需要一個對硬件能力的直接估計。
這里提供一個計算CPU峰值算力的公式來解決這個問題诱桂。
CPU使用SIMD協(xié)處理器(co-processor) 來加速FP32乘加運算洋丐,如SSE呈昔、AVX2、AVX-512友绝。更具體地堤尾,是由協(xié)處理器的FMA(Fused Multiply-Add)單元完成的。所以CPU的T(FL)OPS主要取決于FMA的計算能力迁客。
浮點算力
FP64 TFLOPS計算
AVX FP64 FMA
FP64 FMA乘加指令vfmadd132pd
執(zhí)行以下操作:
這里,向量的長度由AVX寄存器長度決定哲泊。
如: 一個AVX-512寄存器可以存放8個FP64 (), 那么剩蟀,,和的長度就均為8,一個AVX-512 FMA每個clock cycle可以做8個乘加操作丙号,如下:
因此先朦,F(xiàn)P64的可以計算如下:
這里,乘法和加法各算一個操作犬缨,所以8需要乘2喳魏。
舉個栗子
Xeon SkyLake 8180,一個socket有28個core怀薛,每個core有一個AVX-512協(xié)處理器刺彩,每個AVX-512協(xié)處理器配有2個FMA。因此:
frequency可以通過查spec得到枝恋,這里需要取AVX-512 max all core Turbo frequency创倔,即2.3 GHz。
所以焚碌,一個雙路(dual-socket) SkyLake 8180系統(tǒng)的FP64峰值TFLOPS (Tera FLoat OPerations per Second)為:
FP32 TFLOPS計算
AVX FP32 FMA
FP32 FMA乘加指令vfmadd132ps
執(zhí)行以下操作:
一個AVX-512寄存器可以存放16個FP32 (), 因此,十电,和的長度均為16,一個AVX-512 FMA每個clock cycle可以做16個乘加操作鹃骂,如下:
因此台盯,F(xiàn)P32的可以計算如下:
舉個栗子
Xeon SkyLake 8180,一個socket有28個core畏线,每個core有一個AVX-512協(xié)處理器静盅,每個AVX-512協(xié)處理器配有2個FMA。因此:
又因為8180 AVX-512 max all core Turbo frequency = 2.3GHz象踊,則一個雙路SkyLake 8180系統(tǒng)的FP32峰值TFLOPS為:
FP16 TFLOPS計算
Using AVX FP32 FMA
Xeon CPU在SapphirRapids(SPR)之前不支持FP16的原生FMA運算温亲,需要先通過vcvtph2ps
指令將FP16轉(zhuǎn)換成FP32棚壁,再通過FP32的FMA運算來完成。此時栈虚,F(xiàn)P16的峰值TFLOPS與FP32的峰值TFLOPS是相等的袖外。
AVX FP16 FMA
從SPR開始,AVX512引入了vfmadd132ph
指令用于FP16的FMA運算魂务。凡是CPU Flag中有AVX512_FP16的CPU均支持原生FP16乘加曼验。一個AVX-512寄存器可以存放32個FP16 (),一個AVX-512 FMA每個clock cycle可以做32個乘加操作粘姜,如下:
此時鬓照,F(xiàn)P16的可以計算如下:
BF16 TFLOPS計算
Xeon CPU從CooperLake(CPX)開始支持BF16的乘加運算,凡是CPU Flag中有AVX512_BF16的CPU均支持原生BF16乘加孤紧。但因為其復(fù)用了FP32的FMA豺裆,所以暴露出來的BF16指令并不是標(biāo)準(zhǔn)的FMA,而是DP(Dot Product)号显。
AVX BF16 DP
BF16 DP指令vdpbf16ps
操作如下:
一個AVX-512寄存器可以存放32個BF16 ()臭猜。因此,一個AVX-512 BF16 DP每個clock cycle可以做32個乘加操作押蚤。
因此蔑歌,可以計算如下:
整型算力
INT32 TOPS計算
AVX INT32 MA
CPU通過兩條指令vpmuldq + vpaddq
完成INT32的乘加操作,如下:
一個AVX-512寄存器可以存放16個INT32 ()揽碘。因此次屠,一個AVX-512 FMA每2個clock cycle可以做16個INT32乘加操作,即平均每個clock cycle可以做8個INT32乘加操作雳刺。
因此劫灶,可以計算如下:
INT16 TOPS計算
pre-VNNI MA
在支持VNNI(Vector Neural Network Instructions)指令前,CPU通過兩條指令vpmaddwd + vpaddd
完成INT16的DP操作(原因也是為了復(fù)用INT32的FMA煞烫,所以選擇不支持INT16的FMA浑此,而只支持Multiply Add), 如下:
一個AVX-512寄存器可以存放32個INT16 ()。因此滞详,每2個clock cycle可以做32個INT16乘加操作凛俱,即平均每個clock cycle做16個INT16乘加操作。
因此料饥,可以計算如下:
post-VNNI DP
在支持VNNI指令后蒲犬,CPU通過一條指令vpdpwssd
完成INT16的乘加操作, 如下:
因此,一個AVX-512 FMA每個clock cycle可以做32個INT16乘加操作岸啡,可以計算如下:
INT8 TOPS計算
pre-VNNI MA
在支持VNNI指令前原叮,CPU通過三條指令vpmaddubsw + vpmaddwd + vpaddd
完成INT8的DP操作, 如下:
一個AVX-512寄存器可以存放64個INT8 ()。因此,每3個clock可以做64個INT8乘加操作奋隶,即平均每個clock做個INT8乘加操作擂送。
因此,可以計算如下:
post-VNNI DP
在支持VNNI指令后唯欣,CPU通過一條指令vpdpbusd
完成INT8的DP操作, 如下:
一個AVX-512寄存器可以存放64個INT8 ()嘹吨。因此,一個AVX-512 FMA每個clock cycle可以做64個INT8乘加操作境氢。
因此蟀拷,可以計算如下: