Для таких случаев, как этот пример
for (int i = 16; i < n; i++)
a[i] += a[i-16];
Как определить длину вектора, чтобы убедиться, что этот l oop может быть векторизован? Является ли следующий метод правильным?
// 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
Это будет означать, что векторизация массивов типа int на Intel AVX-512 приведет к появлению векторов в регистре длины 16, что сделает приведенный выше пример безопасным для векторизации.
Является ли этот метод правильным? Если да, есть ли способ использовать более короткие векторы в этой архитектуре? например, принудительно задать вектор длины 4, чтобы приведенный ниже пример можно было векторизовать
for (int i = 4; i < n; i++)
a[i] += a[i-4];