小编E. *_* B.的帖子

使用`__m256i`中的值有效地访问数组 - SIMD

比方说,例如,我有2个变量__m256i叫做rowscols,在他们里面的值是:

rows: 0, 2, 7, 5, 7, 2, 3, 0
cols: 1, 2, 7, 5, 7, 2, 2, 6
Run Code Online (Sandbox Code Playgroud)

现在,这些值代表xy8点的位置,所以,在这种情况下,我将有以下几点:

p0: [0, 1], p1: [2, 2], p2: [7, 7], p3: [5, 5]
p4: [7, 7], p5: [2, 2], p6: [3, 2], p7: [0, 6]
Run Code Online (Sandbox Code Playgroud)

我也有一个名为的数组lut,其值为int:

lut: [0, 1, 2, 3, ..., 60, 61, 62, 63]
Run Code Online (Sandbox Code Playgroud)

我想要做的是,使用这些位置值rowscols变量,使用lut它访问数组并__m256i使用lut访问的值创建一个新值. …

c++ arrays simd avx2

4
推荐指数
1
解决办法
438
查看次数

使用 AVX2 将 8 位从 32 位值 (__m256i) 解压到 __m256 的最快方法

我有一个包含 32 个值的array调用。Aunsigned char

我想用__m256这个规则将这些值解包到 4 个变量中,假设我们有一个从 0 到 31 的索引,关于 中的所有值A,解包的 4 个变量将具有这些值:

B_0 = A[0], A[4],  A[8], A[12], A[16], A[20], A[24], A[28]
B_1 = A[1], A[5],  A[9], A[13], A[17], A[21], A[25], A[29]
B_2 = A[2], A[6], A[10], A[14], A[18], A[22], A[26], A[30]
B_3 = A[3], A[7], A[11], A[15], A[19], A[23], A[27], A[31]
Run Code Online (Sandbox Code Playgroud)

为此,我有以下代码:

const auto mask = _mm256_set1_epi32( 0x000000FF );
...
const auto A_values = _mm256_i32gather_epi32(reinterpret_cast<const int*>(A.data(), A_positions.values_, 4);

// …
Run Code Online (Sandbox Code Playgroud)

c++ performance simd avx2

4
推荐指数
1
解决办法
564
查看次数

标签 统计

avx2 ×2

c++ ×2

simd ×2

arrays ×1

performance ×1