这是我的OpenMP测试代码
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <time.h>
int main(int argc, char const *argv[]){
double x[10000];
clock_t start, end;
double cpu_time_used;
start = clock();
#pragma omp parallel
#pragma omp for
for (int i = 0; i < 10000; ++i){
x[i] = 1;
}
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("%lf\n", cpu_time_used);
return 0;
}
我使用以下两个命令编译代码:
gcc test.c -o main
朗姆酒main
的输出为0.000039
然后我用OpenMP编译
gcc test.c -o main -fopenmp
,输出为0.008020
任何人都可以帮助我理解它为什么会发生。先谢谢。
答案 0 :(得分:1)
正如高绩效标记在他的评论中雄辩地描述的那样,创建线程和分配工作会产生成本(开销)。对于这么小的工作(39 us),开销超过任何可能的收益。
尽管如此,您的测量结果也具有误导性。 clock
测量CPU时间,很可能不是你想要的(挂钟)。有关详细信息,请参阅this question。
您可能有另一种误解:只要x
足够大,简单循环就会受到内存限制。你可能不会看到你期望的加速。例如,在具有四个核心的典型桌面系统上,您可能会看到1.5 x而不是4 x的加速。