我目前正在优化我的部分代码,因此执行一些基准测试。
我有NxN
-matricesA
并且T
想要将它们逐元素相乘并A
再次保存结果,即A = A*T
. 由于此代码不可并行化,我将分配扩展为
!$OMP PARALLEL DO
do j = 1, N
do i = 1, N
A(i,j) = T(i,j) * A(i,j)
end do
end do
!$OMP END PARALLEL DO
(完整的最小工作示例位于http://pastebin.com/RGpwp2KZ。)
现在发生的奇怪事情是,无论线程数(1 到 4 之间)如何,执行时间都或多或少保持不变(+- 10%),但是 CPU 时间会随着线程数的增加而增加。这让我认为所有线程都在做同样的工作(因为我在 OpenMP 方面犯了一个错误),因此需要相同的时间。
但是在另一台计算机(有 96 个 CPU 内核可用)上,程序的行为与预期一样:随着线程数的增加,执行时间会减少。令人惊讶的是,CPU 时间也减少了(最多约 10 个线程,然后再次上升)。
可能是安装了不同的OpenMP
版本gfortran
。如果这可能是原因,如果您能告诉我如何找出答案,那就太好了。