相关疑难解决方法(0)

基准测试(python与使用BLAS的c ++)和(numpy)

我想编写一个广泛使用BLAS和LAPACK线性代数功能的程序.由于性能是一个问题,我做了一些基准测试,并想知道,如果我采取的方法是合法的.

可以说,我有三位参赛者,他们希望用简单的矩阵矩阵乘法来测试他们的表现.参赛者是:

  1. Numpy,仅使用其功能dot.
  2. Python,通过共享对象调用BLAS功能.
  3. C++,通过共享对象调用BLAS功能.

脚本

我为不同的维度实现了矩阵 - 矩阵乘法i.i为5的增量和matricies运行5-500 m1m2设置了这样的:

m1 = numpy.random.rand(i,i).astype(numpy.float32)
m2 = numpy.random.rand(i,i).astype(numpy.float32)
Run Code Online (Sandbox Code Playgroud)

Numpy

使用的代码如下所示:

tNumpy = timeit.Timer("numpy.dot(m1, m2)", "import numpy; from __main__ import m1, m2")
rNumpy.append((i, tNumpy.repeat(20, 1)))
Run Code Online (Sandbox Code Playgroud)

2. Python,通过共享对象调用BLAS

有了这个功能

_blaslib = ctypes.cdll.LoadLibrary("libblas.so")
def Mul(m1, m2, i, r):

    no_trans = c_char("n")
    n = c_int(i)
    one = c_float(1.0)
    zero = c_float(0.0)

    _blaslib.sgemm_(byref(no_trans), byref(no_trans), byref(n), byref(n), byref(n), 
            byref(one), m1.ctypes.data_as(ctypes.c_void_p), byref(n), 
            m2.ctypes.data_as(ctypes.c_void_p), byref(n), byref(zero), 
            r.ctypes.data_as(ctypes.c_void_p), byref(n))
Run Code Online (Sandbox Code Playgroud)

测试代码如下所示:

r = …
Run Code Online (Sandbox Code Playgroud)

c++ python benchmarking numpy blas

105
推荐指数
4
解决办法
4万
查看次数

为什么NumPy阵列如此之快?

我刚刚改变了一个我正在编写的程序,将我的数据保存为numpy数组,因为我遇到了性能问题,而且差别很大.它最初运行需要30分钟,现在需要2.5秒!

我想知道它是如何做到的.我认为是因为它消除了对for循环的需要但超出了我的难度.

python arrays numpy

53
推荐指数
3
解决办法
3万
查看次数

为什么天真的C++矩阵乘法比BLAS慢100倍?

我正在研究大型矩阵乘法并运行以下实验来形成基线测试:

  1. 从std normal(0 mean,1 stddev)随机生成两个4096x4096矩阵X,Y.
  2. Z = X*Y.
  3. Z的Sum元素(以确保它们被访问)和输出.

这是天真的C++实现:

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    constexpr size_t dim = 4096;

    float* x = new float[dim*dim];
    float* y = new float[dim*dim];
    float* z = new float[dim*dim];

    random_device rd;
    mt19937 gen(rd());
    normal_distribution<float> dist(0, 1);

    for (size_t i = 0; i < dim*dim; i++)
    {
        x[i] = dist(gen);
        y[i] = dist(gen);
    }

    for (size_t row = 0; row < dim; row++)
        for (size_t col = 0; col < …
Run Code Online (Sandbox Code Playgroud)

c++ linux matlab matrix-multiplication c++11

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

数组索引从数字0开始

是否有可能在索引不是零的情况下启动一个数组... IE你有一个数组a [35],35个元素,现在我想索引说起始100,所以数字将是[100],a [101],...... a [134],这可能吗?

我正在尝试为一块电路板生成一个"存储器映射",我将有一个名为SRAM [10000]的阵列和另一个名为BRAM [5000]的阵列,但在"内存"可视性中它们是连续的,IE BRAM在SRAM之后立即启动,因此如果我尝试指向内存位置11000,我会读它看到它超过10000然后将它传递给bram.

打字时我意识到我可以假设然后从数字中减去10K并将其传递给BRAM,但为了争论,这是否可以将11000传递给BRAM?

感谢您的任何帮助.

更新以修复a [34]到[134]

更新了更多信息:在我将要实现的实际架构中,sram和bram之间可能存在差异,例如地址11008可能在内存映射中不可见,因此编写一个充满内存的巨型数组然后"分区"它会起作用,但我仍然需要做逻辑来确定它是否在"sram和bram"的范围内.这首先是我想要避免的.

c c++ arrays

9
推荐指数
5
解决办法
2万
查看次数

标签 统计

c++ ×3

arrays ×2

numpy ×2

python ×2

benchmarking ×1

blas ×1

c ×1

c++11 ×1

linux ×1

matlab ×1

matrix-multiplication ×1