【发布时间】:2019-11-05 18:11:23
【问题描述】:
我想在__m256i 实例和std::vector<uint32_t> 实例之间进行转换(正好包含8 个元素)。
到目前为止,我想出了这个:
using vu32 = std::vector<uint32_t>;
__m256i v2v(const vu32& in) {
assert(in.size() == 8);
return _mm256_loadu_si256(reinterpret_cast<const __m256i*>(in.data()));
}
vu32 v2v(__m256i in) {
vu32 out(8);
_mm256_storeu_si256(reinterpret_cast<__m256i*>(out.data()), in);
return out;
}
安全吗?
有没有更惯用的方法呢?
【问题讨论】:
-
如果
vector有固定长度,为什么不用std::array<uint32_t, 8>代替呢?这可能有点惯用语,并且关于安全性的语言律师较少,因为该类只是普通数组的包装器。另外,您不会有std::vector通常会带来的动态分配开销(我不知道有任何实现像许多std::strings 那样具有小向量优化)。 -
@JasonR - 我同意,但作为外部约束,我必须为此使用
std::vector。总体上同意效率,尽管vector在可以使用移动的情况下确实有一些优势。 -
很公平。从实际的角度来看,我认为您的示例代码没有任何问题。我敢肯定,在 C++ 标准语言方面更出色的人可以权衡它是否完全按照标准定义,但我以前无数次使用过非常相似的结构。
-
@PeterCordes - SIMD 向量和
vector彼此有很大关系,因为它们都是给定类型的 N 个元素的连续存储。 SIMD 往往有一个固定的 N 并且类型更灵活(例如,对于整数内容,您基本上可以将类型从操作更改为操作,或者使用提供的无操作转换在整数和 FP 域之间进行转换)。
标签: c++ intel simd intrinsics avx2