【问题标题】:Looking for a similar function to _mm256_load_ps but for a char pointer寻找与 _mm256_load_ps 类似的功能,但寻找 char 指针
【发布时间】:2019-10-20 14:03:05
【问题描述】:

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

【问题讨论】:

  • 我很确定这是重复的,但我太懒了,所以我回答了:/

标签: c++ vectorization intrinsics avx avx2


【解决方案1】:

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 的整数加载/存储内部函数具有愚蠢的原型,需要将指针强制转换为 __m256i*,即使它保证正确对齐。实现 Intel 内在函数的编译器需要在没有任何未定义行为的情况下处理此问题。

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

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

【讨论】:

    【解决方案2】:

    _mm256_loadu_epi8vmovdqu8 指令),但这需要 AVX512。

    【讨论】:

      猜你喜欢
      • 2021-08-12
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      相关资源
      最近更新 更多