Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing 在并行计算中,为什么使用所有线程(4)的执行时间比只使用一半(2)的执行时间长?_Parallel Processing_Fortran_Openmp_Gfortran - Fatal编程技术网

Parallel processing 在并行计算中,为什么使用所有线程(4)的执行时间比只使用一半(2)的执行时间长?

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

例如,我使用的代码(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       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%以上的使用率。在这种情况下,使用少于可用内核数量的线程是没有意义的。