仿照网上的 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 版本时四个核的使用率是蛮高的。
你程序里频繁的使用了 rand。
在 glibc 里,rand 的实现直接调用了 __random,__random 是这样的:
这里面有一把琐(
__libc_lock_lock (lock)
)。于是多线程并行密集调用肯定不会快。而且,这把锁背后用的是 lll_lock ,而不是 mutex 。lll_lock 是 busy wait ,阻塞的时候也不会释放 CPU。