У меня есть array
под названием A
, который содержит 32 unsigned char
значения.
Я хочу распаковать эти значения в 4 __m256
переменных с помощью этого правила, предполагая, что у нас есть индекс от 0 до 31 относительно всех значений из A
, распакованные 4 переменные будут иметь следующие значения:
B_0 = A[0], A[4], A[8], A[12], A[16], A[20], A[24], A[28]
B_1 = A[1], A[5], A[9], A[13], A[17], A[21], A[25], A[29]
B_2 = A[2], A[6], A[10], A[14], A[18], A[22], A[26], A[30]
B_3 = A[3], A[7], A[11], A[15], A[19], A[23], A[27], A[31]
Для этого у меня есть этот код:
const auto mask = _mm256_set1_epi32( 0x000000FF );
...
const auto A_values = _mm256_i32gather_epi32(reinterpret_cast<const int*>(A.data(), A_positions.values_, 4);
// This code bellow is equivalent to B_0 = static_cast<float>((A_value >> 24) & 0x000000FF)
const auto B_0 = _mm256_cvtepi32_ps(_mm256_and_si256(_mm256_srai_epi32(A_values, 24), mask));
const auto B_1 = _mm256_cvtepi32_ps(_mm256_and_si256(_mm256_srai_epi32(A_values, 16), mask));
const auto B_2 = _mm256_cvtepi32_ps(_mm256_and_si256(_mm256_srai_epi32(A_values, 8), mask));
const auto B_3 = _mm256_cvtepi32_ps(_mm256_and_si256(_mm256_srai_epi32(A_values, 0), mask));
Это отлично работает, но мне интересно, есть ли более быстрый способ сделать это, особенно в отношении сдвига вправо и оператора, который я использую для получения значений.
Кроме того, просто для пояснения я сказал, что array
A
имеет размер 32, но это неправда, этот массив содержит намного больше значений, и мне нужно получить доступ к его элементам с разных позиций (но всегда из блоков по 4 uint8_t
), поэтому я используйте _mm256_i32gather_epi23
для получения этих значений. Я просто ограничиваю размер array
в этом примере для простоты.
_mm256_srai_epi32(A_values, 24)
нет необходимости маскировать старшие биты двоичнымand 0x000000FF
, потому что они уже равны 0. - person wim   schedule 11.08.2017_mm256_srli_epi32
, затем - person harold   schedule 11.08.2017a
в_mm256_srai_epi32
. - person wim   schedule 11.08.2017_mm256_cvtepi32_ps(_mm256_cvtepu8_epi32(...))
. - person chtz   schedule 11.08.2017