随机掩码不适用于内在随机播放

问题描述 投票:0回答:1

我试图随机生成一个掩码(首先用 0 到 15 的值填充数组,然后对其进行洗牌),然后将其用作 _mm_shuffle_epi8 指令的参数。

__m128i generate_shuffle_mask() {
    //create and fill array
    unsigned int* indices = (unsigned int*)malloc(16 * sizeof(unsigned int));
    for (int i = 0; i < 16; i++) {
        indices[i] = i;
    }
    //randomly swap elements
    srand(time(NULL)); 
    for (int i = 16 - 1; i > 0; i--) {
        int j = rand() % (i + 1); 
        int temp = indices[i];
        indices[i] = indices[j];
        indices[j] = temp;
    }
    //debug print
    for (int i = 0; i < 16; i++) {
        std::cout << indices[i] << " ";
    }
    std::cout << std::endl;
    //creating mask on array elements
    __m128i mask = _mm_set_epi8(
        indices[0], indices[1], indices[2], indices[3], indices[4], indices[5], indices[6], indices[7], indices[8], indices[9], indices[10], indices[11], indices[12], indices[13], indices[14], indices[15]

    );
    return mask;
    delete[] indices;

}

然后我尝试在随机播放指令中使用这个掩码:

__m128i mask = generate_shuffle_mask(); //generate mask
__m128i data = _mm_loadu_si128((__m128i*)str); //load bytes to data array
printf("Original bytes: ");
for (int i = 0; i < len; ++i) {
    printf("%02X ", ((unsigned char*)&data)[i]);
}
printf("\n");

data = _mm_shuffle_epi8(data, mask); //first shuffle
for (int i = 0; i < len; ++i) {
    printf("%02X ", ((unsigned char*)&data)[i]);
}
printf("\n");

__m128i data2 = _mm_shuffle_epi8(data, mask); //second shuffle
for (int i = 0; i < len; ++i) {
    printf("%02X ", ((unsigned char*)&data2)[i]);
}
printf("\n");

据我所知,在第二次洗牌操作之后,我应该按照它们原来的顺序获取字节,但是这不会发生。可能是什么问题?

我不知道为什么,但如果我将掩码创建为硬代码,它就可以正常工作:

__m128i mask = __mm__set_epi8( 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14 );
c++ sse shuffle intrinsics
1个回答
0
投票

“在第二次洗牌操作之后,我应该按照它们原来的顺序获取字节”没有必要,您的硬编码值仅交换相邻元素(只有 2 的循环),因此对于您的示例来说这是正确的,请尝试 1 , 2, 3, 4, 5, .., 15, 0,你需要 16 次随机播放才能达到原始值。

– 贾罗德42

© www.soinside.com 2019 - 2024. All rights reserved.