gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 15:30:05 25 4
gpt4 key购买 nike

基本上,我想对字节数组执行 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();

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


如果您使用 _mm_malloc 现场分配内存,请要求 32 字节对齐,而不仅仅是 8 字节,这样您就可以使用对齐加载并保证不会有任何缓存行拆分.


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

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

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

关于c++ - 寻找与 _mm256_load_ps 类似的函数,但用于字符指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56454074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com