首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenMP慢还原

OpenMP慢还原
EN

Stack Overflow用户
提问于 2011-06-08 15:36:44
回答 2查看 3.2K关注 0票数 1

我编写了计算数组约简和的简单C++代码,但是使用OpenMP约简程序工作得很慢。程序有两个变体:一个是最简单的和,另一个是复杂数学函数的和.在代码中,复杂变体被注释。

代码语言:javascript
复制
#include <iostream>
#include <omp.h>
#include <math.h>

using namespace std;

#define N 100000000
#define NUM_THREADS 4

int main() {

  int *arr = new int[N];

  for (int i = 0; i < N; i++) {
    arr[i] = i;
  }

  omp_set_num_threads(NUM_THREADS);
  cout << NUM_THREADS << endl;

  clock_t start = clock();
  int sum = 0;
  #pragma omp parallel for reduction(+:sum)
  for (int i = 0; i < N; i++) {
    // sum += sqrt(sqrt(arr[i] * arr[i])); // complex variant
    sum += arr[i]; // simple variant
  }

  double diff = ( clock() - start ) / (double)CLOCKS_PER_SEC;
  cout << "Time " << diff << "s" << endl;

  cout << sum << endl;

  delete[] arr;

  return 0;
}

我是由ICPC和GCC编写的:

代码语言:javascript
复制
icpc reduction.cpp -openmp -o reduction -O3
g++ reduction.cpp -fopenmp -o reduction -O3

处理器: Intel Core 2 Duo T5850,OS: Ubuntu10.10

有简单和复杂变体的执行时间,使用和不使用OpenMP编译。

简单变体"sum += arri;":

代码语言:javascript
复制
icpc
0.1s without OpenMP
0.18s with OpenMP

g++
0.11c without OpenMP
0.17c with OpenMP

复变式"sum += sqrt(sqrt(arri * arri));":

代码语言:javascript
复制
icpc
2,92s without OpenMP
3,37s with OpenMP

g++ 
47,97s without OpenMP
48,2s with OpenMP

在系统监控器中,我看到两个核心在程序中与OpenMP一起工作,一个核心在没有OpenMP的程序中工作。我将在OpenMP中尝试几个线程,但没有加速。我不明白为什么削减是缓慢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-08 16:21:18

函数clock()测量整个进程所消耗的处理器时间,因此打印时间显示了所有线程消耗的时间之和。如果您希望看到墙壁时间(从开始到结束的实时时间),请在POSIX系统上使用例如次数()函数。

票数 4
EN

Stack Overflow用户

发布于 2011-06-08 16:15:16

你所做的是如此简单,以至于你可能受到内存带宽的限制。我很少得到任何加速比,直到工作是远远超过它所需的时间来获取数据的工作。此外,在合并所有子结果方面还有额外的工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6281429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档