Как определить длину вектора, чтобы гарантировать отсутствие векторной зависимости во время векторизации? - PullRequest
0 голосов
/ 02 марта 2020

Для таких случаев, как этот пример

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];

1 Ответ

0 голосов
/ 02 марта 2020

Intel предоставляет широкий спектр функций SIMD. Вы можете использовать от 64-битных регистров mmx до регистров 512 zmm. Вы также можете просто использовать нижние половины этих регистров: вы можете использовать 256-битный ymm или даже псевдоним с нижней половиной и использовать 128-битный xmm. Ваш компилятор в режиме релиза будет векторизовать все oop, насколько это возможно, независимо от вашего диапазона или размера l oop. Если вы хотите сделать это самостоятельно, вы можете отредактировать флаги компилятора или написать собственную сборку для небольшого, но заметного увеличения скорости. Чтобы «заставить» компилятор векторизовать определенным образом, нужно изменить флаги компилятора, чтобы запретить использование AVX-512, или, возможно, использовать некоторые директивы препроцессора, которые ваш компилятор будет иметь в своей документации. Нет проблем, связанных с неиспользованием всего регистра с векторизацией.

...