C openmp代码查找PI比串行方法花费更多的时间
我正在使用openmp改进蒙特卡罗方法以找到PI。我所做的是将pragma子句添加到顺序代码中。代码如下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(
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.