2016q3 Homework1(Compute Pi) === # SIMD * Single Instruction Multiple Data ![](https://i.imgur.com/olcCeTe.png) * SIMD 利用擴展 bit 的儲存空間,同一運算來達成加快效率,AVX 支援128、256 bit 為整合單位 ![](https://i.imgur.com/ozORkv8.png) * 4個 16 bit (int)放入 128 bit 中, double 在linux下 align為32(windows則是64) ![](https://i.imgur.com/iDTO2pq.png) * int tmp[4] __attribute__((aligned(16))); 16 為 16bytes, 需要align機制, 來將tmp整合128bits * 順帶一提,以下是struct 的align機制 ``` struct example{ char data1; short data2; int data3; char data4; }; ``` ![](https://i.imgur.com/CUNwvi7.png) struct 的 align 是以當前型態別的倍數來存放 1. data1 , char的align 為 1 放置0X00 2. data2 , short的align 為 2 放置0X02, 要2的倍數所以0X01時 padding 3. data3 , int的align 為 4 放置0X0 4. data4 , char的align 為 1 放置0X09 5. 因為目前最大align 數為 32,所以struct 也要以4的倍數結束,所以要 padding 這樣可以一次取出struct,在取各值,如果要節省空間則可以用#pragma pack(16) * ==[Basics of SIMD Programming](https://www.kernel.org/pub/linux/kernel/people/geoff/cell/ps3-linux-docs/CellProgrammingTutorial/BasicsOfSIMDProgramming.html)== * ==[Data Structure Alignment ](http://kf99916cs.blogspot.tw/2012/10/data-structure-alignment.html)== # OpenMP # 結果圖 * Makefile ``` for i in ` seq 100 5000 25000 `; do \ 變數 初始值 counter 末值 同一行 ``` ![](https://i.imgur.com/2RqKKGD.png) 使用openMP thread 4 ,跳動非常大,但整體而言曲線較低於openMP thread 2 - 因該可以設平滑取線, smooth acsplines ,目前會有負數加值的錯? - 修改MAKEFILE 的迴圈,使得可以不以+1來紀錄,可以+5、+10