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 的不一致
使用 Apple Accelerate 框架选择实数和复数 2D FFT