OSX Accelerate 框架上浮动选择的 4 路 SIMD 版本是啥?

Posted

技术标签:

【中文标题】OSX Accelerate 框架上浮动选择的 4 路 SIMD 版本是啥?【英文标题】: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”或类似名称的运算符。在这个框架中是否有浮点选择可用?如果有,如何访问?

【问题讨论】:

【参考方案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 实现的情况下)。

【讨论】:

以上是关于OSX Accelerate 框架上浮动选择的 4 路 SIMD 版本是啥?的主要内容,如果未能解决你的问题,请参考以下文章

OSX 中 MKL BLAS 和 Accelerate Framework BLAS 之间 DSCAL 的不一致

OSX 上的稀疏 BLAS

使用 Apple Accelerate 框架选择实数和复数 2D FFT

使用 Accelerate 框架对向量进行编码

OpenCV for Mac 是不是使用 Accelerate 框架?

使用 Swift 中的 Accelerate 框架来自 AVAudioPCMBuffer 的频谱图