OpenMP 并行化处理测试

OpenMP 并行化处理测试

#pragma omp parallel for 这条语句是用来指定后面的for循环语句变成并行执行的,将for循环里的语句变成并行执行后效率会不会提高呢?还是测试一 下吧,测试的时候,循环最好大一些,增加计算量,不然程序耗时太短,很难区分。

 1 #include <omp.h>
 2 #include <stdio.h>
 3 #include <sys/time.h>
 4 void test() {
 5     int a = 0;
 6     for(int i = 0; i < 10000000; i++) {
 7         a = i + 1;
 8     }
 9 }
10 int main() {
11     int nthrds = 4;
12     omp_set_num_threads(nthrds);
13     timeval tStart,cTime;
14     long long tPassed = 0;
15     gettimeofday(&tStart, 0);
16     for (int i = 0; i < 100; i++) {
17         test();
18     }
19     gettimeofday(&cTime, 0);
20     cTime.tv_sec -= tStart.tv_sec;
21     cTime.tv_usec -= tStart.tv_usec;
22     tPassed = 1000000LL * cTime.tv_sec + cTime.tv_usec;
23     tPassed /= 1000;
24     printf("Time = %lld/n", tPassed);
25     gettimeofday(&tStart, 0);
26     #pragma omp parallel for
27     for (int i = 0; i < 100; i++) {
28         test();
29     }
30     gettimeofday(&cTime, 0);
31     cTime.tv_sec -= tStart.tv_sec;
32     cTime.tv_usec -= tStart.tv_usec;
33     tPassed = 1000000LL * cTime.tv_sec + cTime.tv_usec;
34     tPassed /= 1000;
35     printf("Time = %lld/n", tPassed);
36     return 1;
37 }  

result:

1 [[email protected] zlt]# g++ omp.c -o omp -fopenmp
2 [[email protected] zlt]# ./omp
3 Time = 2859
4 Time = 718
5 [[email protected] zlt]#   

在四核的机器上,开了四个线程,加速比基本上是4,果然不错。

此外,BS一下clock()函数,我向来觉得它一无是处。。。

  1. #include <omp.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4. void test() {
  5. int a = 0;
  6. for(int i = 0; i < 10000000; i++) {
  7. a = i + 1;
  8. }
  9. }
  10. int main() {
  11. int nthrds = 4;
  12. omp_set_num_threads(nthrds);
  13. long start = clock();
  14. for (int i = 0; i < 100; i++) {
  15. test();
  16. }
  17. long end = clock();
  18. printf("Time = %ld/n", end - start);
  19. start = clock();
  20. #pragma omp parallel for
  21. for (int i = 0; i < 100; i++) {
  22. test();
  23. }
  24. end = clock();
  25. printf("Time = %ld/n", end - start);
  26. return 1;
  27. }

结果:

1
2
3 [[email protected] zlt]# g++ omp.c -o omp -fopenmp
4 [[email protected] zlt]# ./omp
5 Time = 2860000
6 Time = 2860000
7 [[email protected] zlt]#
8  

clock有三个问题:
1)如果超过一个小时,将要导致溢出.
2)函数clock没有考虑CPU被子进程使用的情况.
3)也不能区分用户空间和内核空间.

时间: 2024-10-12 03:34:44

OpenMP 并行化处理测试的相关文章

基于GCC的openMP学习与测试(2)

一.openMP简单测试 1.简述 openMP很多情况下对于利用多核处理器进行加速是很有效果的,然而,也有一些情况是openMP不但没有效果,甚至还有一些反作用. 2.简单测试(1) #include<omp.h> #include<time.h> #include<iostream> using namespace std; void openMP() { int i,j; for(i=0; i<200; i++) { for( j = 0; j < 1

基于GCC的openMP学习与测试

(一).openMP简述 随着CPU速度不再像以前那样显著提高,多核系统正变得越来越流行.为了利用这种能力,程序员在并行编程中变得很有知识变得越来越重要--让程序同时执行多个任务.Open Multiprocessing (OpenMP) 框架是一种功能极为强大的规范,可以帮助您利用 C.C++ 和 Fortran 应用程序中的多个核心带来的好处,是基于共享内存模式的一种并行编程模型, 使用十分方便, 只需要串行程序中加入OpenMP预处理指令, 就可以实现串行程序的并行化. 现在,openMP

