OpenMP并行实验报告

上传人:s9****2 文档编号:508271488 上传时间:2022-12-18 格式:DOCX 页数:13 大小:24.80KB
返回 下载 相关 举报
OpenMP并行实验报告_第1页
第1页 / 共13页
OpenMP并行实验报告_第2页
第2页 / 共13页
OpenMP并行实验报告_第3页
第3页 / 共13页
OpenMP并行实验报告_第4页
第4页 / 共13页
OpenMP并行实验报告_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《OpenMP并行实验报告》由会员分享,可在线阅读,更多相关《OpenMP并行实验报告(13页珍藏版)》请在金锄头文库上搜索。

1、并行实验报告、 积 分计算圆周率1.1 积分计算圆周率的向量优化1.1.1 串行版本的设计任务:理解积分求圆周率的方法,将其用 C 代码实现注意: 理论上, dx 越小,求得的圆周率越准确;在计算机中由于表示的数据 是有精度范围的,如果 dx 太小,积分次数过多,误差积累导致结果不准确。以下为串行代码:#include #include #define N 10000000 double get_pi(int dt) double pi=0.0;double delta =1.0/dt; int i;for(i=0; idt; i+)double x=(double)i/dt; pi+=del

2、ta/(1.0+x*x); return pi*4;int main()int dx; double pai; double start,finish;dx=N;start=clock(); pai=get_pi(dx); finish=clock(); printf(%.8lfn,pai);printf(%.8lfSn,(double)(finish-start)/CLOCKS_PER_SEC); return 0;时间运行如下:第一次:time=0.02674000S第二次:time=0.02446500S第三次:time=0.02402800S三次平均为:0.02508S1.1.2 SS

3、E向量优化版本设计任务:此部分需要给出单精度和双精度两个优化 版本(1)测试均在划分度为 10 的 7 次方下完成。以下是 SSE 双精度的代码:#include#include#include#define N 10000000 double get_pi(int dt)double pi=0.0; double delta =1.0/dt; int i;for(i=0; idt; i+) double x=(double)i/dt; pi+=delta/(1.0+x*x); return pi*4;double get_pi_sse(size_t dt) double pi=0.0;dou

4、ble 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);

5、xmm3= _mm_div_pd(xmm1,xmm3); xmm4= _mm_add_pd(xmm4,xmm3);double tmp2 _attribute_(aligned(16); _mm_store_pd(tmp,xmm4); pi+=tmp0+tmp1/*+tmp2+tmp3*/;return pi*4.0;int main()int dx;double pai;double start,finish; dx=N; start=clock();pai=get_pi_sse(dx);finish=clock();printf(%.8lfn,pai);printf(%.8lfSn,(do

6、uble)(finish-start)/CLOCKS_PER_SEC); return 0;时间运行如下:第一次: time=0.00837500S 第二次: time=0.00741100S第三次: time=0.00772000S 三次平均为: 0.00783S以下是 SSE 单精度的代码:#include#include#include#define N 10000000float get_pi_sse(size_t dt)float pi=0.0;float delta =1.0/dt;_m128 xmm0,xmm1,xmm2,xmm3,xmm4;xmm0=_mm_set1_ps(1.

7、0);xmm1=_mm_set1_ps(delta); xmm2=_mm_set_ps(delta*3,delta*2,delta,0.0); xmm4=_mm_setzero_ps();for(long int i=0; i=dt-4; i+=4)xmm3= _mm_set1_ps(float)i*delta);xmm3= _mm_add_ps(xmm3,xmm2);xmm3= _mm_mul_ps(xmm3,xmm3);xmm3= _mm_add_ps(xmm0,xmm3);xmm3= _mm_div_ps(xmm1,xmm3);xmm4= _mm_add_ps(xmm4,xmm3);fl

8、oat tmp4 _attribute_(aligned(16); _mm_store_ps(tmp,xmm4); pi+=tmp0+tmp1+tmp2+tmp3;return pi*4.0;int main()int dx;float pai;double start,finish;dx=N;start=clock(); pai=get_pi_sse(dx); finish=clock();printf(%.8fn,pai); printf(%.8lfSn,(double)(finish-start)/CLOCKS_PER_SEC); return 0;时间运行如下: 第一次: time=0

9、.00406100S第二次: time=0.00426400S 第三次: time=0.00437600S 三次平均为: 0.00423S1.1.3 AVX向量优化版本设计任务: 此部分需要给出单精度和双精度两个优化版本注意:(1)测试均在划分度为 10 的 7 次方下完成。( 2)在编译时需要加 -mavx 编译选项,才能启用 AVX 指令集,否则默 认 SSE 指令集( 3)理论上,向量版本对比 SSE 版本和串行版本有明显加速,单精度版 本速度明显优于双精度,速度接近双精度的两倍。以下是AVX双精度的代码:#include#include#include#define N 1000000

10、0/*double get_pi (int dt)double pi=0.0;double delta =1.0/dt;int i;for(i=0; idt; i+)double x=(double)i/dt;pi+=delta/(1.0+x*x);return pi*4;*/double get_pi_avx(size_t dt)double pi=0.0;double delta =1.0/dt;_m256d ymm0,ymm1,ymm2,ymm3,ymm4;ymm0=_mm256_set1_pd(1.0);ymm1=_mm256_set1_pd(delta);ymm2=_mm256_se

11、t_pd(delta*3,delta*2,delta,0.0);ymm4=_mm256_setzero_pd();for(long int i=0; i AVX-double = SSE-float SSE-double serial12积分计算圆周率的OpenMP优化1.2.1 OpenMP 并行化任务:在串行代码的基础上进行OpenMP并行优化注意:测试在划分度为10 的 9 次方下完成。参考代码:#include#include#define N 1000000000double get_pi(int dt)double pi=0.0;double delta =1.0/dt;int i;#pragma omp parallel for reduction(+:pi)for(i=0; idt; i+)double x=(double)i/dt;pi+=delta/(1.0+x*x);return pi*4;int main()int dx;double pai;/double start,finish;dx=N;double start=omp_get_wtime();pai=get_pi(dx);double finish=omp_get_wtime();printf(%.8lfn,pai);printf(%lfn,finis

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号