<分区>
什么方法应该更快? 第一种方法是增加一个变量以减少:
#pragma omp parallel private(seed, x, y, i) reduction (+:counter)
{
seed = 25234 + 17 * omp_get_thread_num();
nproc = omp_get_thread_num();
#pragma omp parallel for
for(i=0; i<prec/8; i++){
x = (double)rand_r(&seed) / RAND_MAX;
y = (double)rand_r(&seed) / RAND_MAX;
if(x*x+y*y<1){
counter++;
}
}
第二个是使用每个进程的增量变量表,最后,该表中元素的总和是结果:
#pragma omp parallel private(seed, x, y, i , nproc)
{
seed = 25234 + 17 * omp_get_thread_num();
nproc = omp_get_thread_num();
#pragma omp parallel for
for(i=0; i<prec/8; i++){
x = (double)rand_r(&seed) / RAND_MAX;
y = (double)rand_r(&seed) / RAND_MAX;
if(x*x+y*y<1){
counter[nproc]++;
}
}
}
double time = omp_get_wtime() - start_time;
int sum=0;
for(int i=0; i<8; i++){
sum+=counter[i];
}
理论上,第二种方式应该更快,因为进程不是共享一个变量,而是每个进程都有自己的变量。 但是当我计算执行时间时:
first approach: 3.72423 [s]
second approach: 8.94479[s]
我的想法是错误的还是我的代码做错了什么?