---
# System prepended metadata

title: Untitled

---

511557009 曾智謙
#part1 


 

在N=10000時，各個Vector Width的執行結果如
![](https://i.imgur.com/dlyHQqs.png)
![](https://i.imgur.com/eLZ0lp7.png)
![](https://i.imgur.com/k1jxB6r.png)
![](https://i.imgur.com/ygPMLuE.png)
可以看出 vector utilization 會隨著 vector width 的上升而下降
主要原因是因為VECTOR_WIDTH上，有些情況會造成空間的浪費！
舉例若有14組數字，VECTOR_WIDTH = 8
則0~7一組，8~13一組，後續就會造成有兩個空間的浪費!


#Part2-1

將 test1.cpp 中 __builtin_assume_aligned 的參數從 16 改為 32 

可以從 test1.vec.restr.align.avx2.s 中看到成功對齊後， vmovaps 取代了 vmovups 

![](https://i.imgur.com/EWRBWT9.png)

#Part2-2

![](https://i.imgur.com/44rsVi8.png)
![](https://i.imgur.com/NQGe6iG.png)
![](https://i.imgur.com/QPuVRd5.png)

10次運算取平均得出，case2大概比Case1快了3.15倍，case3比case2快了1.87倍
這是因為從 test1.cpp 中 __builtin_assume_aligned 的參數為 16 bytes 推測在 PP machines 裡 default vector registers 的 bit width 為 128 bits，
同理，根據 Q2-1，AVX2 vector registers 的 bit width 應為 256 bits 
以下是我執行三種不同 case 各 10 次求得的平均執行時間。

##Part2-3

在原本的程式程式會優先處理c[j] = a[j] 然後再執行 if(b[j] > a[j])c[j] = b[j]
當他先處理c[j] = a[j] (使用mov 指令將 a[j] 值放入 c[j] 位置)後，if (b[j] > a[j]) c[j] = b[j]無法用 maxps進行最佳化。
因為該if 此時判斷為false，maxps會將a[j]值存入特定的暫存器，此時產生的組語使用指標，並判斷是否進行 c[j] = b[j]。

#加上Else後
compiler首先要處理if (b[j] > a[j])
會使用maxps指令來完成，b[j]與a[j]大者將會存入指定暫存器，使用mov指令將該暫存器存放的值放入c[j]位置即可。

// origin 

c[j] = a[j]; 

if (b[j] > a[j]) 

  c[j] = b[j]; 

 

// better 

if (b[j] > a[j]) c[j] = b[j]; 

else c[j] = a[j]; 