寻找与_mm256_load_ps类似的函数,但需要一个字符指针

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

本文关键字:指针 字符 一个 load mm256 ps 函数 寻找      更新时间:2023-10-16

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

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*。 实施英特尔内部函数的编译器需要处理此问题,而不会出现任何未定义的行为。

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

AVX512 加载/存储内在功能最终使它变得理智,void*,因此您不需要所有这些嘈杂/丑陋的演员表。

_mm256_loadu_epi8(vmovdqu8指令(,但这需要 AVX512。