使用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);
}
目前我有两个布尔数组 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);
}