SIMD вызов _mm_cmpeq_pi8 портит память

151
10 апреля 2022, 07:30

Код собирается с target AVX2, при разборе "хвоста" решил использовать __m64, в результате после использования _mm_cmpeq_pi8 переменная типа double приобретает значение nan, упрощённый пример кода:

__attribute__((target("avx2"),stdcall))
void test(std::vector<uint8_t> & v1, std::vector<uint8_t> & v2)
{
    double cmp = 0.0;
    // ...
    __m64 a1 = _mm_set_pi8(v1[i], v1[i + 1], v1[i + 2], v1[i + 3], ...);
    __m64 a2 = _mm_set_pi8(v2[i], v2[i + 1], v2[i + 2], v2[i + 3], ...);
    __m64 a3 = _mm_cmpeq_pi8(a1, a2);
    // после вызова _mm_cmpeq_pi8, cmp == nan
    uint32_t x = static_cast<uint32_t>(_mm_movemask_pi8(a3));
    cmp += ((x == 0xffffffffU) ? 0.1 : 0.0);
}

MMX инструкции не совместимы с AVX2? Вроде про это явно нигде не написано. Вопрос в том как это можно пофиксить, кроме как отказавшись от использования __m64.

эксперименты проводились на камне CoffeeLake

Answer 1

При переходе от MMX к floating point необходимо выполнить команду EMMS, или _mm_empty() intrinsic.

https://www.felixcloutier.com/x86/emms

READ ALSO
Задача на массивы

Задача на массивы

Задача CПохожие массивы (Время: 1 сек

141
Что означает запись using TasksInfo = map&lt;TaskStatus, int&gt;?

Что означает запись using TasksInfo = map<TaskStatus, int>?

Не могу найти нормальных примеров использование using наименование =

181
Как плавно проскролить страницу вниз до опреденного элемента?

Как плавно проскролить страницу вниз до опреденного элемента?

Есть у меня следующий код, который должен плавно скролить страницу вниз до опреденного элементаНо не могу понять, почему он не работает, где...

222