如何确定矢量长度以确保在矢量化过程中没有矢量依赖性?
How to determine vector length to ensure no vector dependency during vectorization?
对于像这个例子这样的情况
for (int i = 16; i < n; i++)
a[i] += a[i-16];
如何确定向量长度以确保可以对该循环进行向量化?
以下是正确的方法吗?
// Determine target cpu architecture's vector register bit-size
// E.g., Intel AVX-512 has 512-bit vector registers
int register_size = 512
// Modern machines are 8 bits
int byte_size = 8
// Determine array type size
int my_array[n];
auto array_type_size = sizeof(int) * byte_size // 4 bytes * 8 bits = 32 bits
// Divide register size by array type size
auto vector_length = register_size / array_type_size // = 16
这意味着在 Intel AVX-512 上对 int 类型的数组进行向量化会导致寄存器中的向量长度为 16,从而使上述示例可以安全地进行向量化。
这个方法对吗?如果是这样,有没有办法在这个架构上使用更短的向量?例如,强制使用长度为 4 的向量,以便可以对下面的示例进行向量化
for (int i = 4; i < n; i++)
a[i] += a[i-4];
英特尔提供一系列 SIMD 功能。您可以使用从 64 位 mmx 寄存器到 512 zmm 寄存器。您也可以很好地使用这些寄存器的下半部分:您可以使用 256 位 ymm,或者甚至使用 128 位 xmm 的别名下半部分。无论您的循环范围或大小如何,您的编译器都会在发布模式下尽可能多地矢量化循环。如果您想自己执行此操作,您可以编辑编译器标志或编写自己的程序集,以获得小但明显的速度提升。要“强制”编译器以某种方式向量化,将更改编译器标志以禁止使用 AVX-512,或者可能使用编译器在其文档中包含的一些预处理器指令。
不使用矢量化的整个寄存器没有固有问题。
对于像这个例子这样的情况
for (int i = 16; i < n; i++)
a[i] += a[i-16];
如何确定向量长度以确保可以对该循环进行向量化? 以下是正确的方法吗?
// Determine target cpu architecture's vector register bit-size
// E.g., Intel AVX-512 has 512-bit vector registers
int register_size = 512
// Modern machines are 8 bits
int byte_size = 8
// Determine array type size
int my_array[n];
auto array_type_size = sizeof(int) * byte_size // 4 bytes * 8 bits = 32 bits
// Divide register size by array type size
auto vector_length = register_size / array_type_size // = 16
这意味着在 Intel AVX-512 上对 int 类型的数组进行向量化会导致寄存器中的向量长度为 16,从而使上述示例可以安全地进行向量化。
这个方法对吗?如果是这样,有没有办法在这个架构上使用更短的向量?例如,强制使用长度为 4 的向量,以便可以对下面的示例进行向量化
for (int i = 4; i < n; i++)
a[i] += a[i-4];
英特尔提供一系列 SIMD 功能。您可以使用从 64 位 mmx 寄存器到 512 zmm 寄存器。您也可以很好地使用这些寄存器的下半部分:您可以使用 256 位 ymm,或者甚至使用 128 位 xmm 的别名下半部分。无论您的循环范围或大小如何,您的编译器都会在发布模式下尽可能多地矢量化循环。如果您想自己执行此操作,您可以编辑编译器标志或编写自己的程序集,以获得小但明显的速度提升。要“强制”编译器以某种方式向量化,将更改编译器标志以禁止使用 AVX-512,或者可能使用编译器在其文档中包含的一些预处理器指令。 不使用矢量化的整个寄存器没有固有问题。