现在,我已经在matlab,fortran中遇到过这个术语好几次了。其他的..。但是我从来没有找到一个解释它是什么意思,它是做什么的?所以我在这里问,什么是矢量化,它是什么意思,例如,“循环是矢量化的”?
发布于 2009-09-14 15:13:44
矢量化是将标量程序转换为矢量程序的术语。矢量化程序可以从一条指令运行多个操作,而标量一次只能对操作数对进行操作。
标量方法:
for (i = 0; i < 1024; i++)
{
C[i] = A[i]*B[i];
}
矢量化方法:
for (i = 0; i < 1024; i+=4)
{
C[i:i+3] = A[i:i+3]*B[i:i+3];
}
发布于 2009-09-14 15:09:02
它指的是在单个步骤中对数字列表或“向量”执行单个数学运算的能力。你经常会在Fortran中看到它,因为它与科学计算有关,而科学计算与超级计算有关,向量化算术最早出现在超级计算中。如今,几乎所有的桌面CPU都通过像Intel的SSE这样的技术提供某种形式的矢量化算法。GPU还提供了一种矢量化算法。
发布于 2018-12-21 01:05:16
简单地说,矢量化意味着优化算法,以便它可以在处理器中利用SIMD指令。
AVX、AVX2和AVX512是在一条指令中对多个数据执行相同操作的指令集(英特尔)。例如。AVX512表示一次可以操作16个整数值(4个字节)。这意味着,如果你有16个整数的向量,你想把每个整数的值加倍,然后再加上10。您可以将值加载到通用寄存器a、b、c 16次并执行相同的操作,也可以通过将所有16个值加载到SIMD寄存器xmm、ymm并执行一次操作来执行相同的操作。这可以加快矢量数据的计算速度。
在矢量化中,我们利用这一点作为我们的优势,通过重塑我们的数据,以便我们可以对其执行SIMD操作,并加快程序速度。
矢量化唯一的问题是处理条件。因为条件是执行流程的分支。这可以通过屏蔽来处理。通过将条件建模为算术运算。例如:如果我们想在value上加10,如果它大于100。我们两个都可以。
if(x[i] > 100) x[i] += 10; // this will branch execution flow.
或者我们可以将条件建模为创建条件向量c的算术运算,
c[i] = x[i] > 100; // storing the condition on masking vector
x[i] = x[i] + (c[i] & 10) // using mask
这是一个非常琐碎的例子。因此,c是我们的掩蔽向量,我们使用它来根据它的值执行二进制操作。这避免了执行流的分支,并实现了矢量化。
向量化和并行化一样重要。因此,我们应该尽可能地利用它。所有现代处理器都有针对繁重计算工作负载的SIMD指令。我们可以使用矢量化来优化我们的代码以使用这些SIMD指令,这类似于将我们的代码并行化以在现代处理器上可用的多个内核上运行。
最后我想提一下OpenMP,它可以让你使用编译指示向量化代码。我认为这是一个很好的起点。OpenACC也是如此。
https://stackoverflow.com/questions/1422149
复制相似问题