OpenMP

OpenMP中一个变量可以有三种类型,即shared、private和reduction,默认为shared,除非如下三种特别情况:

一、在并行for循环中紧临parallel for 语句的循环变量是私有的;

二、并行区域代码块里的声明的变量是私有的;

三、所有通过private,firstprivate,lastprivate和reduction子句声明的变量为私有变量。

#include <iostream>
#include <fstream>
#include <map>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

int main(int argc, char *argv[])
{
  ifstream ifs(argv[1]);
  string name;
  map<string, int> brands;
  while (!ifs.eof()) {
    getline(ifs, name);
    map<string, int>::const_iterator it = brands.find(name);
    if (it == brands.end()) {
      brands[name] = 1;
    } else {
      brands[name] = it->second + 1;
    }
  }

  vector<string> names;
  map<string, int>::const_iterator it;
  for (it = brands.begin(); it != brands.end(); ++it) {
    names.push_back(it->first);
  }
  vector<int> counts(names.size());

#pragma omp parallel
{
  int i;
  #pragma omp for
  for (i = 0; i < names.size(); ++i) {
    int count = 0;
    map<string, int>::const_iterator it2;
    for (it2 = brands.begin(); it2 != brands.end(); ++it2) {
      string name = it2->first;
      if (name.find(names[i]) != string::npos) {
        count += it2->second;
      }
    }

    counts[i] = count;
  }
}

  for (int i = 0; i < names.size(); ++i) {
    cout << names[i] << "\t" << counts[i] << endl;
  }

  return 0;
}

OpenMP

时间: 2024-10-18 02:14:02

OpenMP的相关文章

OpenMp多线程编程计时问题

在做矩阵乘法并行化测试的时候,在利用<time.h>的clock()计时时出现了一点问题. 首先看串行的程序: // matrix_cpu.c #include <stdio.h> #include <stdlib.h> #include <time.h> #define NUM 2048 void matrixMul(float *A, float *B, float *C, int M, int K, int N) {     int i, j, k;

基于OpenMP的矩阵乘法实现及效率提升分析

一.  矩阵乘法串行实现 例子选择两个1024*1024的矩阵相乘,根据矩阵乘法运算得到运算结果.其中,两个矩阵中的数为double类型,初值由随机数函数产生.代码如下: #include <iostream> #include <omp.h> // OpenMP编程需要包含的头文件 #include <time.h> #include <stdlib.h> using namespace std; #define MatrixOrder 1024 #def

有了OpenMP,MPI,为什么还要MapReduce? (转载)

OpenMP和MPI是并行编程的两个手段,对比如下: OpenMP:线程级(并行粒度):共享存储:隐式(数据分配方式):可扩展性差: MPI:进程级:分布式存储:显式:可扩展性好. OpenMP采用共享存储,意味着它只适应于SMP,DSM机器,不适合于集群.MPI虽适合于各种机器,但它的编程模型复杂: 需要分析及划分应用程序问题,并将问题映射到分布式进程集合: 需要解决通信延迟大和负载不平衡两个主要问题: 调试MPI程序麻烦: MPI程序可靠性差,一个进程出问题,整个程序将错误: 其中第2个问题

windows下codeblocks配置openmp

使用vs直接到setting里面设置即可支持openmp了,然而我太懒了装了个codeblocks with mingw版本 本来gcc4.4后就完全支持openmp了,结果codeblocks怎么配置都提示-fopenmp这些找不到. 搞了一上午终于发现,虽然mingw支持openmp但是在codeblocks安装过程中并不让装这些组件,需要自己装个tdm-gcc with mingw,蛋疼╮(╯▽╰)╭ 配置流程: 1)下载tdm-gcc,安装的时候注意默认openmp支持是没有勾选的,记得

openMP的一点使用经验

最近在看多核编程.简单来说,由于现在电脑CPU一般都有两个核,4核与8核的CPU也逐渐走入了寻常百姓家,传统的单线程编程方式难以发挥多核CPU的强大功能,于是多核编程应运而生.按照我的理解,多核编程可以认为是对多线程编程做了一定程度的抽象,提供一些简单的API,使得用户不必花费太多精力来了解多线程的底层知识,从而提高编程效率.这两天关注的多核编程的工具包括openMP和TBB.按照目前网上的讨论,TBB风头要盖过openMP,比如openCV过去是使用openMP的,但从2.3版本开始抛弃ope

gdb 调试openmp多线程程序 示例介绍

 首先一个简单程序源代码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <omp.h> 4 int main(int argc, char * argv[]){ 5 int i, k,m,n; 6 printf("i=%d,threads_num=%d\n",i, omp_get_num_threads()); 7 printf("i=%d,thread_id=%d\n&quo

OpenMp实现并行化

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

应用OpenMP的一个简单的设计模式

小喵的唠叨话:最近很久没写博客了,一是因为之前写的LSoftmax后馈一直没有成功,所以在等作者的源码.二是最近没什么想写的东西.前两天,在预处理图片的时候,发现处理200w张图片,跑了一晚上也才处理完一半.早上的时候,出于无奈,花半小时改写了一个简单调用OpenMP的处理程序,用了30个核心,然后一小时不到就处理完了.感慨在多核的时代,即使是简单的程序,如果能支持多核,应该都能节省不少时间. 本文系原创,转载请注明出处~ 小喵的博客:http://www.miaoerduo.com 博客原文:

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

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

OpenMp并行提升时间为什么不是线性的?

最近在研究OpenMp,写了一段代码,如下: #include<time.h> #include<stdio.h> #include<stdlib.h> #include<omp.h> #define THREAD_NUM 8 int main() { clock_t start,finish; int n=80000000; int sum; start=clock(); for(int i=0;i<n;i++) { sum+=2; sum-=1;