Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB中的矢量化是如何工作的?_Matlab_Openmp_Vectorization_Multicore - Fatal编程技术网

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的明确信息,只有一般性的建议。在我自己的用例中,我更喜欢将其

我想知道MATLAB如何处理矢量化运算

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被广泛采用
欲知更多详情,请参阅博客文章,评论可能非常有用。我要知道的主要一点是,在较新的版本中,“clean all”删除会话代码中的预编译。
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;