Работает для меня, используя следующий автономный пример, то есть я получаю ускорение в 4 раза при включении openmp:
#include <iostream>
#include <bench/BenchTimer.h>
using namespace Eigen;
const int COUNT = 4;
EIGEN_DONT_INLINE
void foo(const Matrix4f *trans, const MatrixXf *in_data, MatrixXf *out_data)
{
#pragma omp parallel for num_threads(COUNT)
for (int i = 0; i < COUNT; i++)
out_data[i] = trans[i] * in_data[i];
}
int main()
{
Eigen::Matrix4f trans[COUNT];
Eigen::MatrixXf in_data[COUNT];
Eigen::MatrixXf out_data[COUNT];
int n = 500000;
for (int i = 0; i < COUNT; i++)
{
trans[i].setRandom();
in_data[i].setRandom(4,n);
out_data[i].setRandom(4,n);
}
int tries = 3;
int rep = 1;
BenchTimer t;
BENCH(t, tries, rep, foo(trans, in_data, out_data));
std::cout << " " << t.best(Eigen::REAL_TIMER) << " (" << double(n)*4.*4.*4.*2.e-9/t.best() << " GFlops)\n";
return 0;
}
Итак, 1) убедитесь, что вы измеряете время настенных часов, а не процессорное время, и 2) убедитесь, что продукты являются узким местом и не заполняют in_data
.
Наконец, для максимальной производительности не забудьте включить AVX / FMA (например, с -march=native
), и, конечно же, обязательно сравните тест с включенной оптимизацией компилятора.
Для справки: на моем компьютере приведенный выше пример занимает 0,25 с без openmp и 0,065 с с.