我正在使用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) 我知道@是装饰器,但@=Python的用途是什么?这只是对未来想法的保留吗?
这只是我阅读时的众多问题之一tokenizer.py.
python operators matrix-multiplication python-3.x python-3.5
numpy文档建议使用数组而不是矩阵来处理矩阵.但是,与octave(我直到最近使用)不同,*不执行矩阵乘法,你需要使用函数matrixmultipy().我觉得这使得代码非常难以理解.
有人分享我的观点,并找到了解决方案吗?
我正在进行一些矩阵乘法基准测试,如前面提到的 为什么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) 我最近转向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重现相同的结果?还有其他重大差异吗?
我有两个矩阵
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
我有一个矩阵乘法代码,如下所示:
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) 我偶然发现了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) 我是CUDA范例的新手.我的问题是确定每个块的线程数和每个网格的块数.有点艺术和试验吗?我发现很多例子都是为这些东西选择了看似随意的数字.
我正在考虑一个问题,我可以将矩阵 - 任何大小 - 传递给乘法方法.因此,C的每个元素(如在C = A*B中)将由单个线程计算.在这种情况下,您如何确定线程/块,块/网格?
在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数组的代码是什么?
python ×4
numpy ×3
performance ×3
arrays ×2
cuda ×2
matlab ×2
matrix ×2
python-3.5 ×2
algorithm ×1
c ×1
c# ×1
dimensions ×1
nvidia ×1
operators ×1
python-3.x ×1
r ×1