Проблемы с _mm_i32gather_ps

Я вручную оптимизирую некоторый код, используя инструкции AVX. В какой-то момент я хочу собрать несколько чисел с плавающей запятой из (невыровненного) массива с помощью _mm_i32gather_ps(), потому что они лежат в случайных позициях (не смежные).

Тем не менее я не получаю ожидаемых значений. Я проверил индекс (что правильно), и даже когда я жестко запрограммировал значения в индексе, например

idx = _mm256_set_epi32(100,101,102,103,104,105,106,107);
values = _mm256_i32gather_ps(array,idx,1);

Я не получаю ожидаемых значений.

Насколько я знаю, нет необходимости ни в выравнивании массива, ни в доступе к массиву. Кто-нибудь видит, что я могу делать неправильно?

Спасибо


person gramuc    schedule 08.10.2015    source источник
comment
Вероятно, вам нужна шкала 4, а не 1.   -  person Jester    schedule 08.10.2015
comment
Как говорит @Jester, индексы представляют собой смещения byte, поэтому вам нужно умножить их на sizeof(float), т.е. передать 4 для scale. См. этот вопрос.   -  person Paul R    schedule 08.10.2015
comment
Идеальный ответ. Спасибо!   -  person gramuc    schedule 09.10.2015
comment
Этот ответ просто сэкономил мне время и горе. Я полностью упустил из виду масштаб должен быть 1, 2, 4 или 8 в документации Intel и вместо этого обратил внимание на их (псевдо?) код dst[i+31:i] := MEM[base_addr + SignExtend(vindex[i+31:i])*scale], который очень легко вводит в заблуждение, поскольку в нем отсутствует *8 после scale и < b>все другие методы доступа к массиву в этом операторе используют битовые смещения. В результате моего непонимания я попытался использовать 32 в качестве аргумента масштаба, но это привело к этой ошибке в MSVC: недопустимый аргумент для встроенной функции, параметр 2. Вместо этого использование 4 работает отлично.   -  person M-Pixel    schedule 02.10.2018