【发布时间】:2015-09-17 18:29:27
【问题描述】:
我是一名物理学研究员,我正在对锰酸盐的磁性进行蒙特卡罗模拟。我用 C 语言编写了一个程序,一切都很好,只是执行时间非常长(可能 1000 年,具体取决于马尔可夫链的大小和格的大小)。所以我没有解决方案,除了我必须并行化我的程序并找到一个超级计算器。当然,我不能并行化整个程序,因为如果这样做,我将失去马尔可夫链循环的因果关系。我只能在马尔可夫链中并行化一个循环,这就足够了。下面是我的程序的一部分,显示了我必须并行化的循环。如果有人能告诉我如何将此循环划分为线程?
n = 1;
while(n <= Nc)
{
fscanf(voisins,"%d%d%f%f%f%f",&i,&j,&r[0],&r[1],&r[2],&d);
V = 0.0;E = 0.0;F = 0.0;
for(p = 0;p < 3;p++)
{
V += (D/pow(d,3.0))*(spin[3*i-3+p]-w[p])*spin[3*j-3+p];
E += (spin[3*i-3+p]-w[p])*r[p];
F += spin[3*j-3+p]*r[p];
}
G = -3*(D/pow(d,5.0))*E*F;
dU += (V+G);
n++;
}
【问题讨论】:
-
你想知道如何多线程。 (查看英特尔 TBB 和 OpenMP);或者,您是否想知道如何将其拆分为更小的块,以便您可以使用您选择的库对其进行多线程处理?
-
你的代码很慢,如图所示。 1. 你真的需要 fscanf() 吗? I/O 非常昂贵 2. pow(d, 3.0) -> (ddd) 3. pow(d, 5.0) -> (ddddd)。目前还不清楚
G和dU是什么类型的值。全局变量? -
我真的需要 fscanf 来避免制表符。这个文件 voisins.dat 是 6 Go 大小的。 V,G,F,E 和 dU 是双精度数,并在 main() 函数中声明。是的,它非常慢,尤其是这个过程将重复数百万次以达到热平衡(中心极限定理)。除了并行计算,我别无选择
标签: c parallel-processing montecarlo