MATLAB中的矢量化是如何工作的?
我想知道MATLAB如何处理矢量化运算MATLAB中的矢量化是如何工作的?,matlab,openmp,vectorization,multicore,Matlab,Openmp,Vectorization,Multicore,我想知道MATLAB如何处理矢量化运算 Data1 = fread(fin1, 10e6, 'uint8'); Data2 = fread(fin2, 10e6, 'uint8'); DiffA = diff(Data1); DiffB = diff(Data2); MATLAB是否使用一种SIMD并行性来执行此代码?它是使用向量处理器(如GPU)还是仅使用系统内核(在多核系统中)?MATLAB使用JIT加速计算。我没有发现关于JIT的明确信息,只有一般性的建议。在我自己的用例中,我更喜欢将其
Data1 = fread(fin1, 10e6, 'uint8');
Data2 = fread(fin2, 10e6, 'uint8');
DiffA = diff(Data1);
DiffB = diff(Data2);
MATLAB是否使用一种SIMD并行性来执行此代码?它是使用向量处理器(如GPU)还是仅使用系统内核(在多核系统中)?MATLAB使用JIT加速计算。我没有发现关于JIT的明确信息,只有一般性的建议。在我自己的用例中,我更喜欢将其视为javajit,因为优化技术非常匹配。 MATLAB在提高性能方面已经完成了4个主要步骤:
- R13(2002)引入了JIT
- 在R2006b中,引入了不带临时存储的就地计算,请参见文档的详细信息
- 在R2007a中引入了多线程(在引擎中,而不是在并行工具箱中),在R2008中被广泛采用
- 在R2016中引入了新的发动机,JIT被广泛采用
Yair Altman JIT并写了一篇关于MATLAB性能的完美文章。关于MATLAB JIT的guts和用法的一些详细信息可用。关于性能的介绍,我建议从开始,首先考虑C而不是MATLAB,因为I)C更接近机器,ii)MATLAB是用C编写的(至少,大多数语言执行引擎,以及几乎所有的数字代码都是用C语言编写的——目前桌面主要基于Java,但这与本文无关) 如果在C中有一个循环,比如
for (i = 0; i < 1024; i++)
{
C[i] = A[i]*B[i];
}
在这种情况下,将同时进行四次添加。这是一个简单的矢量化C代码示例,通过部分展开循环
需要注意的是,您不必在C代码中显式地执行此操作,因为您的C编译器非常聪明。它会注意到您的代码中可以矢量化的部分,并在编译之前为您重写这些部分。编译器在这方面做得非常好,但它无法提取所有内容,如果您了解一些关于向量化在CPU中的工作方式,您可以通过以特定方式构造代码来给出编译器提示,并且可以显式地告诉编译器执行特定的操作
还要注意,这种矢量化虽然是一种简单的并行形式,但即使在单核CPU上也可以使用(只要是矢量处理器,大多数现代CPU都是矢量处理器)。并行性发生在CPU的寄存器级别,通过使用同一条指令同时对多个数据位进行操作。在多核CPU或GPU的内核之间也存在其他形式的并行性
现在回到MATLAB——MATLAB实现了几种形式的并行,包括多线程、跨内核和集群的显式并行,以及GPU并行(其中一些需要诸如并行计算工具箱之类的附加产品)但在其核心,MATLAB实现了一组高度优化、高度矢量化的C例程,用于数值处理和线性代数
与C不同,MATLAB不是一种编译语言——它是通过JIT编译器进行解释的。但它仍在查看您的代码,并试图找到可以用于快速执行的优化。如果您以特定方式编写代码,您可以帮助MATLAB选择如何以最佳方式执行它
例如,代码
a = rand(3,4);
b = rand(4,2);
c = zeros(size(a,1),size(b,2));
for i = 1:size(a,1)
for j = 1:size(b,2)
element = 0;
for k = 1:size(a,2)
element = element + a(i,k).*b(k,j);
end
c(i,j) = element;
end
end
与
a = rand(3,4);
b = rand(4,2);
d = a*b;
但在后一种情况下,MATLAB知道它可以调用一个超级优化的库进行矩阵乘法,而不是一个一个地乘法和累加元素。这是一个向量化MATLAB代码的简单示例。我关心的不是提高MATLAB的性能。我想知道它的并行性级别rks?您可能知道并行处理的主要分类。主要有三类:1)消息传递(网络)2)使用openMP等多核3)使用CUDAIf等多核,仅使用隐式并行(即不编写显式并行或面向GPU的代码)由于r2016a MATLAB引擎可以自动执行多核多线程,并使用CPU级SIMD优化,并且使用寄存器/堆栈而不是堆,特别是在m文件调用时,在命令窗口提示下效率不高。如果您没有明确告诉MATLAB使用GPU或网络计算,它就不会使用GPU或网络计算。然而,引擎是专有代码,它的确切行为从未发布过。我真的建议你阅读奥特曼的书,它讨论了许多引擎的细节。
a = rand(3,4);
b = rand(4,2);
d = a*b;