【问题标题】:Pass v4sf by value or reference按值或引用传递 v4sf
【发布时间】:2014-12-15 16:54:12
【问题描述】:

通过值或引用传递 SSE 向量哪个更有效?

typedef float v4sf __attribute__ ((vector_size(16)));

//Pass by reference
void doStuff(v4sf& foo);

//Pass by value
v4sf doStuff(v4sf foo);

一方面,v4sf 是大的 16 字节。 但是,我们可以将这些东西当作单元素数据来处理,并且引用可能会引入一层间接性

【问题讨论】:

  • 我会使用static inline v4sf doStuff(v4sf const & foo)

标签: gcc optimization sse


【解决方案1】:

通常采用向量参数的 SIMD 函数相对较小且对性能至关重要,这通常意味着它们应该被内联。内联后,无论您通过值、指针还是引用传递都无关紧要,因为编译器会优化掉不必要的副本或取消引用。

还有一点:如果您认为您可能需要将代码移植到 Windows,那么您几乎肯定会想要使用引用,因为有一些愚蠢的 ABI 限制会限制您可以传递多少向量参数(按值) ,即使函数是内联的。

【讨论】:

  • 我建议 MSVC 使用 const 引用(例如 v4sf doStuff(v4sf const & foo)),否则您会收到类似“错误 C2719:带有 __declspec(align('16')) 的形式参数不会对齐的错误"。
  • 我发现 MSVC 在调用数百次时甚至无法内联微不足道的函数。 __forceinline 是唯一让它正常运行的。
  • 确实 - 使用宏是个好主意,例如FORCE_INLINE 扩展为 MSVC 的 __forceinline 和 gcc et al 上的 __attribute__ ((always_inline))
猜你喜欢
  • 2012-01-16
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 2012-03-12
  • 2013-09-15
  • 2010-12-17
  • 2021-11-04
相关资源
最近更新 更多