为什么没有OpenMP的简单for循环比使用OpenMP更快

时间:2016-12-17 07:07:59

标签: openmp

这是我的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

任何人都可以帮助我理解它为什么会发生。先谢谢。

1 个答案:

答案 0 :(得分:1)

正如高绩效标记在他的评论中雄辩地描述的那样,创建线程和分配工作会产生成本(开销)。对于这么小的工作(39 us),开销超过任何可能的收益。

尽管如此,您的测量结果也具有误导性。 clock测量CPU时间,很可能不是你想要的(挂钟)。有关详细信息,请参阅this question

您可能有另一种误解:只要x足够大,简单循环就会受到内存限制。你可能不会看到你期望的加速。例如,在具有四个核心的典型桌面系统上,您可能会看到1.5 x而不是4 x的加速。