SIMD、マスク移動

AVX-512 イントリンシックでマスクを使った移動。

#include <iostream>
#include <iomanip>
#include <immintrin.h>

using namespace std;

// print
template <typename T>
void printData(T a[])
{
    cout.setf(ios::right);
    for (int i = (sizeof(__m512i) / sizeof(float)) - 1; i >= 0; i--)
        cout << fixed << setprecision(0) << setw(3) << a[i] << ",";
    cout << "\b \b" << endl;
}

//main
int main(void)
{
    __m512i a = _mm512_setr_epi32(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
    __m512i b = _mm512_setr_epi32(11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26);
    const __mmask16 k = 0xaaaa;

    __m512i c = _mm512_mask_mov_epi32(b, k, a);

    printData((int*)&a);
    printData((int*)&b);
    printData((int*)&c);

    return 0;
}


 実行結果

C:\>cl /EHsc moveMask.cpp
C:\>moveMask
16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11
16, 25, 14, 23, 12, 21, 10, 19, 8, 17, 6, 15, 4, 13, 2, 11