2017-10-14 20 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