AVX2-在数组中将整数存储在任意索引

发布于 2025-02-05 19:21:29 字数 62 浏览 3 评论 0原文

我正在寻找一个固有的函数,可以将832位整数在AVX2寄存器中使用,并将它们分别存储在自己的索引中(本质上是与

I am looking for an intrinsic function that can take the 8 32-bit integers in an avx2 register and store them each at their own index in an array (essentially the store-equivalent to _mm256_i32gather_epi32). As far as I can tell, such a function doesn't exist, but I'm not sure if I'm just missing something as I am new to SIMD programming.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你曾走过我的故事 2025-02-12 19:21:29

您是正确的,该指令在AVX2中不存在。这是一个可能的解决方法。但是请注意,这将汇编为很多说明。如果可以的话,请做其他事情。

// Store 4 integers from SSE vector using offsets from another vector
inline void scatter( int* rdi, __m128i idx, __m128i data )
{
    rdi[ (uint32_t)_mm_cvtsi128_si32( idx ) ] = _mm_cvtsi128_si32( data );
    rdi[ (uint32_t)_mm_extract_epi32( idx, 1 ) ] = _mm_extract_epi32( data, 1 );
    rdi[ (uint32_t)_mm_extract_epi32( idx, 2 ) ] = _mm_extract_epi32( data, 2 );
    rdi[ (uint32_t)_mm_extract_epi32( idx, 3 ) ] = _mm_extract_epi32( data, 3 );
}

// Store 8 integers from AVX vector using offsets from another vector
inline void scatter( int* rdi, __m256i idx, __m256i data )
{
    scatter( rdi, _mm256_castsi256_si128( idx ), _mm256_castsi256_si128( data ) );
    scatter( rdi, _mm256_extracti128_si256( idx, 1 ), _mm256_extracti128_si256( data, 1 ) );
}

You’re correct, that instruction doesn’t exist in AVX2. Here’s one possible workaround. But note that will compile into quite a few instructions. If you can, do something else instead.

// Store 4 integers from SSE vector using offsets from another vector
inline void scatter( int* rdi, __m128i idx, __m128i data )
{
    rdi[ (uint32_t)_mm_cvtsi128_si32( idx ) ] = _mm_cvtsi128_si32( data );
    rdi[ (uint32_t)_mm_extract_epi32( idx, 1 ) ] = _mm_extract_epi32( data, 1 );
    rdi[ (uint32_t)_mm_extract_epi32( idx, 2 ) ] = _mm_extract_epi32( data, 2 );
    rdi[ (uint32_t)_mm_extract_epi32( idx, 3 ) ] = _mm_extract_epi32( data, 3 );
}

// Store 8 integers from AVX vector using offsets from another vector
inline void scatter( int* rdi, __m256i idx, __m256i data )
{
    scatter( rdi, _mm256_castsi256_si128( idx ), _mm256_castsi256_si128( data ) );
    scatter( rdi, _mm256_extracti128_si256( idx, 1 ), _mm256_extracti128_si256( data, 1 ) );
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文