2016-12-17 57 views
0

这里是OpenMP的我的测试代码为什么一个简单的没有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 

的输出朗姆酒main0.000039

然后我使用OpenMP

编译

,输出为0.008020

谁能帮助我了解为什么会发生。事先感谢。

+0

我认为你需要围绕'#pragma omp for'循环的'#pragma omp parallel'声明的括号 –

+0

你的意思是这样吗? '#pragma omp parallel {......}',我试过了,它是一样的,不起作用。 –

+0

自从我使用openMP已经有一段时间了,但代码的最大代价是线程的开销管理。在更大的执行时间内,你会看到更大的收益(尝试像100万)。 –

回答

1

由于高性能标记在他的评论中如此雄辩地描述,创建线程和分发工作需要花费(开销)。对于这样一项小小的工作(39美元),开销超过任何可能的收益。

也就是说,你的测量也是误导。 clock衡量CPU时间,很可能不是你想要的(挂钟)。有关更多详细信息,请参阅this question

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

+0

大量开销与创建线程相关,这通常只发生在第一个并行区域。一个更现实的开销测量(假设你的代码有多个并行区域)在开始计时之前有一个空的并行区域,以便线程已经创建,并且你只是测量唤醒的正常开销他们了。 –