Ale*_*rra 0 c++ vectorization intrinsics avx avx2
基本上,我想对字节数组执行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
}
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何将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*一切变得理智,因此您不需要所有这些嘈杂/丑陋的转换。