C++ OpenMP循环并行化

C++ OpenMP循环并行化,c++,multithreading,openmp,C++,Multithreading,Openmp,我正在学习OpenMP,但遇到了一些问题: 并行程序比串行程序慢,我很困惑(1个线程对2个线程) 我的代码: #包括 #包括 使用名称空间std; int main() { int threadsNumber=1; int S=0; cout>threadsNumber; 双起点、终点、计算时间; omp_集合_num_线程(线程数); start=omp_get_wtime(); #pragma omp并行用于缩减(+:S) 对于(int i=1;i正如J.F Sebastian

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

#包括
#包括
使用名称空间std;
int main()
{       
int threadsNumber=1;
int S=0;
cout>threadsNumber;
双起点、终点、计算时间;
omp_集合_num_线程(线程数);
start=omp_get_wtime();
#pragma omp并行用于缩减(+:S)

对于(int i=1;i正如J.F Sebastian在一篇评论中指出的那样,并行化并没有给你带来多大好处,因为你的循环有1000次迭代,速度相当快。这意味着创建第二个线程所需的开销要比你通过并行化节省的开销大。当你增加循环迭代次数,从而给线程更多的时间时的确,多线程的好处变得更加明显。

我不是100%确定,但最后的减少可能会比使用两个线程节省更多的时间。也许更复杂的计算会给您带来更好的结果尝试
100000000
而不是
1000
。对于一个线程,它应该返回2秒,对于两个线程,它应该返回1秒ads。如果启用了编译器优化,则使用
volatile
变量来防止优化循环。你说得对!谢谢!需要补充一点:没有“#pragma omp end parallel”因为你写C++代码,所以并行区域的结束是由结构块的末端自动确定的。我不知道OP使用哪个C++编译器,但是如果是英特尔C++编译器或GCC,优化级别O2或更高,则循环被替换为<代码> s= max(高低点,0)*10;< /C>(其中
low
high
是迭代范围的界限),这只会使OpenMP版本相比之下更慢。@hristoilev:易失性变量会阻止优化。
#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;
}