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