将2 for for循环和parallizing结合在一起并分别进行并行化有什么不同
实施例 1.不平行
#pragma omp parallel for
for(i = 0; i < 100; i++) {
//.... some code
}
#pragma omp parallel for
for(i = 0; i < 1000; i++) {
//.... some code
}
2。并在一起
#pragma omp parallel
{
#pragma omp for
for(i = 0; i < 100; i++) {
//.... some code
}
#pragma omp for
for(i = 0; i < 1000; i++) {
//.... some code
}
}
哪个代码更好,为什么????
答案 0 :(得分:2)
人们可能期望在第二个中获得一个小胜利,因为一个是OMP线程的fork / join(或功能等价物)两次,而不是一次。它是否对您的代码产生任何实际差异是一个经验问题,最好通过测量来回答。
如果两个循环中的工作是独立的,那么第二个也可以具有更显着的优势,并且您可以随时启动第二个,并且有理由期望第一个循环中存在一些负载不平衡。在这种情况下,您可以向第一个nowait
添加omp for
子句,而不是等待for循环结束的所有线程,无论谁先完成,都可以立即继续开始处理第二个循环。或者,可以将两个代码块分别放在section
或task
中。通常,您可以在并行部分中对线程执行的操作以及它们如何执行操作进行大量控制;而一旦你结束平行部分,就会失去灵活性 - 一切都必须加在一起,你就完成了。