現在、コードの一部を最適化しているため、ベンチマークを実行しています。
私はNxN
行列A
を持ってい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
インストールされている可能性があります。これが原因である場合、それを見つける方法を教えていただければ幸いです。