7 void transpose_4rows(
int N,
const std::uint8_t* src, std::uint8_t* dst) {
11 for (j = 0; j < N / 32 * 32; j += 32) {
16 __m256i a = _mm256_lddqu_si256((
const __m256i*)(src + j + 0 * N));
17 __m256i b = _mm256_lddqu_si256((
const __m256i*)(src + j + 1 * N));
18 __m256i c = _mm256_lddqu_si256((
const __m256i*)(src + j + 2 * N));
19 __m256i d = _mm256_lddqu_si256((
const __m256i*)(src + j + 3 * N));
26 __m256i ab_lo = _mm256_unpacklo_epi8(a, b);
27 __m256i ab_hi = _mm256_unpackhi_epi8(a, b);
28 __m256i cd_lo = _mm256_unpacklo_epi8(c, d);
29 __m256i cd_hi = _mm256_unpackhi_epi8(c, d);
36 __m256i y0 = _mm256_unpacklo_epi16(ab_lo, cd_lo);
37 __m256i y1 = _mm256_unpackhi_epi16(ab_lo, cd_lo);
38 __m256i y2 = _mm256_unpacklo_epi16(ab_hi, cd_hi);
39 __m256i y3 = _mm256_unpackhi_epi16(ab_hi, cd_hi);
43 (__m256i*)(dst + j * M + 0 * 32),
44 _mm256_permute2f128_si256(y0, y1, 0x20));
46 (__m256i*)(dst + j * M + 1 * 32),
47 _mm256_permute2f128_si256(y2, y3, 0x20));
49 (__m256i*)(dst + j * M + 2 * 32),
50 _mm256_permute2f128_si256(y0, y1, 0x31));
52 (__m256i*)(dst + j * M + 3 * 32),
53 _mm256_permute2f128_si256(y2, y3, 0x31));
57 for (
int i = 0; i < M; ++i) {
58 dst[j * M + i] = src[j + i * N];