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];