使用AVX2指令加载布尔数组执行按位或结果异常求助
问题根因
- 单次AVX2指令仅能处理32字节连续内存:
_mm256_loadu_si256加载的是256比特(即32字节)数据,对应32个1字节大小的bool值。你的代码仅执行了1次加载、按位或、存储流程,仅处理了数组前32个元素。你赋值的mask[130]属于索引128~159的第四块数据,完全未被SIMD逻辑处理,a[130]因此保留初始的0值。 - 可选兼容性隐患:C++标准未强制规定
bool的内存大小,特殊平台可能存在非1字节的实现,使用uint8_t存储布尔值可以保证跨平台的位宽一致性。
修复方案
增加循环逻辑,批量处理所有256个元素:256个1字节元素共需要执行8次SIMD操作(每次处理32个)。
修复后的代码如下:
#include <iostream> #include <immintrin.h> #include <cstdint> // 用于uint8_t,可按需替换回bool int main(){ // 用uint8_t保证位宽为1字节,也可保留bool,主流平台均为1字节 uint8_t mask[256]={0}; mask[130] = 1; uint8_t block_bloom[256]={0}; uint8_t a[256] = {0}; // 每次处理32个元素,共循环8次覆盖全部256个元素 for(int i = 0; i < 256; i += 32) { __m256i reg1 = _mm256_loadu_si256((__m256i*)(&mask[i])); __m256i reg2 = _mm256_loadu_si256((__m256i*)(&block_bloom[i])); __m256i res = _mm256_or_si256(reg1, reg2); _mm256_storeu_si256((__m256i*) &a[i], res); } std::cout<< (int)a[130] << std::endl; // 强制转int避免cout将uint8_t识别为字符输出 std::cout<< (int)mask[130]; return 0; }
内容的提问来源于stack exchange,提问作者Wen Kaiyue
相关产品推荐
相关产品推荐

