标签: matrix-multiplication

为什么MATLAB在矩阵乘法中如此之快?

我正在使用CUDA,C++,C#和Java进行一些基准测试,并使用MATLAB进行验证和矩阵生成.但是当我乘以MATLAB时,2048x2048甚至更大的矩阵几乎立即成倍增加.

             1024x1024   2048x2048   4096x4096
             ---------   ---------   ---------
CUDA C (ms)      43.11      391.05     3407.99
C++ (ms)       6137.10    64369.29   551390.93
C# (ms)       10509.00   300684.00  2527250.00
Java (ms)      9149.90    92562.28   838357.94
MATLAB (ms)      75.01      423.10     3133.90
Run Code Online (Sandbox Code Playgroud)

只有CUDA具有竞争力,但我认为至少C++会有点接近并且不会60x慢.

所以我的问题是 - MATLAB如何快速地完成它?

C++代码:

float temp = 0;
timer.start();
for(int j = 0; j < rozmer; j++)
{
    for (int k = 0; k < rozmer; k++)
    {
        temp = 0;
        for (int m = 0; m < rozmer; m++)
        {
            temp …
Run Code Online (Sandbox Code Playgroud)

performance matlab cuda matrix-multiplication

184
推荐指数
7
解决办法
5万
查看次数

Python中的'@ ='符号是什么?

我知道@是装饰器,但@=Python的用途是什么?这只是对未来想法的保留吗?

这只是我阅读时的众多问题之一tokenizer.py.

python operators matrix-multiplication python-3.x python-3.5

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

NumPy Matrix与Array类的乘法有何不同?

numpy文档建议使用数组而不是矩阵来处理矩阵.但是,与octave(我直到最近使用)不同,*不执行矩阵乘法,你需要使用函数matrixmultipy().我觉得这使得代码非常难以理解.

有人分享我的观点,并找到了解决方案吗?

python arrays numpy matrix matrix-multiplication

129
推荐指数
7
解决办法
23万
查看次数

为什么2048x2048与2047x2047阵列乘法相比会有巨大的性能损失?

我正在进行一些矩阵乘法基准测试,如前面提到的 为什么MATLAB在矩阵乘法中如此之快?

现在我有另一个问题,当乘以两个2048x2048矩阵时,C#和其他矩阵之间存在很大差异.当我尝试只乘2047x2047矩阵时,看起来很正常.还添加了一些其他的比较.

1024x1024 - 10秒.

1027x1027 - 10秒.

2047x2047 - 90秒.

2048x2048 - 300秒.

2049x2049 - 91秒.(更新)

2500x2500 - 166秒

对于2k×2k的情况,这是三分半钟的差异.

使用2dim数组

//Array init like this
int rozmer = 2048;
float[,] matice = new float[rozmer, rozmer];

//Main multiply code
for(int j = 0; j < rozmer; j++)
{
   for (int k = 0; k < rozmer; k++)
   {
     float temp = 0;
     for (int m = 0; m < rozmer; m++)
     {
       temp = temp + matice1[j,m] * matice2[m,k]; …
Run Code Online (Sandbox Code Playgroud)

c# arrays matrix-multiplication

127
推荐指数
5
解决办法
6473
查看次数

numpy dot()和Python 3.5+矩阵乘法之间的区别@

我最近转向Python 3.5并注意到新的矩阵乘法运算符(@)有时与numpy点运算符的行为不同.例如,对于3d数组:

import numpy as np

a = np.random.rand(8,13,13)
b = np.random.rand(8,13,13)
c = a @ b  # Python 3.5+
d = np.dot(a, b)
Run Code Online (Sandbox Code Playgroud)

@运算符返回形状的阵列:

c.shape
(8, 13, 13)
Run Code Online (Sandbox Code Playgroud)

np.dot()函数返回:

d.shape
(8, 13, 8, 13)
Run Code Online (Sandbox Code Playgroud)

如何用numpy dot重现相同的结果?还有其他重大差异吗?

python numpy matrix-multiplication python-3.5

94
推荐指数
5
解决办法
6万
查看次数

如何在numpy中获得元素矩阵乘法(Hadamard乘积)?

我有两个矩阵

a = np.matrix([[1,2], [3,4]])
b = np.matrix([[5,6], [7,8]])
Run Code Online (Sandbox Code Playgroud)

我希望得到元素明智的产品[[1*5,2*6], [3*7,4*8]],等于

[[5,12], [21,32]]

我试过了

print(np.dot(a,b)) 
Run Code Online (Sandbox Code Playgroud)

print(a*b)
Run Code Online (Sandbox Code Playgroud)

但两者都给出了结果

[[19 22], [43 50]]

这是基质产品,而不是元素产品.如何使用内置函数获取元素产品(又名Hadamard产品)?

python numpy matrix matrix-multiplication elementwise-operations

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

矩阵乘法:矩阵大小差异小,时序差异大

我有一个矩阵乘法代码,如下所示:

for(i = 0; i < dimension; i++)
    for(j = 0; j < dimension; j++)
        for(k = 0; k < dimension; k++)
            C[dimension*i+j] += A[dimension*i+k] * B[dimension*k+j];
Run Code Online (Sandbox Code Playgroud)

这里,矩阵的大小由表示dimension.现在,如果矩阵的大小是2000,运行这段代码需要147秒,而如果矩阵的大小是2048,则需要447秒.所以虽然差别没有.乘法是(2048*2048*2048)/(2000*2000*2000)= 1.073,时间上的差异是447/147 = 3.有人可以解释为什么会发生这种情况吗?我预计它会线性扩展,但这不会发生.我不是要尝试制作最快的矩阵乘法代码,只是试图理解它为什么会发生.

规格:AMD Opteron双核节点(2.2GHz),2G RAM,gcc v 4.5.0

程序编译为 gcc -O3 simple.c

我也在英特尔的icc编译器上运行了这个,并看到了类似的结果.

编辑:

正如评论/答案中所建议的那样,我运行了维度= 2060的代码,需要145秒.

继承完整的计划:

#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>

/* change dimension size as needed */
const int dimension = 2048;
struct timeval tv; 

double timestamp()
{
        double t;
        gettimeofday(&tv, NULL);
        t = tv.tv_sec + (tv.tv_usec/1000000.0); …
Run Code Online (Sandbox Code Playgroud)

c algorithm performance matrix-multiplication

74
推荐指数
5
解决办法
1万
查看次数

通过空矩阵乘法更快地初始化数组的方法?(Matlab的)

我偶然发现了Matlab处理空矩阵的奇怪方式(在我看来).例如,如果两个空矩阵相乘,则结果为:

zeros(3,0)*zeros(0,3)
ans =

 0     0     0
 0     0     0
 0     0     0
Run Code Online (Sandbox Code Playgroud)

现在,这已经让我感到惊讶,然而,快速搜索让我进入上面的链接,我得到了解释为什么会发生这种情况的一些扭曲的逻辑.

但是,没有任何事情让我为以下观察做好准备 我问自己,这种类型的乘法与使用zeros(n)函数的效率有多高,比如初始化的目的?我以前timeit回答这个问题:

f=@() zeros(1000)
timeit(f)
ans =
    0.0033
Run Code Online (Sandbox Code Playgroud)

VS:

g=@() zeros(1000,0)*zeros(0,1000)
timeit(g)
ans =
    9.2048e-06
Run Code Online (Sandbox Code Playgroud)

两者都有1000x1000类零的矩阵相同的结果double,但空矩阵乘法1的速度快〜350倍!(使用ticand toc和循环发生类似的结果)

怎么会这样?是timeit或是tic,toc虚张声势还是我找到了一种更快速的方法来初始化矩阵?(这是用matlab 2012a完成的,在win7-64机器上,intel-i5 650 3.2Ghz ...)

编辑:

在阅读了您的反馈之后,我更仔细地研究了这个特性,并在2台不同的计算机上进行了测试(同样的matlab ver,尽管2012a),这是一个检查运行时间与矩阵n大小的代码.这就是我得到的:

在此输入图像描述

生成此代码的代码与timeit之前一样使用,但循环使用tic并且toc看起来相同.因此,对于小尺寸,zeros(n)是可比的.然而,围绕n=400空矩阵乘法的性能有所提升.我用来生成该图的代码是:

n=unique(round(logspace(0,4,200)));
for k=1:length(n)
    f=@() zeros(n(k));
    t1(k)=timeit(f);

    g=@() zeros(n(k),0)*zeros(0,n(k));
    t2(k)=timeit(g);
end

loglog(n,t1,'b',n,t2,'r');
legend('zeros(n)','zeros(n,0)*zeros(0,n)',2);
xlabel('matrix size …
Run Code Online (Sandbox Code Playgroud)

performance matlab initialization matrix-multiplication

62
推荐指数
3
解决办法
4750
查看次数

CUDA确定每个块的线程数,每个网格块数

我是CUDA范例的新手.我的问题是确定每个块的线程数和每个网格的块数.有点艺术和试验吗?我发现很多例子都是为这些东西选择了看似随意的数字.

我正在考虑一个问题,我可以将矩阵 - 任何大小 - 传递给乘法方法.因此,C的每个元素(如在C = A*B中)将由单个线程计算.在这种情况下,您如何确定线程/块,块/网格?

cuda nvidia dimensions matrix-multiplication

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

什么是R的rbind和cbind的多维等价物?

在R中使用矩阵时,可以将它们并排放置或分别使用cbind和rbind将它们堆叠在一起.在其他维度堆叠矩阵或数组的等效函数是什么?

例如,下面创建一对2x2矩阵,每个矩阵有4个元素:

x = cbind(1:2,3:4)
y = cbind(5:6,7:8)
Run Code Online (Sandbox Code Playgroud)

将它们组合成具有8个元素的2x2x2数组的代码是什么?

r multidimensional-array matrix-multiplication

50
推荐指数
1
解决办法
1万
查看次数