如何准备一个程序

时间:2015-06-30 19:42:56

标签: c parallel-processing montecarlo

我是一名物理研究员,我正在进行关于锰氧化物磁性的Monte-Carlo模拟。我用C语言编写了一个程序,除了执行时间如此之大(可能是1000年,取决于马尔可夫链的大小和格子的大小)之外,一切都很顺利。所以我没有解决方案,除了我必须并行化我的程序并找到一个超级计算器。当然我无法并行化整个程序,因为如果我这样做,我将失去马尔可夫链循环的因果关系。我只能在马尔可夫链内部并行化一个循环,这就足够了。下面是我的程序的一部分,显示了我必须完成的循环。如果有人能告诉我如何将这个循环划分为线程?

getFile(B); //--> Output "wow!"
getFile(A); //--> Output "wow!" HERE IS THE PROBLEM, SHOULD ECHO "hey!"

1 个答案:

答案 0 :(得分:3)

通常很难,但众所周知蒙特卡罗方法是可并行的。你可以从Pthread tutorial开始,但有很多关于并行编程的书籍。

蒙特卡罗方法被广泛使用,例如在核物理学中(例如Tripoli 4)。

您可能还会详细了解Message Passing Interface(MPI)(甚至可能Multi-Agent Systems& Cloud computing}

最近C++11& C ++ 14标准了解threads

如果您可以访问真正的超级计算机,您可能希望混合使用这些方法(因此变得困难;如果可能,请获得专家的帮助):例如:在每个MPI节点上使用MPI和多线程。

您可以考虑使用GPGPU对GPGPU进行矢量计算。 OpenCL。我不确定它是否适合蒙特卡罗方法(更像是有限元素之类的矩阵式计算)。

OpenMP在编译器的帮助下实现了一些有限的并行性(例如#pragma - s)。

不要忘记蒙特卡罗存在大量高效的并行库,所以也要研究它们。

您还可以考虑使用传统IPC(可能是某种RPC机制的多进程方法,例如Json-RPC,如果交换的数据不大的话。然后阅读Advanced Linux Programming并详细了解fork(2)poll(2)pipe(7)tcp(7)& socket(7)shm_overview(7)sem_overview(7),...

Parallel computing很难(你需要多年时间才能成为专家,我不是这样),因为邪恶存在于细节中。

PS。当然,您需要在开发笔记本电脑或台式机上使用(并熟练使用)Linux。