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);
    const __mmask16 k = 0xaaaa;

    __m512i c = _mm512_maskz_mov_epi32(k, a);

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

    return 0;
}


 実行結果

C:\>cl /EHsc movMaskZ.cpp
C:\>movMaskZ
16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
16, 0, 14, 0, 12, 0, 10, 0, 8, 0, 6, 0, 4, 0, 2, 0