0

我正在使用 Chapel 编程语言开发调试器。在我的代码中,我需要使用coforall循环,但不幸的是,我找不到使并行迭代按顺序执行的方法。

这是我的代码的一部分:

coforall i in 1..n by -1 do
{  
   middle = ( ( _delta[i]._sub.length ) / 2 ) : int;   
   if( middle != 0 )
   {  
       _delta[2*i  ]._sub=_delta[i]._sub[1+middle..];
       _delta[2*i-1]._sub=_delta[i]._sub[..middle];
   }
   ...
}

如您所见,我需要以并行和反向顺序执行此循环的迭代。

有什么办法吗?

4

1 回答 1

0

一般规则

根据定义,要并行执行的代码段(PAR进程调度的一种类型)不提供任何方法以便以任何特定“顺序”在硬件资源的任何基础设施上执行(例如另外执行某种一种SEQ进程调度的类型),包括“反向(后退)顺序”等。

由于没有这样的偶数同时也是奇数,因此任何进程调度
都没有机会同时成为 PAR SEQ


仍然可以使用用于“排序”任务执行的特定协调工具

实际上,出于特殊目的,有一些方法(也称为同步原语)可以提供阻塞步骤,因此计算的一部分必须明确等待,直到它接收到消息/值/另一种相互同步脉冲来自其他进程(任务或更复杂的分布式系统计算图的一部分)。

在所有情况下,都必须进行仔细的算法化,因为阻塞状态原则上可能并且将破坏并行代码执行可能提供的所有好处。

有关详细信息,请阅读 同步变量


结语

在任何情况下,必须求助于阻塞的设计(使用任何类型的屏障,或等待同步变量,或期待来自 CSP 通道等的消息)应该是最后的选择,如果所有其他计算机科学工具和重构努力未能提供更好的、尽可能多PAR的算法化。除了阻塞本身,Amdahl Law比率急剧下降,回到纯粹的SEQ时间表表现。

严重的 HPC 不是基于使用等待状态,而是恰恰相反。

于 2017-07-26T18:06:45.150 回答