1

使用 OSX 的Accelerate 框架,您可以访问 4 路 SIMD 功能,您可以在其中对向量浮点数、向量整数和向量布尔值进行操作。它为您提供 4 路除法,例如还有 4 路 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”或类似名称的运算符。在这个框架中是否有浮点选择可用?如果是这样,如何访问它?

4

1 回答 1

2

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

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

于 2011-08-25T08:04:06.723 回答