【问题标题】:OpenMP slow reductionOpenMP 减慢
【发布时间】:2011-06-08 15:36:44
【问题描述】:

我编写了简单的 C++ 代码来计算数组归约和,但使用 OpenMP 归约程序运行缓慢。程序有两种变体:一种是最简单的求和,另一种是复杂数学函数的求和。在代码中对复杂的变体进行了注释。

#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编译的:

icpc reduction.cpp -openmp -o reduction -O3
g++ reduction.cpp -fopenmp -o reduction -O3

处理器:Intel Core 2 Duo T5850,操作系统:Ubuntu 10.10

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

简单变体“sum += arr[i];”:

icpc
0.1s without OpenMP
0.18s with OpenMP

g++
0.11c without OpenMP
0.17c with OpenMP

复杂变体“sum += sqrt(sqrt(arr[i] * arr[i]));”:

icpc
2,92s without OpenMP
3,37s with OpenMP

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

在系统监视器中,我看到 2 个内核在使用 OpenMP 的程序中工作,而 1 个内核在没有 OpenMP 的程序中工作。我将在 OpenMP 中尝试多个线程并且没有加速。我不明白为什么还原很慢。

【问题讨论】:

  • 对于简单版本,您将获得大约 2 倍的加速,并且您有 2 个内核!
  • 对不起,我混淆了 OpenMP 和没有 OpenMP。但我的问题是正确的。

标签: c++ openmp


【解决方案1】:

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

【讨论】:

  • 一个问题是您使用clock() 来测量时间。时钟的手册页说“clock() 函数返回程序使用的处理器时间的近似值”。并行运行的处理器时间通常大于串行运行。您想测量挂钟时间。 OpenMP 提供了执行此操作的函数。有关信息,请参阅 OpenMP 规范中的 omp_get_wtime()。
  • 非常感谢!我尝试 omp_get_wtime() 并显示 OpenMP 程序运行得更快。现在我有 32 个线程的最大加速。
  • @Mikhail:2 核机器上有 32 个线程?真的吗?这没什么意义。您要么受计算限制,要么受内存限制,并且在您的代码中,拥有比内核更多的线程不会改善问题。所以我很惊讶。
【解决方案2】:

您所做的事情非常简单,以至于您可能受到内存带宽的限制。在工作远远超过从工作中获取数据所需的时间之前,我很少得到任何加速。再加上减少在合并所有子结果方面有额外的工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2016-05-12
    • 1970-01-01
    相关资源
    最近更新 更多