OpenMP 并行化处理测试

#pragma omp parallel for 这条语句是用来指定后面的for循环语句变成并行执行的,将for循环里的语句变成并行执行后效率会不会提高呢?还是测试一 下吧,测试的时候,循环最好大一些,增加计算量,不然程序耗时太短,很难区分。
 #include <omp.h>
#include <stdio.h>
#include <sys/time.h>
void test() {
int a = ;
for(int i = ; i < ; i++) {
a = i + ;
}
}
int main() {
int nthrds = ;
omp_set_num_threads(nthrds);
timeval tStart,cTime;
long long tPassed = ;
gettimeofday(&tStart, );
for (int i = ; i < ; i++) {
test();
}
gettimeofday(&cTime, );
cTime.tv_sec -= tStart.tv_sec;
cTime.tv_usec -= tStart.tv_usec;
tPassed = 1000000LL * cTime.tv_sec + cTime.tv_usec;
tPassed /= ;
printf("Time = %lld/n", tPassed);
gettimeofday(&tStart, );
#pragma omp parallel for
for (int i = ; i < ; i++) {
test();
}
gettimeofday(&cTime, );
cTime.tv_sec -= tStart.tv_sec;
cTime.tv_usec -= tStart.tv_usec;
tPassed = 1000000LL * cTime.tv_sec + cTime.tv_usec;
tPassed /= ;
printf("Time = %lld/n", tPassed);
return ;
}

result:

 [root@c0108 zlt]# g++ omp.c -o omp -fopenmp
[root@c0108 zlt]# ./omp
Time =
Time =
[root@c0108 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. }

结果:


 [root@c0108 zlt]# g++ omp.c -o omp -fopenmp
[root@c0108 zlt]# ./omp
Time =
Time =
[root@c0108 zlt]#

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

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

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

    一.openMP简单测试 1.简单测试(1) #include<omp.h> #include<time.h> #include<iostream> using n ...

  2. 基于GCC的openMP学习与测试

    (一).openMP简述 Open Multiprocessing (OpenMP) 框架是一种功能极为强大的规范,可以帮助您利用 C.C++ 和 Fortran 应用程序中的多个核心带来的好处,是基 ...

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

    在理想情况下,编译器使用自动并行化能够管理一切事务,使用OpenMP指令的一个优点是将并行性和算法分离,阅读代码时候无需考虑并行化是如何实现的.当然for循环是可以并行化处理的天然材料,满足一些约束的 ...

  4. 使用Openmp并行化

    运行命令:g++ -fopenmp xx.cpp -lgomp -lpthread -o xx.out 用例一: #include <omp.h> #include <stdio.h ...

  5. 【并行计算】基于OpenMP的并行编程

    我们目前的计算机都是基于冯偌伊曼结构的,在MIMD作为主要研究对象的系统中,分为两种类型:共享内存系统和分布式内存系统,之前我们介绍的基于MPI方式的并行计算编程是属于分布式内存系统的方式,现在我们研 ...

  6. 【openmp】for循环的break问题

    问题描述:在用openmp并行化处理for循环的时候,便无法在for循环中用break语句,那么我们如何实现这样的机制呢?在stackoverflow上看到一个不错的回答总结一下. volatile ...

  7. 并行求pi (C++实现)

    用OpenMP并行化求pi的代码,这里用的是公式法求pi.具体如下: //公式法 #include<omp.h> #include<stdio.h> #include<s ...

  8. 密码破解工具John the Ripper使用说明

    John the Ripper John 包描述 John the Ripper 既功能丰富又运行快速. 它在一个程序中结合了几种破解模式,并且可以根据您的特定需求进行全面地配置(你甚至可以使用支持C ...

  9. Java 8 (6) Stream 流 - 并行数据处理与性能

    在Java 7之前,并行处理集合非常麻烦.首先你要明确的把包含数据的数据结构分成若干子部分,然后你要把每个子部分分配一个独立的线程.然后,你需要在恰当的时候对他们进行同步来避免竞争,等待所有线程完成. ...

随机推荐

  1. Swing实现文件选择(目录选择)附导出

    具体生成工具如图: (1) (2) (3) (4) 源码 : example.java package org.qiailin.jframe; import java.awt.Container; i ...

  2. 纠结的CLI C++与Native C++的交互

    最近在写点东西,涉及到了CLR C++与Native C++的互相调用的问题,结果...........纠结啊. 交互原型 交互原型是这样的: void* avio_alloc_context( un ...

  3. Hibernate五 HQL查询

    HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条 ...

  4. angularJS 指令二

    指令详解1.用directive()方法来定义指令.directive('myDirective',function($timeout,userDefinedService){ return {};} ...

  5. ios-简单算法

    #import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...

  6. SCOI2013 多项式的运算

    ---恢复内容开始--- 又是一道裸数据结构题. 之前受序列操作的蛋疼写法影响,只用一个tag,不知道怎么记,之后看了下别人的,终于领悟要用两个tag,一个add,一个mul,维护相当简单,想清楚就行 ...

  7. 第一篇:数据库需求与ER建模

    前言 在数据库建设过程中,哪一步最重要?绝大多数资料会告诉你,是需求分析阶段.这一步的好坏甚至直接决定数据库项目的成败. 需求分析阶段,也被称为ER建模(entity-relationship mod ...

  8. linux 调试

    strace gdb tcpdump valgrind perf

  9. python手机号码运营商归属测试

    #手机号码测试: def number_test(): while True: number = input('Please enter your phone number:') CN_mobile ...

  10. LINQ:使用Take和Skip实现分页

    随便找的,还没有试过代码. class Program { static int Main() { //每页大小 ; //页码 ; //源数据 string[] names = { "贤静& ...