当我使用open mp时,我的所有代码都运行得慢得多

Pea*_*ful 0 parallel-processing multithreading fortran openmp

我已经在这个网站上看到了几个关于这个问题的帖子.但是,我认为我的严格代码由于创建线程而产生的开销并且所有这些都不应该是一个大问题,现在开放的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
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Vla*_*r F 5

您可能不使用任何编译器优化.通过启用它们-O2 -O3,-O5-Ofast.您将看到该程序需要0秒,因为编译器会优化所有内容.

你也有竞争条件,更多的线程写在同一个l.因此程序无效,l应该是private.它还会导致速度变慢,因为线程会使其他内核的缓存内容无效,并且线程必须始终重新加载内存内容.当更多线程使用相同的缓存行并且称为错误共享时,会发生类似的事情.