并行实验报告
一、积分计算圆周率
1.1积分计算圆周率的向量优化
1.1.1串行版本的设计
任务: 理解积分求圆周率的方法,将其用 C代码实现。
、、亠理论上,dx越小,求得的圆周率越准确;在计算机中由于表 \
示的数据是有精度范围的,如果 dx太小,积分次数过多,误差积累 导致结果不准确。 以下为串行代码:
#in clude
#in clude
double delta =1.0/dt; int i;
for(i=0; i
retur n pi*4; } int mai n() { int dx; double pai;
double start,fi ni sh; dx=N;
二clock(); pai二get_pi(dx);
start
fini sh=clock(); prin tf(\
prin tf(\}
时间运行如下: adnin 19adnlni- virtual-maGhIne: -/Des-ktop$ gf 匚-03 textl t 匚 adninl@adniinl-vtrtual-macliifte:-/Desktops -/a.out 3.14159275 0*G267400OS adninl@adninl-vtctual-riacliifte:-/Desktops ?/a*out 3.14159275 6.624465005 adninl@adninl-vtrtual-nachir?e:-/Desktops ?/a*out 3.14159275 o*024e28ees adntnlgadninl?¥1「七即31-口日匸111“亡;| 第一次: time=0.02674000S 第二次: time=0.02446500S 第三次: time=0.02402800S 三次平均为:0.02508S
1.1.2 SSE向量优化版本设计
任务:此部分需要给出单精度和双精度两个优化版本
(1)测试均在划分度为10的7次方下完成。
以下是SSE双精度的代码:
#i nclude
#defi ne N 10000000 double get_pi (int dt){ double pi=0.0;
double delta =1.0/dt; int i;
for(i=0; i
return pi*4;
} double get_pi_sse(size_t dt){ double pi=0.0; double delta =1.0/dt;
__m128d xmm0,xmm1,xmm2,xmm3,xmm4; xmm0=_mm_set1_pd(1.0); xmm1=_mm_set1_pd(delta);
xmm2=_mm_set_pd(delta,0.0); xmm4=_mm_setzero_pd();
for(long int i=0; i<=dt-2; i+=2){ xmm3= _mm_set1_pd((double)i*delta); xmm3= _mm_add_pd(xmm3,xmm2); xmm3= _mm_mul_pd(xmm3,xmm3); xmm3= _mm_add_pd(xmm0,xmm3); xmm3= _mm_div_pd(xmm1,xmm3); xmm4= _mm_add_pd(xmm4,xmm3); } --
double tmp[2] __attribute__((alig ned(16))); _mm_store_pd(tmp,xmm4); pi+=tmp[0]+tmp[1]/*+tmp[2]+tmp[3]*/;
return pi*4.0; } int main() { int dx; double pai;
double start,fi ni sh; dx=N; start=clock(); pai=get_pi_sse(dx);