Multithreading 当我使用open mp时,我所有的代码运行速度都慢得多
我已经在这个网站上看到了关于这个问题的讨论。然而,我认为我的严肃代码由于创建线程而产生的开销应该不是一个大问题,现在OpenMP已经变得慢多了!我使用的是一台四核机器,带有gfortran 4.6.3作为我的编译器。下面是一个测试代码的示例Multithreading 当我使用open mp时,我所有的代码运行速度都慢得多,multithreading,parallel-processing,fortran,openmp,Multithreading,Parallel Processing,Fortran,Openmp,我已经在这个网站上看到了关于这个问题的讨论。然而,我认为我的严肃代码由于创建线程而产生的开销应该不是一个大问题,现在OpenMP已经变得慢多了!我使用的是一台四核机器,带有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 =
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
如果我在没有open-mp的情况下运行该代码,大约需要80秒,但是在open-mp的情况下,大约需要150秒。我在其他严重代码中也看到了同样的问题,这些代码在串行模式下的运行时间大约为5分钟左右。在这些代码中,我注意到线程之间没有依赖关系。那么为什么这些代码会变慢而不是变快呢
提前感谢。您有竞争条件,更多线程正在同一共享
l
中写入。因此,程序无效,l
应该是private
。这也会导致速度减慢,因为线程会使其他内核拥有的缓存内容无效,并且线程必须始终重新加载内存内容。当多个线程使用同一缓存线时,也会发生类似的情况,称为
您也可能不使用任何编译器优化。通过AST的
-O2
-O3
、-O5
或-Ofast
启用它们。您将看到程序需要0秒,因为编译器会优化所有内容。如果存在争用条件,则会有更多线程在同一共享l
中写入。因此,程序无效,l
应该是private
。这也会导致速度减慢,因为线程会使其他内核拥有的缓存内容无效,并且线程必须始终重新加载内存内容。当多个线程使用同一缓存线时,也会发生类似的情况,称为
您也可能不使用任何编译器优化。通过AST的
-O2
-O3
、-O5
或-Ofast
启用它们。您将看到该程序需要0秒,因为编译器优化了所有内容。不知何故,使用-0fast(或其他优化)会给出许多警告(错误?)我的屏幕上的消息和可执行文件没有生成。Ofast是在gfortran 4.6以上的更高版本中引入的。您能否详细说明一下您的句子“它还导致…”以及我发布的代码?我想知道这到底是如何导致我的代码变慢的。阅读维基百科关于虚假共享的文章,你会发现这个问题。cach无效,并且必须通过其他线程的每次写入重新读取。但主要的问题是竞争条件,这使得代码完全无效!让我们用别的东西代替l=i,比如print*,“Hi”。该程序无效。但这就是代码变慢的原因吗?从虚假的分享文章中我什么也看不懂。你能用更简单的术语解释一下确切的问题吗?不知何故,使用-0fast(或其他优化)会在我的屏幕上显示许多警告(错误?)消息,并且没有生成可执行文件。Ofast是在gfortran 4.6以上的更高版本中引入的。你能就我发布的代码详细解释一下你的句子“它还导致…”吗?我想知道这到底是如何导致我的代码变慢的。阅读维基百科关于虚假共享的文章,你会发现这个问题。cach无效,并且必须通过其他线程的每次写入重新读取。但主要的问题是竞争条件,这使得代码完全无效!让我们用别的东西代替l=i,比如print*,“Hi”。该程序无效。但这就是代码变慢的原因吗?从虚假的分享文章中我什么也看不懂。你能用更简单的话给我解释一下确切的问题吗?