我的计算机有16个核心。 我的程序如下:
omp_set_num_threads(16);
....
#pragma omp parallel for num_threads(2)
for(int i =1; i<=2; ++i)
{
\\time consuming operations
}
#pragma omp parallel for num_threads(2)
或#pragma omp parallel for num_threads(16)
哪个更有效?还是它们相同,因为它是共享内存?请注意我的循环迭代小于16的事实。
答案 0 :(得分:1)
省略任何手动规范,例如omp_set_num_threads
或num_threads
,然后让实现方案找出来。
实际上,这两种方法都没有明显的区别。
omp_set_num_threads
是完全多余的,因为它仅适用于后续
没有指定num_threads
子句的并行区域。因此,如果您觉得必须使用,请使用omp_set_num_threads
或num_threads
子句,因为这会使读者感到困惑。
可以想象,num_threads(2)
(无论如何指定)会更好。它用于创建更少线程的初始化开销较小。那可能没关系。有一个理论上的论点,即多余的线程无用可做,可能会在等待时耗尽共享资源(具有超线程,powercap的共享核)-仍然没关系,因为OpenMP实现不会无限期地等待。
另一方面,手动指定num_threads(2)
会创建冗余。如果您的循环更改为三个迭代,但您忘记了该怎么办?您浪费性能。同样的代码“ 我放置num_threads(X)
是因为我有X
内核”。
再次,只需忽略它。但是,请定期测量您的应用程序。如果您有特定迹象表明可能存在相关的性能问题,请根据具体可行的措施重新评估选择。
答案 1 :(得分:0)
看起来for
循环根本不是一个for
循环:您只有两次迭代。更好的解决方案可能是使用 OpenMP sections
:
#pragma omp parallel sections
{
#pragma omp section
{
// Time-consuming operations
}
#pragma omp section
{
// Other independent time-consuming operations
}
}