首页 > 解决方案 > shuffle() 函数和 SIMD 代码生成

问题描述

我一直在考虑 ecatmur 的功能,我相信它是更通用功能constexpr swap()的特例:shuffle()

template <std::size_t ...I, std::size_t ...J, typename T>
constexpr T shuffle(T const i, std::index_sequence<J...>) noexcept
{
  return ((std::uint8_t(i >> 8 * I) << 8 * J) | ...);
}

I是源索引,J是目标索引。有许多不同的实现方式(我将不详述细节),但根据我的经验,在循环中shuffle()调用时,实现不会诱导 gcc 和 clang 生成同样好的 SIMD 代码。shuffle()因此我的问题。是否存在一种公式shuffle(),clang 和 gcc 比现有的更喜欢 SIMDify,可能使用内置函数或内在函数?我不是针对特定的指令集。

标签: c++gccclangsimdauto-vectorization

解决方案


推荐阅读