X86 使用avx-512中的散点存储

X86 使用avx-512中的散点存储,x86,simd,intrinsics,avx512,X86,Simd,Intrinsics,Avx512,我对孩子们的行为有点好奇 _mm512_mask_i32scatter_epi32(void* base_addr, __mask16 mask, __512i idx, __512i data, int scale) 该内在函数应使用idx寄存器中的32位索引分散数据寄存器中的32位整数。只有在掩码寄存器内设置了相应位时,才会存储值。根据官方文档,这些值从base_addr开始存储,并带有与idx寄存器的相应偏移量。“缩放”用于缩放偏移 我的数据寄存器(data_reg)如下所示: [ 0]

我对孩子们的行为有点好奇

_mm512_mask_i32scatter_epi32(void* base_addr, __mask16 mask, __512i idx, __512i data, int scale)
该内在函数应使用idx寄存器中的32位索引分散数据寄存器中的32位整数。只有在掩码寄存器内设置了相应位时,才会存储值。根据官方文档,这些值从base_addr开始存储,并带有与idx寄存器的相应偏移量。“缩放”用于缩放偏移

我的数据寄存器(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
[ 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   
[ 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);
[ 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    
索引寄存器(idx_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
[ 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   
[ 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);
[ 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    
掩码寄存器(mask_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
[ 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   
[ 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);
[ 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    
我这样称呼内在的:

[ 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
[ 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   
[ 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);
[ 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    
结果数据(结果数组)如下所示:

[ 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
[ 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   
[ 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);
[ 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    
但它应该是这样的:

[ 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
[ 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   
[ 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);
[ 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    
我是错过了什么,还是这种行为有点奇怪

诚然

索引是字节偏移量,而不是元素偏移量,即您需要将
idx\u reg
中的索引乘以
sizeof(int32\u t)
,或者将
sizeof(int32\u t)
作为
scale
参数而不是
1

另见