作者johnjohnlin ()
看板C_and_CPP
標題Re: [問題] Matrix Multiplication 的陣列問題
時間Thu Oct 29 22:19:59 2015
其實原理很簡單
只要從這幾點考量
1. 最後我得到的起頭是對齊32的
1. 最後我得到的起頭往後數有N個
1. 我要的位置開頭可能落在任何%32的位置
1. 所以我應該要大一點(最不幸的情形下要多多少?),拋棄掉前面
1. 我要到大一點之後我要怎麼取得有對齊的起頭
從這幾點其實就很好理解這個 code 了
至於為什麼要 32 的倍數
推文中的 SSE/AVX 之類的是一個可能
也可能只是要作 tiling 有 $ line 的考量
$ line 一般是 64 或是 128B
※ 引述《harristime (瀚宇)》之銘言:
: 下列是一段Matrix Multiplication程式中宣告三個陣列A,B,C的一段程式,
: 請問各位知道星號內那段code的意思是什麼嗎?
: 感謝
: #define N 2048
: float *A, *B,*C;
: float *AUnaligned, *BUnaligned,*CUnaligned;
: void allocandpopulate() {
: AUnaligned=A=new float[N*N+16];
: BUnaligned=B=new float[N*N+16];
: CUnaligned=C=new float[N*N+16];
: ***********
: int alignA=(((unsigned long long) A) & 31)/4;
: int alignB=(((unsigned long long) A) & 31)/4;
: int alignC=(((unsigned long long) A) & 31)/4;
: A+=8-alignA
: B+=8-alignB
: C+=8-alignC
: ************
: for (int i=0;i<N*N;i++)
: {
: A[i]=(rand()+0.5f)/(RAND_MAX+1.f);
: B[i]=(rand()+0.5f)/(RAND_MAX+1.f);
: }
: }
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.175.53
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1446128402.A.6BE.html
推 LiloHuang: 頭一次看到 cache line 寫成 $ line,十分有趣 :P 10/29 22:23
→ johnjohnlin: $ 不是本來就是 cache 的縮寫嗎 XD 10/29 22:42
推 LPH66: 數字都標 1. 是個 markdown 風格 :p 10/30 10:05
推 BlazarArc: XDDD 10/30 10:17
推 yvb: 哪可看到 $ 做cache的縮寫? (我還以為 $ 是cash的縮寫 :P) 10/30 16:50
→ MOONRAKER: 以前老師都寫¢ 比$還小 10/30 16:55
推 yvb: 推 ¢ :) 不過剛找了一下, 還真只見 L1$ L2$, 不見 L1¢之類. 10/30 18:01
推 suhorng: 發音一樣吧,cash, cache 11/04 17:23