版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第AVX2指令集浮點乘法性能分析目錄一、AVX2指令集介紹SynopsisDescriptionOperationPerformance二、代碼實現(xiàn)0.數(shù)據(jù)生成1.普通連乘2.AVX2指令集乘法:單精度浮點(float)3.AVX2指令集乘法:雙精度浮點(double)三、性能測試測試環(huán)境計時方式測試內容進行性能測試第一次測試第二次測試四、總結
一、AVX2指令集介紹
AVX2是SIMD(單指令多數(shù)據(jù)流)指令集,支持在一個指令周期內同時對256位內存進行操作。包含乘法,加法,位運算等功能。下附Intel官網(wǎng)使用文檔。
IntelIntrinsicsGuide
我們本次要用到的指令有**__m256_mm256_mul_ps(__m256a,__m256b),__m256d_mm256_mul_pd(__m256da,__m256db)**等,(p代表精度precision,s代表single,d代表double)
它們可以一次取256位的內存,并按32/64位一個浮點進行乘法運算。下附官網(wǎng)描述。
Synopsis
__m256d_mm256_mul_pd(__m256da,__m256db)
Instruction:vmulpdymm,ymm,ymm
CPUIDFlags:AVX
Description
Multiplypackeddouble-precision(64-bit)floating-pointelementsinaandb,andstoretheresultsindst.
Operation
FORj:=0to3
i:=j*64
dst[i+63:i]:=a[i+63:i]*b[i+63:i]
ENDFOR
dst[MAX:256]:=0
Performance
ArchitectureLatencyThroughput(CPI)Icelake40.5Skylake40.5Broadwell30.5Haswell50.5IvyBridge51
二、代碼實現(xiàn)
0.數(shù)據(jù)生成
為了比較結果,我們用1+1e-8填充。這里利用模版兼容不同數(shù)據(jù)類型。由于AVX2指令集一次要操作多個數(shù)據(jù),為了防止訪存越界,我們將大小擴展到256的整數(shù)倍位比特,也就是32字節(jié)的整數(shù)倍。
uint64_tlowbit(uint64_tx)
returnx(-x);
uint64_textTo2Power(uint64_tn,inti)//arraysizedatasize
while(lowbit(n)i)
n+=lowbit(n);
returnn;
templatetypenameT
T*getArray(uint64_tsize)
uint64_tExSize=extTo2Power(size,32/sizeof(T));
T*arr=newT[ExSize];
for(uint64_ti=0;isize;i++)
arr[i]=1.0+1e-8;
for(uint64_ti=size;iExSize;i++)
arr[i]=1.0;
returnarr;
1.普通連乘
為了比較性能差異,我們先實現(xiàn)一份普通連乘。這里也使用模版。
templatetypenameT
TsimpleProduct(T*arr,uint64_tsize)
Tproduct=1;
for(uint64_ti=0;isize;i++)
product*=arr[i];
returnproduct;
2.AVX2指令集乘法:單精度浮點(float)
這里我們預開一個avx2的整形變量,每次從數(shù)組中取8個32位浮點,乘到這個變量上,最后在對這8個32位浮點進行連乘。
floatavx2Product(float*arr,uint64_tsize)
floatproduct[8]={1};
__m256product256=_mm256_setr_ps(1,1,1,1,1,1,1,1);
__m256load256=_mm256_setzero_ps();
for(uint64_ti=0;isize;i+=8)
load256=_mm256_loadu_ps(arr[i]);
product256=_mm256_mul_ps(product256,load256);
_mm256_storeu_ps(product,product256);
product[0]*=product[1]*product[2]*product[3]*product[4]*product[5]*product[6]*product[7];
returnproduct[0];
3.AVX2指令集乘法:雙精度浮點(double)
doubleavx2Product(double*arr,uint64_tsize)
doubleproduct[4]={1};
__m256dproduct256=_mm256_setr_pd(1,1,1,1);
__m256dload256=_mm256_setzero_pd();
for(uint64_ti=0;isize;i+=4)
load256=_mm256_loadu_pd(arr[i]);
product256=_mm256_mul_pd(product256,load256);
_mm256_storeu_pd(product,product256);
product[0]*=product[1]*product[2]*product[3];
returnproduct[0];
三、性能測試
測試環(huán)境
DeviceDescriptionCPUIntelCorei9-9880H8-core2.3GHzMemoryDDR4-2400MHzDual-Channel32GBcomplierAppleClang-1300.0.29.30
計時方式
利用chrono庫獲取系統(tǒng)時鐘計算運行時間,精確到毫秒級
uint64_tgetTime()
uint64_ttimems=std::chrono::duration_caststd::chrono::milliseconds(std::chrono::system_clock::now().time_since_epoch()).count();
returntimems;
測試內容
uint64_tN=1e8;
//comparetheperformanceofsimpleProductandavx2Product
uint64_tstart,end;
//comparefloat
cout"comparefloatproduct"endl;
float*arr=getArrayfloat
start=getTime();
floatsimpleProductResult=simpleProduct(arr,N);
end=getTime();
cout"Simpleproduct:"simpleProductResultendl;
cout"Time:"end-start"ms"endl;
coutendl;
start=getTime();
floatavx2ProductResult=avx2Product(arr,N);
end=getTime();
cout"AVX2product:"avx2ProductResultendl;
cout"Time:"end-start"ms"endl;
coutendl;
delete[]arr;
//comparedouble
cout"comparedoubleproduct"endl;
double*arr2=getArraydouble
start=getTime();
doublesimpleProductResult2=simpleProduct(arr2,N);
end=getTime();
cout"Simpleproduct:"simpleProductResult2endl;
cout"Time:"end-start"ms"endl;
coutendl;
start=getTime();
doubleavx2ProductResult2=avx2Product(arr2,N);
end=getTime();
cout"AVX2product:"avx2ProductResult2endl;
cout"Time:"end-start"ms"endl;
coutendl;
delete[]arr2;
進行性能測試
第一次測試
測試命令
g++-mavx2avx_product.cpp
./a.out
測試結果方法耗時(ms)AVX2乘法單精度57普通乘法單精度232AVX2乘法雙精度121普通乘法雙精度243
這里能看到單精度下已經(jīng)出現(xiàn)了比較明顯的誤差,同時由于CPU內部沒有普通的單精度浮點運算器,所以單精度運算和雙精度耗時所差無幾。
第二次測試
測試命令
現(xiàn)在我們再開啟O2編譯優(yōu)化試一試:
g++-O2-mavx2avx_product.cpp
./a.out
測試結果
方法耗時(ms)AVX2乘法單精度19普通乘法單精度102AVX2乘法雙精度44普通乘法雙精度129
四、總結
經(jīng)過幾次測試,我們可以大概得出,AV
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二硫化碳生產(chǎn)工測試驗證評優(yōu)考核試卷含答案
- 電力通信運維員崗前規(guī)章制度考核試卷含答案
- 片基流延工誠信道德能力考核試卷含答案
- 電子玻璃制品鍍膜工安全宣教測試考核試卷含答案
- 安全員考試請假條
- 2025年超細銀粉末、銀鈀粉、鈀粉、鉑粉項目合作計劃書
- 2026年智能心率帶項目營銷方案
- 2025年江蘇省南通市中考物理真題卷含答案解析
- 2025年山東省日照市中考英語真題卷含答案解析
- 2025康復醫(yī)學與技術專業(yè)知識題庫及答案
- 民法典物業(yè)管理解讀課件
- 2025年中國汽輪機導葉片市場調查研究報告
- 中班幼兒戶外游戲活動實施現(xiàn)狀研究-以綿陽市Y幼兒園為例
- 特色休閑農場設計規(guī)劃方案
- 采購部門月度匯報
- 新華書店管理辦法
- 檔案專業(yè)人員公司招聘筆試題庫及答案
- 工程竣工移交單(移交甲方、物業(yè))
- 來料檢驗控制程序(含表格)
- 2025年鈦合金閥項目可行性研究報告
評論
0/150
提交評論