Умножение матриц с векторизацией в c ++ - PullRequest
0 голосов
/ 11 июля 2019

Мне нужно умножить, а затем добавить матрицы AxB + C. Есть ли способ сделать эту операцию в c ++, чтобы векторизация применялась, а матрицы умножались и добавлялись быстрее? Если для этого есть ссылка или код, было бы неплохо. Кроме того, мне нужно что-то изменить, чтобы включить векторизацию.

Заранее спасибо

EDIT:

//g++ -I/path/to/eigen -O3 -DEIGEN_NO_DEBUG -fopenmp new.cpp
// ./a.out
#pragma GCC optimize("O3","unroll-loops","omit-frame-pointer","inline") //Optimization flags
#pragma GCC option("arch=native","tune=native","no-zero-upper") //Enable AVX
#pragma GCC target("avx")  //Enable AVX
#include <x86intrin.h> //AVX/SSE Extensions
#include <bits/stdc++.h> //All main STD libraries
#include <iostream>
#include <chrono>
#include <Eigen/Dense>
#include <unsupported/Eigen/FFT>

using namespace Eigen;
int main()
{
//    Matrix2d mat;
//    mat << 1, 2,
//            3, 4;
//    mat= MatrixXd::Random(3000,3000);
//    Vector2d u(-1,1), v(2,0);
//    Matrix2d m1;
//    auto start = std::chrono::steady_clock::now();
//
//    m1 << mat*mat;
//    auto end = std::chrono::steady_clock::now();
//    std::cout << "Elapsed time in nanoseconds : "
//         << std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count()
//         << " ns" ;
//    std::cout << "Here is mat*mat:\n" << mat*mat << std::endl;
//    std::cout << "Here is mat*u:\n" << mat*u << std::endl;
//    std::cout << "Here is u^T*mat:\n" << u.transpose()*mat << std::endl;
//    std::cout << "Here is u^T*v:\n" << u.transpose()*v << std::endl;
//    std::cout << "Here is u*v^T:\n" << u*v.transpose() << std::endl;
//    std::cout << "Let's multiply mat by itself" << std::endl;
//    mat = mat*mat;
//    std::cout << "Now mat is mat:\n" << mat << std::endl;


//    mat << 1, 2,
//            3, 4;
    MatrixXf m1 = MatrixXf::Random(32,32);
    MatrixXf m2 = MatrixXf::Random(32,32);
    MatrixXf newM;
    auto start = std::chrono::steady_clock::now();
    newM=m1*m2;
    auto end = std::chrono::steady_clock::now();
    std::cout << "Elapsed time in nanoseconds : "
         << std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count()
         << " ns" ;

    MatrixXf a = MatrixXf::Random(1, 32);
    MatrixXf b = MatrixXf::Random(32, 32);
    MatrixXf c = MatrixXf::Random(32, 1);
    time_t start1 = clock();
     start = std::chrono::steady_clock::now();
    MatrixXf d = a * b * c;
    end = std::chrono::steady_clock::now();
    std::cout << "Elapsed time in nanoseconds : "
              << std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count()
              << " ns" ;
    std::cout << (double)(clock() - start1) / CLOCKS_PER_SEC * 1000 << "ms" << std::endl;


    const int ROWS = 32;
    const int COLS = 32;
    int random_matrix[ROWS][COLS];
    int i;
    int j;
    /* initialize random seed: */
    srand(static_cast<unsigned>(time(0)));
    /* generate number: */
    for (i=0;i<ROWS;i++)
    {
        for (j=0;j<COLS;j++)
            random_matrix[i][j]= rand() % 100;
//        std::cout << random_matrix[i][j] << std::endl; //display table
    }

    int  mult[10][10], r1, c1, r2, c2, k;
    r1=32*32;
    c2=32*32;
    c1=32*32;
    start = std::chrono::steady_clock::now();
    start1 = clock();
    for(i = 0; i < r1; ++i)
        for(j = 0; j < c2; ++j)
        {
            mult[i][j]=0;
        }
    for(i = 0; i < r1; ++i)
        for(j = 0; j < c2; ++j)
            for(k = 0; k < c1; ++k)
            {
//                std::cout << "Elapsed time in nanoseconds : "
//                          << std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count()
//                          << " ns" ;
                mult[i][j] += random_matrix[i][k] * random_matrix[k][j]* random_matrix[k][j];
            }
    end = std::chrono::steady_clock::now();
    double end1=clock() - start1;
    std::cout << "Elapsed time in nanoseconds : "
              << std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count()
              << " ns" ;

    std::cout << (double)(end1) / CLOCKS_PER_SEC * 1000 << "ms" << std::endl;
    return 0;


...