C++ 我能';t程序并行化优化

C++ 我能';t程序并行化优化,c++,openmp,parallel-processing,C++,Openmp,Parallel Processing,我试图指出OpenMP串行和并行程序之间的区别。我在科学Linux上工作。 这是一个简单的程序,执行求和和和乘法,然后对结果求和 我使用函数omp\u get\u wtime()检查执行时间,结果是并行化的部件比串行部件运行得慢。 我认为问题出在这种情况下,因为两个线程都进入了交换机,这增加了执行时间。 我希望第一个线程进行求和,第二个线程进行乘法,以加快最终结果。你能帮我吗 在程序开始时,我使用: #define NUM_THREADS 2 ... omp_set_num_threads(NU

我试图指出OpenMP串行和并行程序之间的区别。我在科学Linux上工作。 这是一个简单的程序,执行求和和和乘法,然后对结果求和

我使用函数
omp\u get\u wtime()
检查执行时间,结果是并行化的部件比串行部件运行得慢。 我认为问题出在这种情况下,因为两个线程都进入了交换机,这增加了执行时间。 我希望第一个线程进行求和,第二个线程进行乘法,以加快最终结果。你能帮我吗

在程序开始时,我使用:

#define NUM_THREADS 2
...
omp_set_num_threads(NUM_THREADS);
以下是节目:

double a,b,c,d,g,timer,timer2;

printf("Insert 2 numbers \n"); cin >> a; cin >> b;

timer = omp_get_wtime();

c = a+b;
d = a*b;
g = c+d;


printf("the result is: %f\n\n",g);
printf("time: %f seconds\n\n",omp_get_wtime()-timer);




timer2 = omp_get_wtime();
#pragma omp parallel
{
    switch ( omp_get_thread_num() )
    {
        case 1: c=a+b; 
        case 2: d=a*b;
    }              
}
g = c+d; 

printf("parallel time:  %f seconds\n\n",g,omp_get_wtime()-timer2);

旋转线程和分配工作需要一些固定的开销。对于像乘法这样的简单操作,这种开销远远超过并行执行操作所节省的时间


如果您给线程一些实际的工作,您就更有可能看到好处。

旋转线程和分配工作会有一些固定的开销。对于像乘法这样的简单操作,这种开销远远超过并行执行操作所节省的时间


如果你给线程一些实际的工作,你就更有可能看到好处。

注意:你在这里测量的大部分时间都花费在第一个printf语句中。还要注意:即使switch语句也可能比你的计算更昂贵(除非它至少被优化了),更不用说测量了(以及在线程上的工作分配)。因此,实际上,除了计算所需的时间之外,您几乎可以测量任何东西(顺便说一句,您上一次的
printf
被破坏了)。尝试计算不需要数千个时钟周期的时间通常是毫无意义的(要使openmp发挥作用,您可能需要至少数万次操作)注意:此处测量的大部分时间都花费在第一个printf语句中还要注意:即使是switch语句也可能比您的计算更昂贵(除非它至少经过优化),更不用说测量了(以及在线程上的工作分配)。因此,实际上,除了计算所需的时间之外,您几乎可以测量任何东西(顺便说一句,您上一次的
printf
被破坏了)。尝试计算不需要数千个时钟周期的时间通常是毫无意义的(要使openmp发挥作用,您可能需要至少数万次操作)谢谢!现在我尝试做一些事情…如果您或其他人有任何想法,我会欢迎它。谢谢!现在我尝试做一些事情…如果您或其他人有任何想法,我会欢迎它。