使用 OpenMP 后耗时增加了好几倍,是什么原因?

仿照网上的 OpenMP 示例写了个测试程序,然而并没有提升效率,是哪里的问题?

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <omp.h>

double calc(void)
{
        double sum = 0;
        
        for (size_t i = 0; i < 10000000; ++i) {
                sum += atan((int)((i * 1.0 + (1.0 + rand() % 100)) * 3.14) % 10);
        }
        return sum;
}

int main(void)
{
        clock_t c;
        double sec;
        double results[40];
        size_t i;

        c = clock();
        srand(time(NULL));
        #pragma omp parallel for
        for (i = 0; i < 40; ++i) {
                results[i] = calc();
        }
        sec = (clock() - c) * 1.0 / CLOCKS_PER_SEC;
        printf("%gs\n", sec);
        return 0;
}

两个版本的运行结果:

图片描述

跑 OpenMP 版本时四个核的使用率是蛮高的。

图片描述

阅读 6.3k
1 个回答

你程序里频繁的使用了 rand。

在 glibc 里,rand 的实现直接调用了 __random,__random 是这样的:

long int
__random (void)
{
   int32_t retval;
 
   __libc_lock_lock (lock);
 
   (void) __random_r (&unsafe_state, &retval);
 
   __libc_lock_unlock (lock);
 
   return retval;
}

这里面有一把琐(__libc_lock_lock (lock))。于是多线程并行密集调用肯定不会快。

而且,这把锁背后用的是 lll_lock ,而不是 mutex 。lll_lock 是 busy wait ,阻塞的时候也不会释放 CPU。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进