要进行更可靠的比较(在 linux 上),您可以:
1) 在 Intel CPU 上,turbo 会超频您的 CPU。这是由 CPU 的温度控制的,因此它在一次运行中的表现可能会有所不同。在 Linux 上,您可以按如下方式阻止 CPU 的频率。例如,对于 2.4GHz:
echo 1 > /sys/module/processor/parameters/ignore_ppc
for x in /sys/devices/system/cpu/cpu[0-3]/cpufreq/;do
echo 2400000 > $x/scaling_max_freq
done
2) 只要有空闲内存,linux 就会缓存你最后的 I/O。如果您的程序需要分配大量内存,第一次分配将花费一些时间,因为它会清空 I/O 缓存以提供一些空闲内存。为了使您的分配时间更可预测,清空您的 I/O 缓存
echo 3 > /proc/sys/vm/drop_caches
3) 您的进程可以从一个 CPU 核心迁移到另一个。在每次迁移时,您都会丢失 L1 和 L2 缓存,因此您会遇到更多的缓存未命中。此外,迁移需要一些时间。要消除此开销,请将您的进程绑定到 CPU 内核:
export OMP_PROC_BIND=true
taskset -c 0-3 ./a.out
4)在测量CPU时间之前,先做一点热身
5)也许算法1在算法2之前运行得更快,反之亦然。为避免这种偏差,您可以交错算法 1 和 2 的测量。
! DO ALL POSSIBLE INITIALIZATION HERE
NREP=10000
NLOOP=100
time1 = 0.d0
time2 = 0.d0
DO k=1,NLOOP
! WARM UP
DO pp = 1,NREP/10
**Algorithm_1**
END DO
!MEASURE 1
CALL CPU_TIME(t1)
DO pp = 1,NREP
**Algorithm_1**
END DO
CALL CPU_TIME(t2)
time1 = time1 + t2-t1
! WARM UP
DO pp = 1,NREP/10
**Algorithm_2**
END DO
! MEASURE 2
CALL CPU_TIME(t3)
DO pp = 1,NREP
**Algorithm_2**
END DO
CALL CPU_TIME(t4)
time2 = time2 + t4-t3
ENDDO
PRINT*, "Algorithm 1 time = ", time1/(dble(NREP)*dble(NLOOP))
PRINT*, "Algorithm 2 time = ", time2/(dble(NREP)*dble(NLOOP))
6)确保您是机器上的唯一用户
7) 如果您使用的是台式计算机(firefox 等),请关闭所有其他后台应用程序
8) 关闭网络
9) 对于多线程应用程序,确保您的线程绑定到不同的物理 CPU 内核(签入/proc/cpuinfo
)