我有C ++代码,该代码调用一些采用立即索引值(例如int _mm_extract_epi16 (__m128i a, int imm8)
)的SSE / AVX函数。问题是,我在编译时不知道索引值,所以我必须进行从int
到constexpr int
的动态转换:
template <int index>
auto extract(__m128i a) noexcept
{
static_assert(index < 8, "index must be less than 8");
return _mm_extract_epi16(a, index);
}
auto extract(const __m128i a, const int index) noexcept
{
switch (index) {
case 0: return extract<0>(a);
case 1: return extract<1>(a);
case 2: return extract<2>(a);
case 3: return extract<3>(a);
case 4: return extract<4>(a);
case 5: return extract<5>(a);
case 6: return extract<6>(a);
case 7: return extract<7>(a);
default: return extract<7>(a);
}
}
我要将代码库升级到AVX2和AVX-512(因此分别将案例数扩展到16和32),并开始想知道是否有更好的方法?还是至少可以避免大量打字?
答案 0 :(得分:3)
date cit portfolio
1 1990-01-01 1.5 1
2 1990-01-01 3.5 2
3 1990-01-01 5.5 3
4 1990-01-01 7.5 4
5 1990-01-01 9.5 5
6 1990-01-01 11.5 1
7 1990-01-01 13.5 2
8 1990-01-01 15.5 3
9 1990-01-01 17.5 4
10 1990-01-01 19.5 5
或者您也可以在C ++ 17中使用折叠表达式。这将向下编译为same thing作为开关。
但是,我认为在这种情况下,由于您所保存的只是键入内容,因此只需复制和粘贴即可。读写更简单。