【问题标题】:Using scatter store from avx-512使用来自 avx-512 的分散存储
【发布时间】:2018-01-31 17:16:31
【问题描述】:

我有点好奇

_mm512_mask_i32scatter_epi32(void* base_addr, __mask16 mask, __512i idx, __512i data, int scale)

这个内在函数应该使用 idx 寄存器中的 32 位索引来分散数据寄存器中的 32 位整数。只有在屏蔽寄存器中设置了相应的位时,才会存储一个值。按照官方文档,这些值从 base_addr 开始存储,并具有与 idx 寄存器相应的偏移量。 Scale 用于缩放偏移量。

我的数据寄存器(data_reg)如下所示:

[ 0] = 4    [ 4] = 0    [ 8] = 0    [12] = 0    
[ 1] = 5    [ 5] = 0    [ 9] = 0    [13] = 0    
[ 2] = 4    [ 6] = 0    [10] = 0    [14] = 0    
[ 3] = 0    [ 7] = 0    [11] = 0    [15] = 0

索引寄存器(idx_reg)如下所示:

[ 0] = 0    [ 4] = 8    [ 8] = 16   [12] = 24   
[ 1] = 2    [ 5] = 10   [ 9] = 18   [13] = 26   
[ 2] = 4    [ 6] = 12   [10] = 20   [14] = 28   
[ 3] = 6    [ 7] = 14   [11] = 22   [15] = 30   

掩码寄存器(mask_reg)如下所示:

[ 0] = 1    [ 4] = 0    [ 8] = 0    [12] = 0    
[ 1] = 1    [ 5] = 0    [ 9] = 0    [13] = 0    
[ 2] = 1    [ 6] = 0    [10] = 0    [14] = 0    
[ 3] = 0    [ 7] = 0    [11] = 0    [15] = 0    

我这样称呼内在:

_mm512_mask_i32scatter_epi32( result_array, mask_reg, idx_reg, data_reg, 1);

结果数据(result_array)如下所示:

[ 0] = 327684   [ 4] = 0    [ 8] = 0    [12] = 0    
[ 1] = 4        [ 5] = 0    [ 9] = 0    [13] = 0    
[ 2] = 0        [ 6] = 0    [10] = 0    [14] = 0    
[ 3] = 0        [ 7] = 0    [11] = 0    [15] = 0    

但它应该是这样的:

[ 0] = 4        [ 4] = 4    [ 8] = 0    [12] = 0    
[ 1] = 0        [ 5] = 0    [ 9] = 0    [13] = 0    
[ 2] = 5        [ 6] = 0    [10] = 0    [14] = 0    
[ 3] = 0        [ 7] = 0    [11] = 0    [15] = 0    

是我遗漏了什么还是这种行为有点奇怪?

真诚的

【问题讨论】:

    标签: x86 simd intrinsics avx512


    【解决方案1】:

    索引是 byte 偏移,而不是 element 偏移,即您需要将idx_reg 中的索引乘以sizeof(int32_t),或者将sizeof(int32_t) 传递为scale 参数而不是 1

    另见this related question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-19
      • 2022-08-18
      • 2012-12-10
      • 1970-01-01
      • 2020-02-09
      • 2021-11-23
      • 1970-01-01
      • 2021-07-24
      相关资源
      最近更新 更多