C openmp代码查找PI比串行方法花费更多的时间

C openmp代码查找PI比串行方法花费更多的时间,c,parallel-processing,openmp,C,Parallel Processing,Openmp,我正在使用openmp改进蒙特卡罗方法以找到PI。我所做的是将pragma子句添加到顺序代码中。代码如下 float host_monte_carlo_parallel(long trials, int noOfThreads) { float x, y; long points_in_circle; long i; #pragma omp parallel for num_threads(noOfThreads) private(i, x, y) reduction(

我正在使用openmp改进蒙特卡罗方法以找到PI。我所做的是将pragma子句添加到顺序代码中。代码如下

float host_monte_carlo_parallel(long trials, int noOfThreads) {
    float x, y;
    long points_in_circle;
    long i;

#pragma omp parallel for num_threads(noOfThreads) private(i, x, y) reduction(+:points_in_circle)
    for (i = 0; i < trials; i++) {
        x = rand() / (float) RAND_MAX;
        y = rand() / (float) RAND_MAX;
        //printf("%ld\n", i);
        points_in_circle += (x * x + y * y <= 1.0f);
    }

    return 4.0f * points_in_circle / trials;
}

不确定问题是否与调用
rand()
有关。可能与
rand()
有关,因为
rand()
必须维护所有线程共享的状态信息。因此,一次只能有一个线程调用
rand()
。要进行测试,请将
rand()
替换为
r++
,其中
r
只是一个要递增的
int
。尝试将
r
作为私有变量和共享变量。@user3386109我不知道如何使用它来衡量
rand()
的性能。对于
r
是私有和共享的情况,我得到的运行时间几乎相同。@HighPerformanceMark我使用了4个线程,它们在4个物理内核上运行。我使用
time.h
clock()
函数对执行进行计时。不确定问题是否与调用
rand()
有关。可能与
rand()
有关,因为
rand()
必须维护所有线程共享的状态信息。因此,一次只能有一个线程调用
rand()
。要进行测试,请将
rand()
替换为
r++
,其中
r
只是一个要递增的
int
。尝试将
r
作为私有变量和共享变量。@user3386109我不知道如何使用它来衡量
rand()
的性能。对于
r
是私有和共享的情况,我得到的运行时间几乎相同。@HighPerformanceMark我使用了4个线程,它们在4个物理内核上运行。我使用
time.h
clock()
函数对执行进行计时。请参阅
CPU pi calculated in 6.413644 s.
CPU parallel pi calculated in 203.746460 s.