Я использую Eigen для вычисления умножения двух матриц:
левый матричный запрос: 1 * 128
правая матрица документ: 128 * 10000
и хочу получить результат с размером матрицы 1 * 10000,
это демонстрационный код теста производительности
#include <iostream>
#include <Eigen/Eigen.h>
#include "mathlib/cos.h"
#include "eigen_timer.h"
using namespace Eigen;
using namespace std;
int main(int argc, char** argv) {
const uint32_t dim = 128;
const uint32_t doc_num = 100000;
cout << ">>>> Params:\n vec_dim[" << dim << \
"] vec_num[" << doc_num << "] >>>> Result:\n";
EigenTimer timer;
// generate matrix data
MatrixXf query = MatrixXf::Random(1, dim);
MatrixXf doc = MatrixXf::Random(dim, doc_num);
timer.restart();
// Eigen calc
const MatrixXf& res = query * doc; // multiplication
long time = timer.elapsed<std::chrono::nanoseconds>();
cout << " Eigen Time: " << time << "ns\n";
const float* query_s = query.data();
float* doc_s[doc_num];
for (int i = 0; i < doc_num; i++) {
doc_s[i] = doc.col(i).data();
}
// sse calc
timer.restart();
for (int i = 0; i < doc_num; i++) {
float a = mathlib::inner_product_sse_full(query_s, doc_s[i], dim);
}
time = timer.elapsed<std::chrono::nanoseconds>();
cout << " SSE Time: " << time << "ns\n";
return 0;
}
ниже флаг компиляции:
#Preprocessor flags.
CPPFLAGS(r'-D_GNU_SOURCE -D__STDC_LIMIT_MACROS -DNDEBUG -DEIGEN_DONT_PARALLELIZE -DEIGEN_DONT_VECTORIZE')
CPPFLAGS(r'-DVERSION=\"%s\"' % REPO_REVISION())
#C flags.
CFLAGS('-g -pipe -W -Wall -fPIC -msse3 -ldl -lutil -lssl -lcrypto -lpthread -finline-functions -mavx')
#C++ flags.
CXXFLAGS('-g -pipe -fPIC -O2 -std=gnu++11 -lpthread -lssl -lcrypto -ldl')
результат выполнения:
>>>> Params:
vec_dim[128] vec_num[100000] >>>> Result:
Eigen Time: 21126516ns
SSE Time: 8024619ns
Eigen использует SSE inner, но почему в моем демо Eigen в два раза медленнее SSE?
=====
ИЛИ ЖЕ:
Я хочу только получить (векторный * матричный) векторный результат:
- query_vec с размером [1 * 128]
- 1 Вт ad_vec Размер умной суммы [128 * 1 Вт]
Есть ли эффективный способ достичь с помощью Eigen igen