Умножение собственной матрицы медленнее, чем сырое SSE - PullRequest
0 голосов
/ 27 июня 2018

Я использую 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

...