我刚刚编写了第一个 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 无法克服它?
猜测,但也许标准输出是由锁保护的?
一般来说,printf 是一个昂贵的操作,因为它与其他资源(例如文件、控制台等)交互。
我的经验是 printf 在 Windows 控制台上非常慢,在 Linux 控制台上要快得多,但如果重定向到文件或 /dev/null ,速度仍然最快。
我发现 printf 调试会严重影响我的应用程序的性能,因此我很少使用它。
尝试运行重定向到文件或 /dev/null 的应用程序,看看这是否有任何明显的影响;这将有助于缩小问题所在。
当然,如果 printf 没有用,为什么它们会在循环中呢?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)