使用 avx-512 的分散存储
Using scatter store from avx-512
我对
的行为有点好奇
_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
我是不是漏掉了什么或者这种行为有点奇怪?
此致
索引是 byte 偏移量,而不是 element 偏移量,即您需要将 idx_reg
中的索引乘以sizeof(int32_t)
,或传递 sizeof(int32_t)
作为 scale
参数而不是 1
。
另见 this related question。
我对
的行为有点好奇_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
我是不是漏掉了什么或者这种行为有点奇怪?
此致
索引是 byte 偏移量,而不是 element 偏移量,即您需要将 idx_reg
中的索引乘以sizeof(int32_t)
,或传递 sizeof(int32_t)
作为 scale
参数而不是 1
。
另见 this related question。