開發紀錄(B)
2015q3 Homework7 Due: 2015/11/18
  • 說明 naive_transpose, sse_transpose, sse_prefetch_transpose 之間的效能差異,以及 prefetcher 對 cache 的影響
  • 在 github 上 fork prefetcher,嘗試用 AVX 進一步提昇效能
 

效能差異

執行 ./main 結果,做轉置矩陣
輸入與輸出矩陣皆為一維,只是以4*4轉置矩陣來表示
  0   1   2   3
  4   5   6   7
  8   9 10  11
12 13 14 15
 
  0   4   8  12
  1   5   9  13
  2   6 10  14
  3   7 11  15
sse prefetch:          104200 us
sse:                          202749 us
naive:                      398365 us
 
naive_transpose
將原本矩陣(src)的值直接放進對應目標矩陣(dst)位置的值
*(dst + x * h + y) = *(src + y * w + x);
 
sse_transpose
 將每一個row打包成128 bits,在透過高低位的交換,就可以完成轉置矩陣 
這種方式一次可以處理 4 elements,所以會比 naive_transpose 還要快。
 
sse_prefetch_transpose
prefetch 指令的主要目的,是提前讓 CPU 載入稍後運算所需要的資料。通常是在對目前的資料進行運算之前,告訴 CPU 載入下一筆資料。這樣就可以讓目前的運算,和載入下一筆資料的動作,可以同時進行。不同的 prefetch 指令則是告訴 CPU 將資料載入不同層次的 cache。下圖擷取至該論文
 
 

分析cache miss/hit

參考homework2的Makefile去修改
 
naive:                  273161 us
 
 
 Performance counter stats for './naive_transpose':
 
        16,983,562      cache-misses              #   93.349 % of all cache refs    
        18,193,603      cache-references                                            
        21,432,913      L1-dcache-load-misses