Parallel processing 在并行计算中,为什么使用所有线程(4)的执行时间比只使用一半(2)的执行时间长?
例如,我使用的代码(CPU:4个内核(每个内核线程)): 我得到以下结果: 第一次执行:Parallel processing 在并行计算中,为什么使用所有线程(4)的执行时间比只使用一半(2)的执行时间长?,parallel-processing,fortran,openmp,gfortran,Parallel Processing,Fortran,Openmp,Gfortran,例如,我使用的代码(CPU:4个内核(每个内核线程)): 我得到以下结果: 第一次执行: Result in parallel mode 2477.89478 2528.50391 2511.84204 2528.12061 2500.79517 2510.69971 Result in serial mode 2477.89478 2528.50391 2511.84204
Result in parallel mode
2477.89478 2528.50391 2511.84204 2528.12061 2500.79517
2510.69971
Result in serial mode
2477.89478 2528.50391 2511.84204 2528.12061 2500.79517
2510.69971
Threads: 2 | Time Parallel Private 0.379999995 s
Time Normal 0.603999972 s
Result in parallel mode
2492.20679 2496.56152 2500.58203 2516.51685 2516.43604
2530.71313
Result in serial mode
2492.20679 2496.56152 2500.58203 2516.51685 2516.43604
2530.71313
------------------------------------------------
Threads: 4 | Time Parallel Private 1.11500001 s
Time Normal 0.486000001 s
第二次执行:
Result in parallel mode
2477.89478 2528.50391 2511.84204 2528.12061 2500.79517
2510.69971
Result in serial mode
2477.89478 2528.50391 2511.84204 2528.12061 2500.79517
2510.69971
Threads: 2 | Time Parallel Private 0.379999995 s
Time Normal 0.603999972 s
Result in parallel mode
2492.20679 2496.56152 2500.58203 2516.51685 2516.43604
2530.71313
Result in serial mode
2492.20679 2496.56152 2500.58203 2516.51685 2516.43604
2530.71313
------------------------------------------------
Threads: 4 | Time Parallel Private 1.11500001 s
Time Normal 0.486000001 s
它是使用以下方法编制的:
gfortran -Wall -fopenmp -g -O2 -o prog.exe prueba.f90
./prog.exe
如果您有N个内核,并且使用N个线程,那么您的一些线程会被切换到其他进程和线程。因此,使用的线程数最好比可用的内核数少。a您真的确定实际有4个内核吗。还是某种超读?您使用的CPU型号是什么?“正常”运行时的差异令人怀疑。还要确保CPU有足够的时间加速。@VladimirF型号是AMD A6-6310。我想这一切都取决于内存带宽。如果不使用循环平铺或类似技巧进行认真的重写,您将无法获得更高的性能。做一个有效的矩阵乘法很难,对初学者来说也不是一项真正的任务。@Isaac我也认为内存带宽有限,但将循环重新排列到顺序j->k->I(如此并行化j)而不是当前的I->j->k不是更好吗?(虽然这可能取决于阵列形状…)前者让我在core-i7(4-core,2012,old…)上有了更好的性能。另外,像gfortran-10-O2-pipe-march=native-mtune=native-funroll循环--param max unroll times=4-ftree vectorize-Wall这样的选项可能会给我的计算机带来一些加速(这是我在网上从steve kargl那里学到的),在我的计算机上有6个内核/12个线程,我串行获得了0.16到0.18秒,2个线程获得了0.10秒,0.06秒(4个线程)和0.04秒(12个线程)。无论并行化是否是最优的,它都在做一些事情,并提供了有用的加速。我没有观察到4个线程比2个线程更糟糕。一个线程通常只有一次计算需要整个计算机。操作系统和相关服务仍在发挥作用,但这几乎可以忽略不计。这取决于上下文。在高性能计算环境中,当您的进程通常有一台完整的计算机(或超级计算机上的节点)可用时,经过良好的优化,您可以定期实现每个核心的99%以上的使用率。在这种情况下,使用少于可用内核数量的线程是没有意义的。