所以,我正在进行蒙特卡罗模拟以计算Pi。我目前有5种不同的场景:500,20000,100000,1000000,10000000点来计算Pi,我的问题是我必须多线程算法(每个点数为2,4,6和8个线程)但是我已经一直在寻找多线程,无法理解我为了实现目标必须做些什么。 希望有人可以解释我或告诉我如何实际执行算法的多线程位。
代码看起来像这样:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main ()
{
int circ, total, i;
double a, x, y, pi;
a = 0;
i = 0;
total = 500;
circ = 0;
for ( i = 0; i<total; i++ ) {
x = (double)rand ()/ RAND_MAX;
y = (double)rand ()/ RAND_MAX;
a = x*x + y*y
if (a<=1) circ ++;
}
pi = (double)circ/total * 4;
printf ("For %d points, pi is %g \n", total, pi);
total = 20000;
circ = 0;
for ( i = 0; i<total; i++ ) {
x = (double)rand ()/ RAND_MAX;
y = (double)rand ()/ RAND_MAX;
a = x*x + y*y
if (a<=1) circ ++;
}
pi = (double)circ/total * 4;
printf ("For %d points, pi is %g \n", total, pi);
total = 100000;
circ = 0;
for ( i = 0; i<total; i++ ) {
x = (double)rand ()/ RAND_MAX;
y = (double)rand ()/ RAND_MAX;
a = x*x + y*y
if (a<=1) circ ++;
}
pi = (double)circ/total * 4;
printf ("For %d points, pi is %g \n", total, pi);
total = 1000000;
circ = 0;
for ( i = 0; i<total; i++ ) {
x = (double)rand ()/ RAND_MAX;
y = (double)rand ()/ RAND_MAX;
a = x*x + y*y
if (a<=1) circ ++;
}
pi = (double)circ/total * 4;
printf ("For %d points, pi is %g \n", total, pi);
total = 10000000;
circ = 0;
for ( i = 0; i<total; i++ ) {
x = (double)rand ()/ RAND_MAX;
y = (double)rand ()/ RAND_MAX;
a = x*x + y*y
if (a<=1) circ ++;
}
pi = (double)circ/total * 4;
printf ("For %d points, pi is %g \n", total, pi);
非常感谢您的耐心和美好的一天:)
答案 0 :(得分:0)
在编写程序或算法的多线程版本时,您必须考虑的第一件事是
您首先必须确定应用程序的部分内容 享受多线程或需要并行运行。这是为了什么 循环代码部分
您要并行化的代码的部分或分支必须是
相互独立,避免竞争条件等事情。和
通过你的代码看到的,它之间的依赖关系
享受多线程的潜在代码分支就在于此
条件。
a = x * x + y * y;
if ( a <= 1 ) circ++;
如果你想出这个代码的多线程版本,你将不得不处理竞争条件之类的事情,因为所有线程都希望同时写入a
共享内存。即使你试图让每个线程专门写入共享内存,你可能最终会遇到另一个问题,可能是你的代码的串行版本比并行版本快得多,这可能是一个线程循环很长一段时间,持有一个锁,阻止其他线程访问a
共享内存。尝试使用无锁机制(例如原子)也会导致内存排序等问题
你应该做什么
你现在要做的是重新设计你的代码,如果循环没有任何依赖关系,或者如果你准备好面对多线程的危险而不重新设计你的代码,你可以看看这本书,它有一个用于学习pthreads和omp的部分。这是一本不错的书,但是大多数示例都不会编译取决于您正在编译哪个c标准
Darryl Gove - Multicore Application Programming for Windows, Linux, and Oracle Solaris - 2010