小编NUL*_*ULL的帖子

为什么通过浮点矩阵乘法执行浮点比使用int int更快?

有两个int矩阵A和B,超过1000行和10K列,我经常需要将它们转换为float矩阵以获得加速(4x或更多).

我想知道为什么会这样?我意识到有许多优化和矢量化,如AVX等,继续浮点矩阵乘法.但是,对于整数(如果我没有记错的话),有指令如AVX2.并且,不能使用SSE和AVX作为整数?

为什么在矩阵代数库(如Numpy或Eigen)下面没有启发式来捕获它并像浮点一样更快地执行整数矩阵乘法?

关于已接受的答案:虽然@ sascha的答案非常有用且相关,@ chatz的答案是int乘以int的实际原因,无论是否存在BLAS整数矩阵运算.

c++ numpy matrix eigen

25
推荐指数
2
解决办法
1814
查看次数

通过Cython将C++向量传递给Numpy,无需复制并自动处理内存管理

处理大型矩阵(NxM,1K <= N <= 20K&10K <= M <= 200K),我经常需要通过Cython将Numpy矩阵传递给C++来完成工作,这可以按预期工作而无需复制.

但是,有时我需要在C++中启动和预处理矩阵并将其传递给Numpy(Python 3.6).让我们假设矩阵是线性化的(因此大小为N*M,它是一维矩阵 - col/row major在这里无关紧要).根据这里的信息:在没有数据副本的情况下在Python中公开C计算数组并修改它以实现C++兼容性,我能够传递C++数组.

问题是如果我想使用标准向量而不是启动数组,我会得到分段错误.例如,考虑以下文件:

fast.h

#include <iostream>
#include <vector>

using std::cout; using std::endl; using std::vector;
int* doit(int length);
Run Code Online (Sandbox Code Playgroud)

fast.cpp

#include "fast.h"
int* doit(int length) {
    // Something really heavy
    cout << "C++: doing it fast " << endl; 

    vector<int> WhyNot;

    // Heavy stuff - like reading a big file and preprocessing it
    for(int i=0; i<length; ++i)
        WhyNot.push_back(i); // heavy stuff

    cout << "C++: …
Run Code Online (Sandbox Code Playgroud)

c++ python numpy cython

12
推荐指数
2
解决办法
2841
查看次数

使用按位AND和popcount而不是实际int或float的大(0,1)矩阵乘法?

对于乘法大二进制矩阵(10Kx20K),我通常要做的是将矩阵转换为浮点数并执行浮点矩阵乘法,因为整数矩阵乘法非常慢(请看这里).

但这一次,我需要执行超过数十万次这样的乘法运算,甚至平均事情上的毫秒级性能提升.


我想要一个intfloat矩阵作为结果,因为产品可能有非0或1的元素.输入矩阵元素都是0或1,因此它们可以存储为单个位.

在行向量和列向量之间的内积中(为了产生输出矩阵的一个元素),乘法简化为按位AND.添加仍然是添加,但我们可以添加具有填充计数功能的位,而不是单独循环它们.

一些其他布尔/二进制矩阵函数或位而不是计数它们,产生位矩阵结果,但这不是我需要的.


下面是一个示例代码,显示将问题形成为std::bitset, AND并且count操作比矩阵乘法更快.

#include <iostream>
using std::cout; using std::endl;
#include <vector>
    using std::vector;
#include <chrono>
#include <Eigen/Dense>
    using Eigen::Map; using Eigen::Matrix; using Eigen::MatrixXf;
#include <random>
    using std::random_device; using std::mt19937; using std::uniform_int_distribution;
#include <bitset>
    using std::bitset;

using std::floor;

const int NROW = 1000;
const int NCOL = 20000;

const float DENSITY = 0.4;
const float DENOMINATOR = 10.0 - (10*DENSITY);

void fill_random(vector<float>& vec) { …
Run Code Online (Sandbox Code Playgroud)

c++ sse avx bitset matrix-multiplication

8
推荐指数
1
解决办法
1145
查看次数

标签 统计

c++ ×3

numpy ×2

avx ×1

bitset ×1

cython ×1

eigen ×1

matrix ×1

matrix-multiplication ×1

python ×1

sse ×1