gpt4 book ai didi

c - 实现并行算法来计算 pi

转载 作者:太空狗 更新时间:2023-10-29 15:34:05 27 4
gpt4 key购买 nike

我想在 OpenMP 中使用线程实现以下代码的并行版本,有没有更好的方法来做到这一点?

/* Program to compute Pi using Monte Carlo methods */

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <time.h>
#define SEED 35791246

int main(int argc, char* argv)
{
int niter=0;
double x,y;
int i,count=0; /* # of points in the 1st quadrant of unit circle */
double z;
double pi;
clock_t end_time, start_time;


printf("Enter the number of iterations used to estimate pi: ");
scanf("%d",&niter);

start_time = clock();
/* initialize random numbers */
srand(SEED);
count=0;

#pragma omp parallel for
for ( i=0; i<niter; i++) {
x = (double)rand()/RAND_MAX;
y = (double)rand()/RAND_MAX;
z = x*x+y*y;
if (z<=1) count++;
}
#pragma omp task
pi=(double)count/niter*4;
#pragma omp barrier

end_time = clock();

printf("# of trials= %d , estimate of pi is %g, time= %f \n",niter,pi, difftime(end_time, start_time));

return 0;
}

最佳答案

它可以通过纠正一些 OpenMP 错误来改进。首先,由于您要在所有并行线程中对 count 的(副本)求和,因此您需要在并行段的末尾应用归约运算符以将所有这些合并回一个单一的值(value)。此外,变量 ixyz 需要为每个并行线程提供单独的实例 - - 你不希望线程使用同一个线程!要指定所有这些,循环顶部的 #pragma 指令应该是:

#pragma omp parallel for private(i, x, y, z) reduction(+:count)

此外,它的作用域是for 循环,因此您无需执行任何其他操作;循环退出后将自动同步线程。 (并且您需要同步才能使 count 包含来自所有线程的所有增量!)特别是,您的 taskbarrier 编译指示毫无意义,因为此时您只返回到一个线程——此外,将单个计算置于并行任务中毫无意义。

在这些情况下,gabe 提出了系统随机数生成器可能运行缓慢和/或随机性差的问题。您可能希望在您的系统上调查它的细节,并在每个线程中给它一个新的随机种子,或者根据您的发现使用不同的随机数生成器。

除此之外,它看起来还算合理。您对该算法无能为力,因为它很短而且可以简单地并行化。

关于c - 实现并行算法来计算 pi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2362198/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com