【发布时间】:2012-09-19 10:06:24
【问题描述】:
我有一些代码,最初是由与 MSVC 合作的人给我的,我正试图让它在 Clang 上工作。这是我遇到问题的功能:
float vectorGetByIndex( __m128 V, unsigned int i )
{
assert( i <= 3 );
return V.m128_f32[i];
}
我得到的错误如下:
Member reference has base type '__m128' is not a structure or union.
我环顾四周,发现 Clang(可能还有 GCC)在将 __m128 视为结构或联合时存在问题。但是,我还没有找到关于如何取回这些值的直接答案。我尝试过使用下标运算符,但无法做到这一点,而且我浏览了大量 SSE 内在函数,但还没有找到合适的。
【问题讨论】:
-
知道原来的内部接口故意遗漏了这个功能是很有用的,因为在硬件中没有有效的方法来有效地做到这一点。编译器(如 MSVC)将提供扩展(如
m128_f32)来执行此操作。但这只是掩盖了性能问题。 -
是的,我知道它完全消除了一次处理向量的好处——我认为这个特殊的功能不适合大量使用。由于我正在移植,我想避免留下任何未实现的东西。
-
@Mysticial 在 gcc 上使用 -mfpmath=sse 时(以及在 msvc 上生成 64 位代码时),浮点值在 sse 寄存器中。您可以使用
_mm_cvtss_f32(V)和其他元素有效地返回向量的最低有效部分,方法是首先将所需的值改组到低元素中。 -
值得注意的是,对于较新的 clang 版本,您可以使用
return V[i]。 -
@benwad 备注 - 很明显,
[i]在V.m128_f32之后应该有一个V.m128_f32- 因为你说这适用于 MSVC。而且这种更改显然不会影响 clang 错误消息,而且细节对您的要求并不重要。我已尝试两次将其作为对问题的编辑提交,但大多数审阅者认为我正在改变问题的意图,因此没有发生。
标签: c++ clang sse simd intrinsics