У меня есть массив 8-битных целых чисел, который я хочу обработать с помощью SIMD-инструкций.
Поскольку эти целые числа будут использоваться вместе с числами с плавающей запятой одинарной точности, я фактически хочу загрузить их в 32-битные полосы вместо более «естественные» 8-битные линии.
Предполагая AVX512, если у меня есть следующий массив:
Примечание. В качестве примера я использовал AVX512. В идеале мне нужна «универсальная» стратегия, которую можно абстрагировать от нескольких наборов инструкций, используя, например, Google Шоссе.
У меня есть массив 8-битных целых чисел, который я хочу обработать с помощью SIMD-инструкций. Поскольку эти целые числа будут использоваться вместе с числами с плавающей запятой одинарной точности, я фактически хочу загрузить их в 32-битные полосы вместо более «естественные» 8-битные линии. Предполагая AVX512, если у меня есть следующий массив: [code]std::array< std::uint8_t, 16 > i{ i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15 }; [/code] Я хочу получить регистр __m512i, заполненный следующими байтами: [code][ 0, 0, 0, i0, 0, 0, 0, i2, 0, 0, 0, i3, 0, 0, 0, i4, 0, 0, 0, i5, 0, 0, 0, i6, 0, 0, 0, i7, 0, 0, 0, i8, 0, 0, 0, i9, 0, 0, 0, i10, 0, 0, 0, i11, 0, 0, 0, i12, 0, 0, 0, i13, 0, 0, 0, i14, 0, 0, 0, i15 ] [/code] Как лучше всего этого добиться? В настоящее время я выполняю его, используя: [code]_mm512_set_epi32( a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]); [/code] Примечание. В качестве примера я использовал AVX512. В идеале мне нужна «универсальная» стратегия, которую можно абстрагировать от нескольких наборов инструкций, используя, например, Google Шоссе.