#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
int main(int argc, char **argv)
{
unsigned long long in = 1;
unsigned long long total = 2;
double tol , change, new, secs , old = 0.0;
struct timeval start , end;
int threads ; /* ignored */
if (argc < 2) {
exit (-1);
}
threads = atoi (argv[1]);
tol = atof (argv[2]);
if ((threads < 1) || (tol < 0.0)) {
exit (-1);
}
tol = tol *tol;
srand48(clock());
gettimeofday (&start , NULL);
do
{
double x, y;
x = drand48();
y = drand48();
total ++;
if ((x*x + y*y) <= 1.00)
in ++;
new = 4.0 * (double)in/(double)total ;
change = fabs (new - old);
old = new;
}while (change > tol);
gettimeofday (&end, NULL);
secs = ((double)end.tv_sec - (double)start.tv_sec)
+ ((double)end.tv_usec - (double)start.tv_usec)/1000000.0;
printf (”Found estimate of pi of %.12f in %llu iterations , %.6f seconds.n n”,
new, total - 2, secs);
}
위의 코드는 pi를 얼마나 가깝게 추정 할 수 있는지에 대한 허용 오차에 대한 인수를 취하는 순차 프로그램입니다. 이러한 이전 값과 새 값의 변경이 종료되면 허용 오차 아래로 내려갑니다.pthreads를 사용하여 pi의 몬테카를 추정을 병렬화하는 방법은 무엇입니까?
이 프로그램을 pthreads로 병렬 처리해야합니다. 나는 누군가가 나를 위해 그것을하려고 노력하는 것이 아니라 오히려 생각할 수있는 포인터와 아이디어를 얻기 위해 내가 이것을 할 수있게 할 것입니다. pthreads 프로그램은 스레드의 수와 허용 오차를 인수로 취하여 추정값을 출력합니다. 나는 프로그램을 병렬 처리하는 것에 매우 익숙하며 어디서부터 시작해야할지 모르기 때문에 조언을 구할 것입니다. 감사.
'while (j
그래, 나는 당신이 지적한 j 문제를 본다. 스레드가 다른 스레드의 합계에만 액세스하고 거기에 스레드 포인트의 로컬 합계를 추가하기 때문에 왜 (j
그런 식으로 의견을 보내 주셔서 감사합니다. 그건 쉬운 실수 였어. lol –