【问题标题】:OpenMP loop parallelizeOpenMP 循环并行化
【发布时间】:2013-12-08 16:19:41
【问题描述】:

我正在学习 OpenMP,但遇到了一些问题: 并行程序比串行程序慢,我很困惑(1 线程 vs 2 线程) 我的代码:

#include <iostream>
#include <omp.h>
using namespace std;

int main()
{       
    int threadsNumber=1;
    int S=0;

    cout << "Enter number of threads:\n";
    cin >> threadsNumber;

    double start, end, calculationTime;
    omp_set_num_threads(threadsNumber);
    start = omp_get_wtime();

    #pragma omp parallel for reduction(+: S)
    for(int i=1;i<1000;i++) {
        S+= 10;
    }
    #pragma omp end parallel

    end = omp_get_wtime();

    calculationTime = end - start;

    cout << "Время выполнения: " << calculationTime << "\n";
    cout<<"S = "<< S <<"\n";

    return 0;
}

结果: 1 个线程:2.59876e-05 2 个线程:0.000102043

我的错误在哪里? 谢谢!

【问题讨论】:

  • 我不是 100% 确定,但最后的减少可能会消耗更多的时间,而不是使用 2 个线程节省的时间。也许更复杂的计算会给你更好的结果
  • 尝试1000000000 而不是1000。它应该为 1 个线程返回 2 秒,为 2 个线程返回 1 秒。如果启用了编译器优化,则使用volatile 变量来防止优化循环。
  • 你是对的!谢谢!
  • 要补充一点:没有“#pragma omp end parallel”。由于您正在编写 C++ 代码,因此并行区域的结束由结构块的结束自动确定。

标签: c++ multithreading openmp


【解决方案1】:

正如 J.F Sebastian 在评论中指出的那样,您不会从并行化中获得太多好处,因为具有 1000 次迭代的循环相当快。这意味着创建第二个线程所需的开销大于由于并行化而节省的开销。当您增加循环迭代的次数,从而让线程有更多的事情要做时,多线程的好处就会变得更加明显。

【讨论】:

  • 我不知道 OP 使用哪个 C++ 编译器,但如果它是英特尔 C++ 编译器或优化级别为 O2 或更高的 GCC,则循环将替换为 S = max(high-low, 0) * 10;(其中 low 和 @ 987654324@ 是迭代范围的界限),这只会让 OpenMP 版本相比之下更慢。
  • @HristoIliev: as I've mentioned volatile 变量会阻止优化。
猜你喜欢
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多