寻找与_mm256_load_ps类似的功能,但寻找char指针

时间:2019-06-05 03:58:55

标签: c++ vectorization intrinsics avx avx2

基本上,我想对字节数组执行AND掩码。我知道代码将是这样的:

char *arr = (char*)_mm_malloc(num_bytes,8);
//fill the array with some values
__m256i mask = _mm256_set1_epi8(0x12);
for(uint32_t i=0; i<num_bytes; i+=32){
    //load for chars is unknown to me
    __m256i val = _mm256_load_char(arr+i);
    val = _mm256_and_si256 (val, mask);
    //perform extra operations with the result
}

但是我不知道如何将32个字节的数据包安全地加载到256个寄存器中。

2 个答案:

答案 0 :(得分:5)

vmovdqu ymm, [mem]的固有值为_mm256_loadu_si256( (const __m256i*)any_pointer);

例如 _mm256_loadu_si256( (const *__m256i) (arr+i) )

对齐负载内在函数为_mm256_load_si256();

请参阅英特尔的内在查找器https://software.intel.com/sites/landingpage/IntrinsicsGuide/或其他内在引用,您可以在其中找到类似的内容。


如果要使用_mm_malloc当场分配内存,请要求32字节对齐,而不仅仅是8个字节,这样您就可以使用对齐的负载,并确保不进行任何高速缓存行拆分。


英特尔的整数加载/存储内在函数具有愚蠢的原型,即使不保证其正确对齐,也需要将指针转换为__m256i*。需要使用实现Intel内部函数的编译器来处理此问题,而没有任何未定义的行为。

(在ISO C ++中,甚至创建一个未对齐的指针而不会取消引用它是UB。)

AVX512加载/存储内部函数最终变得理智,占用void*,因此您不需要所有那些嘈杂/丑陋的转换。

答案 1 :(得分:1)

_mm256_loadu_epi8vmovdqu8指令),但这需要AVX512。