我刚刚编写了我的第一个 OpenMP 程序,它可以并行化一个简单的 for 循环。我在我的双核机器上运行代码,发现从 1 个线程到 2 个线程时速度有所提高。但是,我在学校的 linux 服务器上运行了相同的代码,并没有看到加速。在尝试了不同的事情之后,我终于意识到删除一些无用的 printf 语句会导致代码显着加速。下面是我并行化的代码的主要部分:
#pragma omp parallel for private(i)
for(i = 2; i <= n; i++)
{
printf("useless statement");
prime[i-2] = is_prime(i);
}
我猜想 printf 的实现有很大的开销,OpenMP 必须与每个线程重复。是什么导致了这种开销,为什么 OpenMP 不能克服它?