You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 11:51:02