Самый быстрый по столбцам расчет нормы L2 с Blaze - PullRequest
0 голосов
/ 26 марта 2019

У меня есть плотный DynamicMatrix в Blaze размером примерно 3000 x 300, для которого я должен вычислить L2-норму каждого столбца.

Для меньшего примера:

#include <blaze/Blaze.h>
using namespace blaze;

DynamicMatrix<double,columnMajor> A {{1, 2, 3}, 
                                     {4, 5, 6}, 
                                     {7, 8, 9}};

// desired output: ( 8.12404 9.64365 11.225 )

Однако у Blaze, похоже, нет "наиболее очевидного" способа сделать это, поскольку функции нормы не могут быть заданы по оси, по крайней мере, насколько я обнаружил.Какой самый эффективный способ выполнить этот расчет с Blaze?Могу ли я стать лучше, чем второй подход ниже?


Мои подходы

  1. Самый естественный для меня подход, вычисление нормы для каждого столбца:

    DynamicVector<double, rowVector> result(A.columns());
    for (size_t i = 0; i < result.size(); ++i)
        result2[i] = norm(column(A, i));
    
  2. Интересно, что это быстрее на моем входном размере, но все еще не правильно:

    DynamicVector<double, rowVector> result = sqrt(sum<columnwise>(A % A));
    

Я компилирую с GCC 8.3, -O3 -std=c++2a -fopenmp -mmmx -mavx -mavx2 -mfma.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...