使用AVX2指令加载布尔数组有困难

Difficulty in loading boolean array using AVX2 instruction

目前我有两个布尔数组 X 和 Y,我想对它们进行按位或操作并将其存储回 X。我希望使用 SIMD 指令来完成,但我发现加载指令我used 没有达到预期效果。

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

int main(){
    bool mask[256]={0};
    mask[130] = 1;
    bool block_bloom[256]={0};
    bool a[256] = {0};
    __m256i reg1 = _mm256_loadu_si256((__m256i*)(&mask[0]));
    __m256i reg2 = _mm256_loadu_si256((__m256i*)(&block_bloom[0]));
    reg2 = _mm256_or_si256(reg1, reg2);
    _mm256_storeu_si256((__m256i*) &a[0],reg2);
    std::cout<< a[130] << std::endl;
    std::cout<<mask[130];
}

如我所料,此代码应给出输出 1 和 1,但输出为 0 和 1。我想知道我做错了什么以及如何解决它。非常感谢!

bool mask[256] 的大小是 256 字节而不是 256 位。数组元素的最小大小为 1 个字节。这意味着 mask[130] 没有被 _mm256_loadu_si256 加载。在加载到寄存器之前,您需要将布尔值打包成 256 位:

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

int main() {
    uint8_t mask[32] = { 0 };
    mask[16] = 1 << 5;
    uint8_t block_bloom[32] = { 0 };
    uint8_t a[32] = { 0 };
    __m256i reg1 = _mm256_loadu_si256((__m256i*)(&mask[0]));
    __m256i reg2 = _mm256_loadu_si256((__m256i*)(&block_bloom[0]));
    reg2 = _mm256_or_si256(reg1, reg2);
    _mm256_storeu_si256((__m256i*) & a[0], reg2);
    std::cout << ((a[16] >> 5) & 0x1) << std::endl;
    std::cout << ((mask[16] >> 5) & 0x1);
}