Доброго времени суток.
Решил я на досуге к своей программе добавить параллельность на базе openMP. В результате никакого ускорения я не получил (а даже наоборот). Сделал я для проверки тестовый пример (подобный тем, которыми в изобилии интернет):
#include <iostream>
#include <boost/timer.hpp>
#include <omp.h>
using namespace std;
long single_thread(long a[], const long &niter)
{
long sum = 0;
for (long i = 0; i < niter; i++)
{
for (long j = 0; j < niter; j++)
{
for (long k = 0; k < niter; k++)
{
sum += (a[i] + a[j] + a[k]);
}
}
}
return sum;
}
long omp_atomic(long a[], const long &niter, const int &num_treads)
{
long sum = 0;
omp_set_num_threads(num_treads);
#pragma omp parallel for
for (long i = 0; i < niter; i++)
{
for (long j = 0; j < niter; j++)
{
for (long k = 0; k < niter; k++)
{
#pragma omp atomic
sum += (a[i] + a[j] + a[k]);
}
}
}
return sum;
}
long omp_reduction(long a[], const long &niter, const int &num_treads)
{
long sum = 0;
omp_set_num_threads(num_treads);
#pragma omp parallel for reduction(+: sum)
for (long i = 0; i < niter; i++)
{
for (long j = 0; j < niter; j++)
{
for (long k = 0; k < niter; k++)
{
sum = sum + (a[i] + a[j] + a[k]);
}
}
}
return sum;
}
int main()
{
boost::timer t;
const long niter = 1000;
long a [niter];
long sum = 0;
for (long i = 0; i < niter; i++)
{
a[i] = i;
}
t.restart();
sum = single_thread(a, niter);
cout << "Iterative. Sum: " << sum << " time: " << t.elapsed() << endl;
t.restart();
sum = omp_atomic(a, niter, 2);
cout << "Atomic, 2 threads. Sum: " << sum << " time: " << t.elapsed() << endl;
t.restart();
sum = omp_atomic(a, niter, 4);
cout << "Atomic, 4 threads. Sum: " << sum << " time: " << t.elapsed() << endl;
t.restart();
sum = omp_reduction(a, niter, 2);
cout << "Reduction, 2 threads. Sum: " << sum << " time: " << t.elapsed() << endl;
t.restart();
sum = omp_reduction(a, niter, 4);
cout << "Reduction, 4 threads. Sum: " << sum << " time: " << t.elapsed() << endl;
return 0;
}
В итоге получил следующие результаты:
./openmp_test
Iterative. Sum: 1498500000000 time: 0.98
Atomic, 2 threads. Sum: 1498500000000 time: 60.85
Atomic, 4 threads. Sum: 1498500000000 time: 117.51
Reduction, 2 threads. Sum: 1498500000000 time: 11.04
Reduction, 4 threads. Sum: 1498500000000 time: 24.45
В качестве тестовой выступает машина под управлением openSuse:
cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 42
model name : Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz
...
Может кто-нибудь сталкивался с подобной проблемой, как лечили?