2015-09-04 2 views
0

Я бегу очень простая процедура в C++ с использованием OpenMP и измерения затраченного времени ... код идет в читает,OpenMP C++ GCC Базовая процедура

#include <iostream> 
#include <math.h> 
#include "timer.h" 
#include <omp.h> 



int main() 
{ 
    double start,finish; 
    int i; 
    int n=8000; 
    double a[n]; 
    double b[n]; 
    double c[n]; 



    GET_TIME(start); 
#pragma omp parallel private(i,a) shared(b,c,n) 
    { 
#pragma omp for 
     for (i=0; i<n-1; i++) 
     b[i] += (a[i] + a[i+1])/2; 
#pragma omp for 
     for (i=0; i<n-1; i++) 
      c[i] += (a[i] + a[i+1])/2; 
    } 
    GET_TIME(finish); 
    std::cout<< "Elapsed time is" <<(finish-start)<<"seconds"; 
    return 0; 
} 

код с я компиляции следующим Баш скрипт (заметим, что потоки определены в среде переменной OMP_NUM_THREADS = $ N):

#!/bin/bash 

clear 

g++ -O3 -o test test.cpp -fopenmp 

for n in $(seq 1 8); do 
    export OMP_NUM_THREADS=$n 
    ./test 
    echo threads=$n 
done 

в результате общая тенденция к снижению производительности при увеличении числа потоков наблюдается следующим образом: (конечно номера могут меняться) ...

Elapsed time is0.000161886secondsthreads=1 
Elapsed time is0.00019002secondsthreads=2 
Elapsed time is0.00226498secondsthreads=3 
Elapsed time is0.000210047secondsthreads=4 
Elapsed time is0.000212908secondsthreads=5 
Elapsed time is0.00920105secondsthreads=6 
Elapsed time is0.00937104secondsthreads=7 
Elapsed time is0.000834942secondsthreads=8 

Любые предложения по повышению производительности (вместо уменьшения)? спасибо!!

+0

Если я правильно прочитал ваши номера, скорость выполнения увеличивается более чем на 10 при переходе от 7 потоков до 8 - значительное улучшение производительности. Я предлагаю вам повторное время с гораздо большими и более длинными циклами, и возьмите в среднем 3 - 5 трасс, прежде чем пытаться сделать какие-либо выводы. –

+0

Спасибо, Марк. Возможно, я чаще всего получаю: 8.39233e-05secondsthreads = 1 Истекшее время is0.000119925secondsthreads = 2 Истекшее время is0.000138044secondsthreads = 3 Истекшее время is0.000138044secondsthreads = 4 Истекшее время is0.00secondsthreads = 5 Истекшее время is0.000133991secondsthreads = 6 Истекшее время is0.00356102secondsthreads = 7 Истекшее время is0.00615597secondsthreads = 8 .... Всегда худшее, когда я увеличиваю потоки ... Я знаю, что Loop не достаточно большой, однако есть ли способ улучшить его с помощью другой техники, как SIMD fe? Спасибо!. – uom0

ответ

1

Вы можете сделать это вместо этого, это увеличит операцию, выполняемую каждым потоком. Это должно преодолеть накладные расходы, необходимые для запуска нового потока, фактически имея поток, который еще работает. Кроме того, нет необходимости объявлять b, c или n как общие.

#pragma omp parallel private(i,a,b,c,n) 
{ 
#pragma omp for schedule(static) 
    for (i=0; i<n-1; i++){ 
     b[i] += (a[i] + a[i+1])/2; 
     c[i] += (a[i] + a[i+1])/2;} 
} 
+1

Спасибо, но по-прежнему снижается производительность ... смотрите ... Прошедшее время is3.38554e-05secondsthreads = 1 Прошедшее is0.000103951secondsthreads время = 2 Прошедшее is0.000139952secondsthreads время = 3 Прошедшее is0.000194788secondsthreads время = 4 истекшее время is0.000201225secondsthreads = 5 истекшее время is0.000176191secondsthreads = 6 истекшее время is0.000298023secondsthreads = 7 Прошедшее время is0.000277996secondsthreads = 8 – uom0

+0

Попробуйте использовать статическое планирование. Я изменил ответ, чтобы включить его. Ваш тест небольшой, результаты очень различаются между испытаниями. – Mido

+0

Еще раз спасибо! Результаты, infact немного меняются, потому что это небольшая проблема, но всегда с одним ядром намного быстрее, чем с большим количеством ядер ... Я пробовал то, что ваш пост и прочитал, становится жалким с увеличением потоков ... Спасибо! , истекшее время is8.39233e-05secondsthreads = 1 Прошедшее время is0.000119925secondsthreads = 2 Прошедшее время is0.000138044secondsthreads = 3 Прошедшее время is0.000138044secondsthreads = 4 истекшее время is0.00secondsthreads = 5 Прошедшее время is0.000133991secondsthreads = 6 Истекшее время is0.00356102secondsthreads = 7 Истекшее время is0.00615597secondsthreads = 8 – uom0

Смежные вопросы