代码可能有哪些不同的方式 'vectorized'?
What are the various ways code may be 'vectorized'?
我通常通过以下两种方式之一听到术语向量化函数:
- 在非常高级的语言中,当数据一次性(或至少以大块形式)传递到以更快的方式进行计算的低级库时。例如 python 将
numpy
用于 array/LA-related 内容。
- 在最低级别,当使用大量使用它们的特定机器指令或过程(例如 YMM、ZMM、XMM 寄存器指令)时。
然而,这个术语似乎被广泛传播,我想知道是否有第三种(或更多)使用它的方式。例如,这只是将多个值传递给函数而不是一个(通常通过数组完成)例如:
// non-'vectorized'
#include <stdio.h>
int squared(int num) {
return num*num;
}
int main(void) {
int nums[] = {1,2,3,4,5};
for (int i=0; i < sizeof(nums)/sizeof(*nums); i++) {
int n_squared = squared(nums[i]);
printf("%d^2 = %d\n", nums[i], n_squared);
}
}
// 'vectorized'
#include <stdio.h>
void squared(int num[], int size) {
for (int i=0; i<size; i++) {
*(num +i) = num[i] * num[i];
}
}
int main(void) {
int nums[] = {1,2,3,4,5};
squared(nums, sizeof(nums)/sizeof(*nums));
for (int i=0; i < sizeof(nums)/sizeof(*nums); i++) {
printf("Squared=%d\n", nums[i]);
}
}
以上是否考虑'vectorized code'?是否有更多 formal/better 定义是什么使某些东西矢量化或不矢量化?
在您所指的上下文中,矢量化代码通常表示“碰巧使用单指令多数据 (SIMD) 硬件指令的实现”。
这有时可能意味着有人手动编写了一个等同于规范版本的函数版本,但碰巧使用了 SIMD。通常,这是编译器在其优化过程中所做的事情。
In a very high-level language when the data is passed all-at-once (or at least, in bulk chunks) to a lower-level library that does the calculations in faster way. An example of this would be python's use of numpy for array/LA-related stuff.
这是不正确的。将大量数据传递给快速通过它的某个代码块的过程本身并不是矢量化。
你可以说“既然我的代码使用了 numpy,它就被矢量化了”并且有点正确,但只是传递性的。更好的表达方式是“现在我的代码使用了 numpy,它运行得更快,因为 numpy 在底层被矢量化了。”。但重要的是,并非所有同时传递大量数据的快速库都是矢量化的。
...Code examples...
由于在这两个示例中都看不到 SIMD 指令,因此它们都未被向量化 。第二个版本更有可能导致矢量化程序,这可能是真的。如果是这样,那么我们可以说该程序比第一个程序更 可向量化。但是,在编译器将其矢量化之前,程序不会矢量化。
我通常通过以下两种方式之一听到术语向量化函数:
- 在非常高级的语言中,当数据一次性(或至少以大块形式)传递到以更快的方式进行计算的低级库时。例如 python 将
numpy
用于 array/LA-related 内容。 - 在最低级别,当使用大量使用它们的特定机器指令或过程(例如 YMM、ZMM、XMM 寄存器指令)时。
然而,这个术语似乎被广泛传播,我想知道是否有第三种(或更多)使用它的方式。例如,这只是将多个值传递给函数而不是一个(通常通过数组完成)例如:
// non-'vectorized'
#include <stdio.h>
int squared(int num) {
return num*num;
}
int main(void) {
int nums[] = {1,2,3,4,5};
for (int i=0; i < sizeof(nums)/sizeof(*nums); i++) {
int n_squared = squared(nums[i]);
printf("%d^2 = %d\n", nums[i], n_squared);
}
}
// 'vectorized'
#include <stdio.h>
void squared(int num[], int size) {
for (int i=0; i<size; i++) {
*(num +i) = num[i] * num[i];
}
}
int main(void) {
int nums[] = {1,2,3,4,5};
squared(nums, sizeof(nums)/sizeof(*nums));
for (int i=0; i < sizeof(nums)/sizeof(*nums); i++) {
printf("Squared=%d\n", nums[i]);
}
}
以上是否考虑'vectorized code'?是否有更多 formal/better 定义是什么使某些东西矢量化或不矢量化?
在您所指的上下文中,矢量化代码通常表示“碰巧使用单指令多数据 (SIMD) 硬件指令的实现”。
这有时可能意味着有人手动编写了一个等同于规范版本的函数版本,但碰巧使用了 SIMD。通常,这是编译器在其优化过程中所做的事情。
In a very high-level language when the data is passed all-at-once (or at least, in bulk chunks) to a lower-level library that does the calculations in faster way. An example of this would be python's use of numpy for array/LA-related stuff.
这是不正确的。将大量数据传递给快速通过它的某个代码块的过程本身并不是矢量化。
你可以说“既然我的代码使用了 numpy,它就被矢量化了”并且有点正确,但只是传递性的。更好的表达方式是“现在我的代码使用了 numpy,它运行得更快,因为 numpy 在底层被矢量化了。”。但重要的是,并非所有同时传递大量数据的快速库都是矢量化的。
...Code examples...
由于在这两个示例中都看不到 SIMD 指令,因此它们都未被向量化 。第二个版本更有可能导致矢量化程序,这可能是真的。如果是这样,那么我们可以说该程序比第一个程序更 可向量化。但是,在编译器将其矢量化之前,程序不会矢量化。