2011-08-25 67 views
1

使用OSX的Accelerate framework,您可以访问4路SIMD功能,您可以在其中操作矢量浮点数,矢量整数和矢量布尔值。它为您提供4路分区,例如并且还有4路正弦,余弦,棕褐等。什么是OSX Accelerate框架的浮点选择的4路SIMD版本?

对于4个浮点数的矢量浮点数,框架提供了vFloat。 对于4个布尔矢量布尔,该框架提供了vBool32

我试图做到的是这行代码的4路SIMD版本:

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

    float selected = condition ? a : b; 

在Cell处理器例如,你可以使用内建的“spu_sel(VAL1,VAL2,有条件的) ”。

我试着写下来选择4路为:“?”

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

vFloat selected = condition ? a : b; 

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

回答

2

如果你想在这个抽象层次上工作,那么你可能不得不解决乘以1.0f或0.0f来达到预期的结果。这实际上仍然非常有效,因为AltiVec和SSE每个时钟周期都可以发出至少一个SIMD浮点乘法。

如果你想获得的性能每一点虽然那么我认为你需要下降到本机SIMD编程和SSE4,_mm_and_ps的情况下,使用相关的内部函数(vec_sel中的AltiVec,_mm_blend_ps的情况下,在较旧的SSE实现的情况下)/ _mm_andnot_ps/_mm_or_ps)。

相关问题