contributed by < vtim9907
>
這裡的 training of the hardware prefetcher 的意思應是指因為 HW prefetcher 是做在硬體上的機制,所以這個機制必須要依靠一些先前的紀錄來做判斷,所以才用 "training" 來表達。
Data structure 的複雜程度也會影響效能,比如說 array 或 RDS 就比較好預測,所以就容易用 SW prefetch;但像 hashing 就比較難預測,所以比較難有效的作 prefetch。
streams & strided
將 prefetch 的情況分類為六種 :
文中透過實驗得出的一些結果
SW prefetch 優點
SW prefetch 缺點
SW + HW prefetch 優點
SW + HW prefetch 缺點
首先參考 你所不知道的 C 語言:物件導向程式設計篇 學習封裝技巧,然後改寫 Makefile 把每個轉置的方法獨立出一個執行檔,之後就比較好做分析。
用 D = 8 跑。
原本 SSE 是一次 for loop 跑 4 * 4 的矩陣,但換成 AVX 後,一次可以塞的東西是原來的兩倍,所以我把 code 改成一個 loop 就跑 8 * 8 大小的矩陣。
原本想用 AVX prefetch 跑跑看,但後來看了 Intel Intrinsics Guide 發現除了 SSE 有 prefetch 的指另外,AVX 只有 AVX-512 有 prefetch 的指令可用,而我的 cpu 沒支援,所以沒辦法用。
但我還是想用用看 prefetch ,所以就直接用 SSE prefetch 指令下去跑。
D = 8
目前主要想到變動兩個變數來測量執行時間的差異
1. Array size 的大小
2. Distance 的大小
首先我變動 array size,從原來的 4096 * 4096 開始,之後矩陣的 row 和 column 每次都增加 96,增加 100 次,去觀察各個不同方式的執行時間變化。
首先比較特殊的地方是只有最一開始 N = 4096 的時候,SSE prefetch 是最快的,可是當矩陣逐漸擴大,使用了 AVX 指令集的矩陣轉置速度卻比 SSE prefetch 還快,而且矩陣大小越大,時間差越多。
為何 SSE prefetch 只有最一開始比較快我還沒想清楚,會不會是我 code 寫錯 @@
還不確定為何圖中的抖動如此劇烈,我已經盡量把可能會擾亂測試的程式或網頁都關了,可是跑了好幾次,抖動的程度和頻率好像都幾乎一樣,應該不是巧合? 也許跟 cache 有關,還在思考中。
改變 AVX + SSE prefetch 的 Distance 再測測看:
和 D = 8 時差異不明顯,還是跟只用 AVX 差不多,如同論文內所說,Distance 只要不要挑太小,效能就不會太差。