В исходнике — реализация высокопроизводительного транспонирования матрицы на AVX2. Функция transpose_Vec256_kernel принимает указатели на исходный и целевой блоки, а также на prefetch-область, и обрабатывает 32 строки по 32 байта. Алгоритм использует _mm256_shuffle_epi8, _mm256_blendv_epi8 и _mm256_permute2x128_si256 с константами из SHUFFLE_MASK и BLENDV_MASK. В каждом раунде данные перетасовываются и смешиваются, постепенно меняя порядок байт. Для обхода задержек памяти добавлены инструкции _mm_prefetch с подсказкой _MM_HINT_NTA — prefetch считывает строки из prf_origin на 16 шагов вперёд. Внешняя функция transpose_Vec256 разбивает матрицу на блоки 64×64 (по n — размер матрицы, кратный 64). Для каждого блока вычисляется адрес источника, цели и prefetch-буфера, затем дважды вызывается ядро: первый раз для верхней половины (первые 32 строки), второй — для нижней (смещение +32*n), причём в целевом блоке строки чередуются (смещение +32). В результате получается блочно-транспонированная матрица. Никаких комментариев о производительности или контексте в коде нет — только сухая реализация на интринсиках.
transpose_Vec256 на AVX2: 32 строки, prefetch и блочная перестановка
24.05.2026 10:30 · hackernews