我目前正在优化我的部分代码,因此执行一些基准测试.
我有NxN-matrices A和T和想要的elementwise它们相乘并将结果保存在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
Run Code Online (Sandbox Code Playgroud)
(http://pastebin.com/RGpwp2KZ上的完整最小工作示例.)
现在发生的奇怪事情是,无论线程数量(1到4之间),执行时间大致保持不变(+ - 10%),而CPU时间随着线程数量的增加而增加.这让我觉得所有的线程都做同样的工作(因为我在OpenMP上犯了一个错误)因此需要相同的时间.
但是在另一台计算机上(有96个CPU内核可用),程序的行为与预期一致:随着线程数的增加,执行时间减少.令人惊讶的是,CPU时间也减少了(最多约10个线程,然后再次上升).
可能是有不同版本OpenMP或gfortran已安装.如果这可能是原因,那么如果你能告诉我如何找到它就会很棒.