2017-10-14 37 views
0

我一直在寻找问题omp parallel for loop (reduction to find max) ran slower than serial codes 我试图运行提供的代码的大块(这里是一个简化复印件)OpenMP随机表演?

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

int main() 
{ 
    double sta, end, elapse_t; 
    int bsize = 46000000; 
    double *buffer = malloc(bsize * sizeof(double)); 
    int max_val = 0; 

    srand(time(NULL)); 
    for (int i = 0; i < bsize; i++) 
     buffer[i] = rand() % 10000; 

    sta = omp_get_wtime(); 

#pragma omp parallel for reduction(max : max_val) 
    for (int i = 0; i < bsize; i++) { 
     max_val = max_val > buffer[i] ? max_val : buffer[i]; 
    } 
    end = omp_get_wtime(); 
    printf("time %f\n", end - sta); 

    free(buffer); 
    return 0; 
} 

Compliled有:

gcc test.c -o test -O3 -fopenmp 

由于原来的文章是关于表演,我注意到结果真的不同于一个跑到另一个,因此我跑了200次,并看着perfs:

$ for i in `seq 200`; do ./test ; done | sort -u 

是给我:

time 0.025260 
time 0.025261 
time 0.025272 
time 0.025319 
time 0.025321 
... 
time 0.036945 
time 0.037185 
time 0.037988 
time 0.039659 
time 0.040315 
time 0.040645 
time 0.041171 

所以你可以看到,最慢的人拿比一见倾心的巨大差异最快的50%以上的时间。

有什么可以解释这一点?

我试着在450M下设置bsize,然后性能非常相似(+ - 5%),但我感到困惑:这是否意味着除非是非常大的东西,openmp性能是不可预测的?

编辑:

我的conf是Fedora Linux系统内核26#4.13.4-200.fc26.x86_64 1 SMP周四 9月28日20点46分39秒UTC 2017年x86_64的x86_64的x86_64的GNU/Linux的

没有特殊的环境变量(没有perticular为OpenMP)

的CPU是

英特尔(R)核心(TM)i3-5010U CPU @ 2.10GHz

一个典型未分类的样品是:

time 0.027549 
time 0.026125 
time 0.027008 
time 0.026982 
time 0.027888 
time 0.025868 
time 0.031977 
time 0.044448 
time 0.027515 
time 0.032198 
time 0.026162 
time 0.025598 
time 0.025791 

编辑2: 由于不同意见,我最终意识到该测试是不恰当的,特别是因为与任务调度可能引入的开销相比,时间真的很短。 因此,我认为这个问题是不相关的,谢谢你的回答,抱歉浪费我可能造成的时间。

+0

我们需要更多的信息1)系统规格,特别是CPU。 2)操作系统,环境变量3)未分类的时间。 – Zulan

+0

作为一个移动CPU,我认为这是一个带有图形用户界面的系统。为避免背景中的应用对测量产生影响,您采取了哪些努力? – Zulan

+0

只是好奇心,当缓冲区是双数组时,为什么要使用int max_val。 – itsnevertoobadtoaskforhelp

回答

0

您发布的时间非常少,所以许多其他因素进入游戏,不仅openmp。请考虑使用大型数据集或重复循环几次(如果有意义)

另外,考虑到创建线程的开销可能无法弥补openmp杂注中非常简单的循环体(只需搜索向量中的最大值),并且运行一次。

+0

您可能是对的,计时太短,环境太难预测,无法知道CPU是否在时间不好时处理另一个进程。我运行vtune放大器,看到胎面很好产生并且代码以并行方式运行,但是不能指望内核只调度我的进程(将毫无意义...) 感谢您的支持:) – OznOg