Я бегу очень простая процедура в 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
Любые предложения по повышению производительности (вместо уменьшения)? спасибо!!
Если я правильно прочитал ваши номера, скорость выполнения увеличивается более чем на 10 при переходе от 7 потоков до 8 - значительное улучшение производительности. Я предлагаю вам повторное время с гораздо большими и более длинными циклами, и возьмите в среднем 3 - 5 трасс, прежде чем пытаться сделать какие-либо выводы. –
Спасибо, Марк. Возможно, я чаще всего получаю: 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