作者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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1446128402.A.6BE.html
1F:推 LiloHuang: 头一次看到 cache line 写成 $ line,十分有趣 :P 10/29 22:23
2F:→ johnjohnlin: $ 不是本来就是 cache 的缩写吗 XD 10/29 22:42
3F:推 LPH66: 数字都标 1. 是个 markdown 风格 :p 10/30 10:05
4F:推 BlazarArc: XDDD 10/30 10:17
5F:推 yvb: 哪可看到 $ 做cache的缩写? (我还以为 $ 是cash的缩写 :P) 10/30 16:50
6F:→ MOONRAKER: 以前老师都写¢ 比$还小 10/30 16:55
7F:推 yvb: 推 ¢ :) 不过刚找了一下, 还真只见 L1$ L2$, 不见 L1¢之类. 10/30 18:01
8F:推 suhorng: 发音一样吧,cash, cache 11/04 17:23