avx512
AVX-512Day 24

vpcompressd

More than 3 years have passed since last update.

expandの逆をします。

これだけマスクの扱いが特殊ですね。マスクと対応する入力を拾ってきて、出力には下から詰めます。

#include <immintrin.h>
#include <stdio.h>

unsigned int in[16] = {100,101,102,103,
                       104,105,106,107,
                       108,109,110,111,
                       112,113,114,115
};

unsigned int out[16];

void test(__mmask16 mask)
{
    for (int i=0; i<16; i++) {
        out[i] = -1;
    }

    __m512i v = _mm512_loadu_si512(in);

    _mm512_mask_compressstoreu_epi32(out, mask, v);

    printf("0x%04x: ", mask);
    for (int i=0; i<16; i++) {
        printf("%3d, ", out[15-i]);
    }
    puts("");
}

int
main()
{
    printf("      | ");
    for (int i=0; i<16; i++) {
        printf("%3d, ", 15-i);
    }
    puts("\n---------------------------------------------------------------------------------------");

    test(1);
    test(0xaaaa);
    test(0x8888);
    test(0x0303);
    test(0x0462);
    test(0xffff);
}
      |  15,  14,  13,  12,  11,  10,   9,   8,   7,   6,   5,   4,   3,   2,   1,   0, 
---------------------------------------------------------------------------------------
0x0001:  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 100, 
0xaaaa:  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 115, 113, 111, 109, 107, 105, 103, 101, 
0x8888:  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 115, 111, 107, 103, 
0x0303:  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 109, 108, 101, 100, 
0x0462:  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 110, 106, 105, 101, 
0xffff: 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 

明日は @tanakmura が vpscatterdd について書きます。