寻找与 _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_epi8
(vmovdqu8
指令),但这需要 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*
所以你不需要所有那些嘈杂/丑陋的转换。
基本上,我想对字节数组执行 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_epi8
(vmovdqu8
指令),但这需要 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*
所以你不需要所有那些嘈杂/丑陋的转换。