contributed by <kaizsv
>
benchmark_clock_gettime.c
的loop提高到100,下面分別是時間及誤差,由圖可見avxunroll
執行較短的時間,但N要超過80,000才會精確到小數點下5位,但這個時間是loop=100,正常來說還要更快才對。
10/1更新
圖表晝出來卻沒有分析,上圖的error為什麼avx
avxunroll
會有誤差,看了王紹華同學的筆記,才聯想到avxunroll
執行1次等於avx
執行4次,baseline
的16次,而我的Makefile
的迴圈為seq 100 2000 800000
,因為100不是16的倍數,跟baseline
比差了4次沒執行,因此avxunroll
的錯誤比其它人來得高。
acos的值域為 [0,
在網路上找到,用幾何來逼近pi,原理是圓的內接多邊形邊長CD
。而圓周2piR
就可以求出近似pi值。
假設 dn 為 n 多邊形的邊長且
如此可以求出多邊形的邊長
double polygon(size_t N)
{
double polygon_edge_length_squared = 2.0;
unsigned int polygon_sides = 4;
for (int i = 0; i < N; i++) {
polygon_edge_length_squared = 2 - 2 * sqrt(1 - polygon_edge_length_squared / 4);
polygon_sides *= 2;
}
return polygon_sides * sqrt(polygon_edge_length_squared) / 2;
}
這個方法不能用任意的多邊形,只能是4 8 16 32…,若要使用任意多邊形,就要算弧度,但弧度跟
在我的實驗中,N到100多的時候就會因為平方根太小變成0,算出來是錯的,但就算N小於100,誤差會比其它版本來得小,但超過100就大幅增加。
assigment_3
compute-pi