OpenMP并行化实例----Mandelbrot集合并行化计算

在理想情况下,编译器使用自动并行化能够管理一切事务,使用OpenMP指令的一个优点是将并行性和算法分离,阅读代码时候无需考虑并行化是如何实现的.当然for循环是可以并行化处理的天然材料,满足一些约束的for循环可以方便的使用OpenMP进行傻瓜化的并行. 为了使用自动并行化对Mandelbrot集合进行计算,必须对代码进行内联:书中首次使用自动并行化时候,通过性能分析发现工作在线程中并未平均分配. #include <stdio.h> #include <malloc.h> #de

OpenMP for Android初学记录

1. 资料整理与收集 1.1 国外资料 (1). Wiki上的介绍:http://en.wikipedia.org/wiki/OpenMP (2). OpenMP教程: http://www.llnl.gov/computing/tutorials/openMP (3). 并行计算介绍:https://computing.llnl.gov/tutorials/parallel_comp/ (4). 官方指定参考书:<Using OpenMP>CSDN上的下载链接 1.2 国内资料 (1). O

MIC性能优化

MIC优化方法: --并行度优化 --内存管理优化 --数据传输优化 --存储器访问优化 --向量化优化 --负载均衡优化 --MIC线程扩展性优化 一:并行度优化 要保证有足够的并行度,效果才能好(数据并行,任务并行) 优化步骤: 1.写OpenMP程序 2.测试他的扩展性,比如用两个测试,然后4个,6个,8个线程测试 3.然后移植到MIC上面 MIC优化准则:外层并行,内层向量化 示例一: for(i=0;i<M;i++) { for(j=0;j<N;j++){ ...... } } 两种

spark之RDD

RDD 概念与特性 RDD是spark最重要的抽象.spark统一建立在抽象的RDD之上.设计一个通用的编程抽象,使得spark可以应对各种场合的大数据情景.RDD模型将不同的组件融合到一起,选用其中的几个/所有,可以应付各种不同的场景.解决了mr的缺陷 1. 弹性分布式数据集Resilient Distributed Dataset. 2. 只读分区数据集,final修饰的 3. 一个分布式的数据集合,是spark中的核心,spark的操作都是围绕RDD展开的. 4. 真正的运算是在各个计算节

大数据技术之_19_Spark学习_02_Spark Core 应用解析+ RDD 概念 + RDD 编程 + 键值对 RDD + 数据读取与保存主要方式 + RDD 编程进阶 + Spark Core 实例练习

第1章 RDD 概念1.1 RDD 为什么会产生1.2 RDD 概述1.2.1 什么是 RDD1.2.2 RDD 的属性1.3 RDD 弹性1.4 RDD 特点1.4.1 分区1.4.2 只读1.4.3 依赖1.4.4 缓存1.4.5 CheckPoint第2章 RDD 编程2.1 RDD 编程模型2.2 RDD 创建2.2.1 由一个已经存在的 Scala 集合创建,即集合并行化(测试用)2.2.2 由外部存储系统的数据集创建(开发用)2.3 RDD 编程2.3.1 Transformatio

连通域标记算法并行化(MPI+OpenMP)

1 背景 图像连通域标记算法是从一幅栅格图像(通常为二值图像)中,将互相邻接(4邻接或8邻接)的具有非背景值的像素集合提取出来,为不同的连通域填入数字标记,并且统计连通域的数目.通过对栅格图像中进行连通域标记,可用于静态地分析各连通域斑块的分布,或动态地分析这些斑块随时间的集聚或离散,是图像处理非常基础的算法.目前常用的连通域标记算法有1)扫描法(二次扫描法.单向反复扫描法等).2)线标记法.3)区域增长法.二次扫描法由于简单通用而被广泛使用! 图1 连通域标记示意图 随着所要处理的数据量越来越

OpenMp实现并行化

前言 昨天,往arm上移植opencv程序,发现运行速度很慢.观察资源监视器发现只有一个核处于高负荷(总共4核),遂考虑到需要多核计算.OpenMp和MPI是常用并行计算库,OpenMP相对简单适合单机多核多线程,MPI适合集群,但复杂. OpenMp是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受的,用于共享内存并行系统的多处理器程序设计的一套指导性的编译处理方案(Compiler Directive).OpenMP支持的编程语言包括C语言.C++