我正在编写一些代码,这些代码肯定会从尝试集成openmp一些我正在编写的软件中获益。我是openmp的新手,在测试一些非常基本的测试代码时(见下文),我注意到openmp激活(#pragma line)时执行时间非常长。任何见解都非常感谢。
int main()
{
int number=200;
int max = 2000000;
for(int t=1; t<max; t++)
{
double fac = 0.0;
#pragma omp parallel for reduction(+:fac)
for(int n=2; n<=number; n++)
fac += 1;
}
return 0;
}
答案 0 :(得分:1)
如前所述,代码遇到并行区域max
次。在OpenMP程序中输入并行区域的开销很小,但是您需要2000000
次。您实际上并没有告诉我们运行时间是什么,但我可以很容易地相信这使得它们比串行版本更长。我建议你将外环包裹在一个平行区域,而不是内环。
重写代码时要小心,以确保并行区域内的有效负载是重要的,并将一些值返回到并行区域外的程序。如果没有这些步骤,那么一个狡猾的优化编译器就可以确定循环没有向程序的其余部分返回任何内容,只是将其优化掉。
同时插入一些时间指令(使用omp_get_wtime
),重新运行代码,如果问题仍不理想,请使用您收集的新信息更新您的问题。
答案 1 :(得分:0)
这是一个改进的代码,实际上按预期工作。它基本上包裹外环,而不是内环。在没有openmp支持的情况下编译时需要1.49秒,openmp为0.48秒。
int main()
{
int number=200;
int max = 2000000;
#pragma omp parallel for
for(int t=1; t<max; t++)
{
double fac = 0.0;
for(int n=2; n<=number; n++)
fac += 1;
}
return 0;
}