我一直在考虑 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,可能使用内置函数或内在函数?我不是针对特定的指令集。