添加 SSE 寄存器的组件

发布于 2024-12-21 08:52:56 字数 168 浏览 1 评论 0原文

我想添加 SSE 寄存器的四个组件以获得单个浮点数。我现在是这样做的:

float a[4];
_mm_storeu_ps(a, foo128);
float x = a[0] + a[1] + a[2] + a[3];

有没有直接实现这个的SSE指令?

I want to add the four components of an SSE register to get a single float. This is how I do it now:

float a[4];
_mm_storeu_ps(a, foo128);
float x = a[0] + a[1] + a[2] + a[3];

Is there an SSE instruction that directly achieves this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

你不是我要的菜∠ 2024-12-28 08:52:56

您可能可以使用 HADDPS SSE3 指令或其编译器内在 _mm_hadd_ps

例如,请参阅 http://msdn.microsoft.com/en-us/library/yd9wecaa(v =vs.80).aspx

如果你有两个寄存器 v1 和 v2 :

v = _mm_hadd_ps(v1, v2);
v = _mm_hadd_ps(v, v);

现在,v[0] 包含 v1 的分量之和,v[1] 包含 v2 的分量之和 成分。

You could probably use the HADDPS SSE3 instruction, or its compiler intrinsic _mm_hadd_ps,

For example, see http://msdn.microsoft.com/en-us/library/yd9wecaa(v=vs.80).aspx

If you have two registers v1 and v2 :

v = _mm_hadd_ps(v1, v2);
v = _mm_hadd_ps(v, v);

Now, v[0] contains the sum of v1's components, and v[1] contains the sum of v2's components.

肥爪爪 2024-12-28 08:52:56

如果您希望代码在 SSE3 之前的 CPU(不支持 _mm_hadd_ps)上运行,您可以使用以下代码。它使用更多指令,但在大多数 CPU 上解码为更少的微指令。

 __m128 temp = _mm_add_ps(_mm_movehl_ps(foo128, foo128), foo128);
 float x;
 _mm_store_ss(&x, _mm_add_ss(temp, _mm_shuffle_ps(temp, 1)));

If you want your code to work on pre-SSE3 CPUs (which do not support _mm_hadd_ps), you might use the following code. It uses more instructions, but decodes to less microops on most CPUs.

 __m128 temp = _mm_add_ps(_mm_movehl_ps(foo128, foo128), foo128);
 float x;
 _mm_store_ss(&x, _mm_add_ss(temp, _mm_shuffle_ps(temp, 1)));
一个人的旅程 2024-12-28 08:52:56

好吧,我不知道任何这样的函数,但它可以使用 _mm_hadd_ps() 两次来完成。

Well, I don't know about any such function, but it can be done using _mm_hadd_ps() two times.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文