contributed by <kaizsv
>
第四周作業要比較不同大小的矩陣的影響,我另外還比較了不同 prefetch distance 的影響。 跳到書籤
用8X8
矩陣終於懂了,它把大矩陣分成許多的4X4
矩陣,如果是在對角線上,反轉後放回原位,若是其它的,反轉後放在其對角的位置。
相比於navie_transpose
是一個一個放在對角的位置。
這裡使用固定長度8的prefetch distance
,每次執行時候會告訢CPU載入下一次運算用的資料,如果超出範圍CPU就不會載入(SSE 介紹 [Page 7]),而_MM_HINT_T1
告訴CPU要把載入的資料放在 L2 Cache。
因為每一次for
迴圈的載入是 row base,而儲存到新的 dst 是 column base,因此用prefetch
可以降底cache miss
。
在一些系統架構下,有一些 counter 沒有在perf list
裡面,參考這篇文章perf Examples,如果是 Intel CPU 的話可以看Intel® 64 and IA-32 Architectures Developer's Manual: Vol. 3B的19章,要對應到自己的 CPU 型號查 mask number 及 event number。
基本用法如下
# perf stat -e cycles,instructions,r80a2,r2b1 gzip file1
Performance counter stats for 'gzip file1':
5,586,963,328 cycles # 0.000 GHz
8,608,237,932 instructions # 1.54 insns per cycle
9,448,159 raw 0x80a2
11,855,777,803 raw 0x2b1
1.588618969 seconds time elapsed
r80a2
80是 mask number,a2 是 event number,可以查出raw 0x80a2
是RESOURCE_STALLS.OTHER
用來查看因為其它 resource issues 而被 stall 的 cycle數。r2b1
同理是UOPS_DISPATCHED.CORE
。
在寫avx_prefetch
版本時遇到一個問題,PFDIST 到底要多少,從官網的資料_mm_prefetch()
會載入一個 cache line 的長度,我的 CPU cache line = 64B,
這裡的 cache-misses 及 seconds 有包含了兩個 clock_gettime() 及一個 printf(),我想說若只是比較的話沒有必要把多餘的程式碼刪掉。
cache-misses | seconds | |
---|---|---|
naive | 23,787,617 | 0.414481027 |
sse | 11,093,003 | 0.294677882 |
sse_prefetch (DIST 8) | 8,311,259 | 0.236825513 |
avx | 8,671,298 | 0.244085014 |
avx_prefetch (DIST 8) | 9,273,692 | 0.227254568 |
avx_prefetch (DIST 16) | 8,783,887 | 0.232082226 |
sse+prefetch 確實讓 cache-misses 下降,但avx
加上 prefetch 後 cache-misses 不降反升,雖然執行時間有稍微下降,我在想會不會跟兩件事有關。
在When Prefetching Works, When It Doesn’t, and Why 5.1.4提到,若程式移植到不同的機器上,最佳的 distance 是會變動的
應該要像 Fig. 7 那樣畫出不同 distance 的影響,但我時間拿捏不好
矩陣更大或更小有無影響,cache-misses
下圖是 distance 從 0~16 跑 10 次的平均時間 (us),從圖的趨勢可以觀察到 distance 為0, 8, 16
是比較有代表性的,因此抓出這三個 distance 的 perf stat 在下表。block size 固定為 4096。
sse_prefetch | avx_prefetch | |
---|---|---|
cache-misses (DST = 0) | 11,109,048 | 8,928,395 |
L1-dcache-load-misses (DST = 0) | 8,519,002 | 8,182,973 |
L1-icache-load-misses (DST = 0) | 50,920 | 48,207 |
cache-misses (DST = 8) | 8,294,171 | 9,254,506 |
L1-dcache-load-misses (DST = 8) | 8,518,941 | 8,176,969 |
L1-icache-load-misses (DST = 8) | 46,718 | 50,224 |
cache-misses (DST = 16) | 8,837,080 | 8,634,863 |
L1-dcache-load-misses (DST = 16) | 8,518,229 | 8,169,116 |
L1-icache-load-misses (DST = 16) | 46,210 | 48,421 |
用perf stat計算cache-misses還包含了
fopen
,fprintf
等呼叫
因為我的hint是_MM_HINT_T1
很明顯 L1 cache misses 變動不大。參考吳彥寬同學筆記,register L1 L2
的成本不一樣,因此又用_MM_HINT_T0
做了同樣的實驗。
sse_prefetch | avx_prefetch | |
---|---|---|
cache-misses (DST = 0) | 11,111,058 | 8,930,902 |
L1-dcache-load-misses (DST = 0) | 8,519,557 | 8,188,156 |
L1-icache-load-misses (DST = 0) | 47,861 | 44,154 |
cache-misses (DST = 8) | 8,010,660 | 8,967,156 |
L1-dcache-load-misses (DST = 8) | 8,816,422 | 9,012,397 |
L1-icache-load-misses (DST = 8) | 40,924 | 43,270 |
cache-misses (DST = 16) | 8,779,192 | 8,477,066 |
L1-dcache-load-misses (DST = 16) | 12,701,238 | 10,329,813 |
L1-icache-load-misses (DST = 16) | 43,528 | 45,176 |
就 runtime 的圖來看,趨勢是差不多的,但在DST = 8 的時候時間又減少了一點,再看 L1-cache,L1-icache-misses 有減少,L1-dcache-misses 增加,而 cache-misses 在DIST = 8 時略微下降 |
y
軸是對數座標,prefetch distance 固定為 8,跑 10 次的平均值,就時間上來看,1024 2048 4096 8192
的 runtime 正好差 4 倍,cache-misses 大約比 4 倍多一點。
cache-misses | naive | sse | sse_prefetch | avx | avx_prefetch |
---|---|---|---|---|---|
1024 | 1,091,966 | 602,467 | 500,244 | 514,517 | 528,372 |
2048 | 5,899,170 | 2,705,538 | 2,087,994 | 2,119,224 | 2,282,681 |
4096 | 23,868,323 | 11,098,391 | 8,260,486 | 8,633,959 | 9,254,081 |
8192 | 95,162,778 | 45,083,319 | 36,873,007 | 35,296,137 | 39,163,892 |
16384 | 523,578,908 | 148,994,080 | 156,092,042 | 145,099,308 | 150,593,769 |
sse
一次處理 4x4 個 int,DST = 8 表示會載入下一次迴圈的資料,同理avx
一次處理 8x8 的矩陣,DST = 16 時的 cache-misses 較低,但 cache-misses (L1 cache-misses)及 runtime 就沒有明顯的關係。naive
異外得多,sse
大楖差 3點多倍,assigment_8
software-pipelining
or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Do you want to remove this version name and description?
Syncing