寻找与_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 寄存器中。
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。
相关文章:
- 指向指向字符数组的指针数组的指针
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将字符缓冲区强制转换为函数指针
- 在函数中返回无符号字符数组,但不返回指针
- 将字符逐个分配给指针?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 如何循环访问 cpp 中的函数返回的字符指针数组
- 将字符数组复制到 QByte 数组中,而无需传递指针
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- C++指针数组到字符数组中的特定位置
- 如何从链表指针字符中查找字符
- 获取字符数组地址,然后转换为指针字符
- 在指针字符 c++ 中分配字符数组的值
- C 指针字符
- 将向量传递<char>到指针字符*
- 如何修复未对齐的指针(字符**)
- 如何打印指针字符数组
- 指针 *字符和 &字符
- C++指针字符
- C/ c++:从指针字符一维数组中访问单个字符