用蒙特卡罗模拟多线程计算Pi

时间:2018-05-19 19:04:23

标签: c multithreading

所以,我正在进行蒙特卡罗模拟以计算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);

非常感谢您的耐心和美好的一天:)

1 个答案:

答案 0 :(得分:0)

在编写程序或算法的多线程版本时,您必须考虑的第一件事是

  1. 您首先必须确定应用程序的部分内容 享受多线程或需要并行运行。这是为了什么 循环代码部分

  2. 您要并行化的代码的部分或分支必须是
     相互独立,避免竞争条件等事情。和  通过你的代码看到的,它之间的依赖关系  享受多线程的潜在代码分支就在于此  条件。

    a = x * x + y * y; if ( a <= 1 ) circ++;

    如果你想出这个代码的多线程版本,你将不得不处理竞争条件之类的事情,因为所有线程都希望同时写入a共享内存。即使你试图让每个线程专门写入共享内存,你可能最终会遇到另一个问题,可能是你的代码的串行版本比并行版本快得多,这可能是一个线程循环很长一段时间,持有一个锁,阻止其他线程访问a共享内存。尝试使用无锁机制(例如原子)也会导致内存排序等问题

  3. 你应该做什么

    你现在要做的是重新设计你的代码,如果循环没有任何依赖关系,或者如果你准备好面对多线程的危险而不重新设计你的代码,你可以看看这本书,它有一个用于学习pthreads和omp的部分。这是一本不错的书,但是大多数示例都不会编译取决于您正在编译哪个c标准

    Darryl Gove - Multicore Application Programming for Windows, Linux, and Oracle Solaris - 2010