如何为并行编程编写伪代码?特别是,您如何区分本地和共享变量?您如何表示分散,收集,减少,广播和点对点通信等操作?这有什么标准吗?
答案 0 :(得分:12)
伪代码几乎只是英文。所以,你可以使用任何清晰明确的东西。它不是一种编程语言,所以你不需要表示像“分散”这样的操作......你可以说“分散”。
伪代码没有标准,但好的伪代码简单易懂。
答案 1 :(得分:4)
我找到了至少一种用于并行编程的伪语言:Peril-L。这是正式的,但对我来说有点太低了。
答案 2 :(得分:1)
在此处尝试“编写图表”:http://www.websequencediagrams.com/
你将最终得到两全其美,相当简单的英语陈述(“伪代码”)和干净的图表。我已经能够使用这些图表向我的经理和同事解释相当复杂的并行编程。最后但并非最不重要的是,可以将图表'source'检入源控制系统。
答案 3 :(得分:1)
对你的问题的简短回答是,没有传统的方法来为并行编程编写伪代码。
这是由于在不同的并行体系结构(例如,SMP,GPU,集群和其他外来系统)和并行编程方法方面存在多种方式来进行并行编程。我指的是“编程方法”,因为一般来说,大多数是库或注释而不是语言(参见MPI,OpenMP,TBB等)。因此,即使您可以选择体系结构和语言,也很难定义库或注释系统的语义。
幸运的是,已经开发出更加严格定义的编程方法。但是,它们通常基于共享内存或消息传递。找到合适的符号/伪代码将取决于您需要定义语义的程度以及您尝试表达的并行编程问题的类型。
以下是两条建议:
PRAM模型非常简单,应该用作共享内存编程符号的基础。 CSP本身对于伪代码可能过于数学化,并且occam符号可能过于冗长。这是Brinch Hansen(一个很好的并发编程)的观点,他设计了自己的相关语言SuperPascal,用作解释出版物中并行算法的符号。
据我所知,还没有开发出可以严格定义和/或适合用作高级表示法的其他并行计算语言。
答案 4 :(得分:0)
这个essay by Matthew Adams可能是我在使用伪代码形式的多线程过程中看到的最好的介绍。
答案 5 :(得分:0)
您是否考虑采用行为驱动开发方法?我最近使用BDD方法将一个相当复杂的多进程/多核代码放在一起,发现它非常有用。这种方法最好的部分是我可以用简单的英语描述所有内容,并专注于问题而不是实现细节。我的前几次迭代是单线程的,以确保代码通过所有测试并解决了问题。我通过在选定位置利用多处理来增强系统性能,同时确保它不会破坏单线程系统通过的测试。重构要容易得多,因为代码已经比我过早地设计优化设计细节的方法简单得多,而且我可以专注于监控重新分解系统的处理时间,因为我得到的结果与之前的迭代完全相同。 / p>
看一下这本书Test Driven Development for Embedded C的一些想法。我在开发过程中利用了这本书,并将其作为我图书馆的永久部分。
答案 6 :(得分:0)
经过一些网络研究,我意识到一种“标准”仍然不存在。正如@Larry Watanabe所说:“伪代码几乎只不过是英语。因此,您可以使用任何清晰明了的东西。它不是编程语言,因此您无需表示“ scatter”之类的操作即可。说“分散”。
因此,这里是我使用algorithm2e
的个人解决方案:关于“共享内存”,“局部变量”等没有太多细节。但是,使用相同的策略,您可以找到一种描述您的想法的方法:
\usepackage[linesnumbered,ruled,vlined]{algorithm2e}
...
\begin{algorithm}
\DontPrintSemicolon
\SetKwBlock{DoParallel}{do in parallel}{end}
\KwIn{Some inputs}
\KwOut{The ouput}
\DoParallel{
Compute a \;
Compute b \;
Compute c \;
}
\DoParallel{
a1\;
b1\;
c1\;
}
\Return{the solution}\;
\caption{Parallel Algo}
\label{algo:parallelAlgorithm}
\end{algorithm}
结果是:
它基于使用表达式\SetKwBlock
定义新命令的基础。可以在here中找到该软件包的手册。
我最初也在here上发布了这个问题的答案。
使用定义关键字的策略以便用您喜欢的细节描述算法,应该总是可能的。请考虑以下因素:
结论:总是要权衡取舍:您决定限制在哪里(考虑到您所指的目标人群)。