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
Fortran OMP_set_dynamic()没有我预期的那么有用?_Fortran_Openmp - Fatal编程技术网

Fortran OMP_set_dynamic()没有我预期的那么有用?

Fortran OMP_set_dynamic()没有我预期的那么有用?,fortran,openmp,Fortran,Openmp,我希望每个人都做得很好 我是OpenMP新手。我想这个问题很基本。但我找不到一个好的答案,并期待着任何建议 我正在集群上使用OpenMP运行代码。我的代码中有调用OMP\u set\u dynamic(.TRUE.)。我使用OpenMP并行化以下循环: !$OMP PARALLEL DO COLLAPSE(2) DEFAULT(PRIVATE) SHARED(var1, var2) SCHEDULE(DYNAMIC) DO i = 1,NI DO j = 1,NJ ......

我希望每个人都做得很好

我是OpenMP新手。我想这个问题很基本。但我找不到一个好的答案,并期待着任何建议

我正在集群上使用OpenMP运行代码。我的代码中有
调用OMP\u set\u dynamic(.TRUE.)
。我使用OpenMP并行化以下循环:

!$OMP PARALLEL DO COLLAPSE(2) DEFAULT(PRIVATE) SHARED(var1, var2) SCHEDULE(DYNAMIC)
DO i = 1,NI
  DO j = 1,NJ
    ......
  END DO
END DO
!$OMP END PARALLEL DO
我设置NI=123,NJ=121

我想我可以访问集群上至少20个CPU。htop显示我实际上有24个。但是当我运行代码时,似乎并不是所有的CPU都被使用。htop显示“任务:43115 thr;13正在运行”。(很抱歉,我没有被允许插入图片。)我也尝试了另一个版本,但没有
折叠(2)
,但没有太大区别

我的猜测是,我没有足够的任务分配给所有CPU。但我不确定。任何建议都将不胜感激

除了使用
CALL OMP\u set\u dynamic(.TRUE.)
SCHEDULE(dynamic)
之外,我还期待着任何关于充分利用集群的建议。也欢迎评论我是否应该使用
COLLAPSE(2)
。谢谢

OMP\u set\u dynamic()
SCHEDULE(dynamic)
是两件不相关的事情

前者控制OpenMP中的动态并行性,这是运行时决定特定并行区域需要多少线程并在小于指定最大线程数的情况下启动的能力。例如,如果您有一个组合的
并行部分
构造,其中包含两个部分,并且将
OMP_NUM_THERADS
设置为24,那么当只有两个任务(部分)要执行时,为该区域生成24个线程是没有意义的

后者告诉OpenMP如何安排线程之间的循环迭代<代码>动态调度策略以先到先得的方式分配迭代。如果没有区块大小规范,例如,
SCHEDULE(DYNAMIC,100)
,则动态计划默认为区块大小1,这意味着每个迭代都成为自己的OpenMP任务。给定
COLLAPSE(2)
子句,您的迭代空间为
NI*NJ
或14883次迭代,并且OpenMP任务的数量相同。如果您在内部循环中没有做足够的工作,OpenMP开销将完全淹没并行运行带来的任何性能优势

动态调度的唯一用途是用于循环体中完成的工作可能因迭代而大不相同的情况。一个典型的例子是渲染Mandelbrot分形。远离Mandelbrot集的点逃逸吸引子所需的迭代次数远少于接近它的点。如果每次迭代的工作量是常数,例如,将矩阵的每个元素乘以常数因子,则不应使用动态调度,而应使用静态调度

是否应该使用
COLLAPSE(2)
取决于内部循环中发生的事情。折叠迭代空间会导致使用整数除法和模运算来重建原始循环变量,这可能会减慢紧循环的速度。此外,它可能禁止矢量化,这可能会也可能不会产生负面影响


正如Vladimir F所指出的,当您掌握硬件时,很难进行优化,而当您对代码一无所知时,这几乎是不可能的。虽然您可能会犯一些常规错误,但我建议您学习如何使用一些工具,例如评测代码,并自行查找效率低下和性能瓶颈。如果您无权访问群集上的此类工具,请在您自己的计算机上安装它们。OpenMP是所有现代编译器都支持的,除了MS Visual C++(它支持一个非常旧的版本),它到处运行。

你可以显示一个最小但完整的程序来说明你的问题。另外,如果你能澄清你所说的“hotp”是什么意思,并不是每个人都可以使用你所使用的同一套工具。当你控制着完整的程序和硬件时,优化和调试性能是很困难的。看这样一段不完整的代码显然是不可能的。嗨,兰布什和弗拉基米尔F,谢谢你们的评论!很抱歉,输入错误“hotp”应该是“htop”。谢谢你让我知道优化是程序和硬件特定的,我会考虑更多。谢谢你,赫里斯托·伊利耶夫。我感谢你的详细解释。现在我更了解OpenMP了。我一定会试试英特尔VTune™ 剖析器。再次感谢!