【问题标题】:What is the 4-way SIMD version of float selection on OSX Accelerate framework?OSX Accelerate 框架上浮动选择的 4 路 SIMD 版本是什么?
【发布时间】:2011-08-25 02:13:09
【问题描述】:

使用 OSX 中的 Accelerate framework,您可以访问 4 路 SIMD 功能,您可以在其中对向量浮点数、向量整数和向量布尔值进行操作。它为您提供 4 路除法,例如还有 4-way sin,cos,tan 等。

对于 4 个浮点数的向量浮点数,框架提供 vFloat。 对于 4 个 bool 的向量 bool,框架提供 vBool32

我想要完成的是这行代码的 4 路 SIMD 版本:

  float a = ...;
  float b = ...;
  bool  condition = ...;

  float selected = condition ? a : b;

例如,在 Cell 处理器上,您将使用内在的 'spu_sel(val1, val2, conditional)'。

我尝试将 4 路选择写为:

vFloat a = { ... };
vFloat b = { ... };
vBool32 condition = { ... };

vFloat selected = condition ? a : b;

...LLVM 编译器不接受它作为“?”运算符不接受 vBool32。 此外,上述网页上没有名为“vsel”或“vself”或类似名称的运算符。在这个框架中是否有浮点选择可用?如果有,如何访问?

【问题讨论】:

    标签: macos llvm sse simd intrinsics


    【解决方案1】:

    如果您想在这个抽象级别上工作,那么您可能不得不满足于乘以 1.0f 或 0.0f 来获得所需的结果。这实际上仍然非常有效,因为 AltiVec 和 SSE 都可以在每个时钟周期发出至少一个 SIMD 浮点乘法。

    如果您想获得最后一点性能,那么我认为您需要使用本机 SIMD 编程并使用相关的内在函数(vec_sel 在 AltiVec 的情况下,_mm_blend_ps 在 AltiVec 的情况下SSE4,_mm_and_ps/_mm_andnot_ps/_mm_or_ps 在旧 SSE 实现的情况下)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 2016-01-29
      • 1970-01-01
      相关资源
      最近更新 更多