【问题标题】:All my codes are running much slower when I use open mp当我使用 open mp 时,我所有的代码运行速度都慢得多
【发布时间】:2014-12-10 19:38:41
【问题描述】:

我已经在这个网站上看到several posts 谈论这个问题。但是,我认为我的严重代码由于创建线程而产生的开销不应该是一个大问题,现在使用 open mp 变得更慢了!我正在使用带有 gfortran 4.6.3 的四核机器作为我的编译器。下面是一个测试代码的例子。

Program test
use omp_lib
integer*8 i,j,k,l
!$omp parallel 
!$omp do
do i = 1,20000
  do j = 1, 1000
   do k = 1, 1000
       l = i
   enddo
  enddo
enddo
!$omp end do nowait
!$omp end parallel
End program test

如果我在没有打开 mp 的情况下运行此代码大约需要 80 秒,但是使用打开 mp 大约需要 150 秒。我在串行模式下运行时间约为 5 分钟左右的其他严重代码也遇到了同样的问题。在这些代码中,我注意线程之间没有依赖关系。那么为什么这些代码应该变得更慢而不是更快呢?

提前致谢。

【问题讨论】:

    标签: multithreading parallel-processing fortran openmp


    【解决方案1】:

    您有一个竞争条件,更多线程正在同一个共享l 中写入。因此程序无效,l 应该是private。这也会导致速度变慢,因为线程使其他内核拥有的缓存内容无效,并且线程必须一直重新加载内存内容。当更多线程使用相同的缓存行时也会发生类似的情况,称为false sharing

    您也可能不使用任何编译器优化。通过-O2-O3-O5-Ofast 启用它们。你会看到程序耗时 0 秒,因为编译器优化了所有内容。

    【讨论】:

    • 不知何故使用-0fast(或其他优化)在我的屏幕上给出了许多警告(错误?)消息,并且没有生成可执行文件。
    • Ofast 是在高于 4.6 的 gfortran 版本中引入的。
    • 您能否参考我发布的代码详细说明您的句子“它也导致..”?我想知道这究竟是如何导致我的代码变慢的。
    • 阅读关于虚假分享的维基百科,您会看到问题所在。缓存无效,并且必须由其他线程的每次写入重新读取。但主要问题是使代码完全无效的竞争条件!
    • 让我们把 l = i 换成别的东西,比如 print*,'Hi'。确实该程序无效。但这是代码变慢的原因吗?我对虚假分享文章一无所知。你能用更简单的术语解释一下确切的问题吗?
    猜你喜欢
    • 2016-10-23
    • 2011-08-27
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多