寻找与 _mm256_load_ps 类似的函数,但用于字符指针

Looking for a similar function to _mm256_load_ps but for a char pointer

基本上,我想对字节数组执行 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寄存器中。

_mm256_loadu_epi8vmovdqu8 指令),但这需要 AVX512。

vmovdqu ymm, [mem] 的内在函数是 _mm256_loadu_si256( (const __m256i*)any_pointer);

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

aligned-load 内在是 _mm256_load_si256();

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


如果您使用 _mm_malloc 现场分配内存,请要求 32 字节对齐,而不仅仅是 8,因此您可以使用对齐加载并保证没有任何 cache-line分裂。


Intel 的整数 load/store 内在函数有愚蠢的原型,需要将指针转换为 __m256i*,即使 not 保证正确对齐。需要实现英特尔内在函数的编译器来处理这个问题,而不会出现任何未定义的行为。

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

AVX512 load/store 内在函数最终使它变得理智,采用 void* 所以你不需要所有那些嘈杂/丑陋的转换。