Как увеличить вектор в AVX/AVX2


Я хочу использовать встроенные функции для увеличения элементов вектора SIMD. Самый простой способ, кажется, состоит в том, чтобы добавить 1 к каждому элементу, например:

(Примечание: vec_inc было установлено в 1 раньше)

vec = _mm256_add_epi16 (vec, vec_inc);
Но существует ли какая-либо специальная инструкция для увеличения вектора? Как inc в этой странице ? Или любым другим более простым способом ?
1 5

1 ответ:

Инструкция INC не является инструкцией уровня SIMD, она работает на целочисленных скалярах. Как вы с Полом уже предлагали, самый простой способ-добавить 1 к каждому элементу вектора, что можно сделать, добавив вектор 1s.

Если вы хотите смоделировать внутреннюю функцию, вы можете реализовать свою собственную функцию:

inline __m256i _mm256_inc_epi16(__m256i a)
{
    return _mm256_add_epi16(a, _mm256_set1_epi16(1));
}

Для подобных вопросов по встроенным устройствам x86 в будущем вы можете найти коллекцию встроенных устройств Intel ISA в руководстве по встроенным устройствам Intel. Также смотрите обширные ресурсы, задокументированные под тегами x86 и sse: