Я вручную оптимизирую некоторый код, используя инструкции AVX. В какой-то момент я хочу собрать несколько чисел с плавающей запятой из (невыровненного) массива с помощью _mm_i32gather_ps(), потому что они лежат в случайных позициях (не смежные).
Тем не менее я не получаю ожидаемых значений. Я проверил индекс (что правильно), и даже когда я жестко запрограммировал значения в индексе, например
idx = _mm256_set_epi32(100,101,102,103,104,105,106,107);
values = _mm256_i32gather_ps(array,idx,1);
Я не получаю ожидаемых значений.
Насколько я знаю, нет необходимости ни в выравнивании массива, ни в доступе к массиву. Кто-нибудь видит, что я могу делать неправильно?
Спасибо
sizeof(float)
, т.е. передать 4 дляscale
. См. этот вопрос. - person Paul R   schedule 08.10.2015dst[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