没有使用OpenMP的无用printf加速

t2k*_*316 3 parallel-processing performance printf multithreading openmp

我刚刚编写了第一个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);
}
Run Code Online (Sandbox Code Playgroud)

我想printf的实现有很大的开销,OpenMP必须与每个线程重复.是什么导致了这种开销,为什么OpenMP无法克服它?

Wil*_*ill 6

猜测,但也许stdout被锁定?

通常,printf是一项昂贵的操作,因为它与其他资源(例如文件,控制台等)交互.

我的实验经验是,Windows控制台上的printf非常慢,在Linux控制台上速度要快得多,但如果重定向到文件或/ dev/null则速度最快.

我发现printf-debugging会严重影响我的应用程序的性能,我会谨慎使用它.

尝试运行重定向到文件或/ dev/null的应用程序,看看这是否有任何明显的影响; 这将有助于缩小问题所在的范围.

当然,如果printfs没用,为什么它们在循环中呢?