Altivec - const变量的加载

时间:2015-11-05 08:24:05

标签: c++ simd xlc altivec

使用altivec从const指针加载的最佳方法是什么?

根据文档(和我的结果),vec_ld不会将const指针作为参数: http://www-01.ibm.com/support/knowledgecenter/SS2LWA_12.1.0/com.ibm.xlcpp121.bg.doc/compiler_ref/vec_ld.html

因此这样的事情会失败:

void foo(const float* A){
   vector4double a = vec_ld(0,A);
   ...
}

令人讨厌的解决办法是:

void foo(const float* A){
   vector4double a = vec_ld(0,const_cast<float*>A);
   ...
}

有更好的方法吗? 谢谢。

3 个答案:

答案 0 :(得分:2)

使用const_cast

它完全存在于此目的:处理const-incorrect API。

答案 1 :(得分:1)

函数vec_ld将一个128位向量(4个浮点值)加载到Altivec寄存器。加载是从16字节对齐的地址执行的。如果地址没有16字节对齐,则它无法正常工作。在这种情况下,您必须使用下一个功能:

typedef __vector uint8_t v128_u8;
typedef __vector float v128_f32;

inline v128_f32 Load(const float * p)
{
    v128_u8 lo = vec_ld(0, p);
    v128_u8 hi = vec_ld(A, p);
    return (v128_f32)vec_perm(lo, hi, vec_lvsl(0, p));        
}

如果您有Power7或Power8 CPU,请使用函数vec_vsx_ld。

答案 2 :(得分:-1)

你的const float *意味着你指出了一些不可修改的东西,但你仍然可以指出别的东西。

我不知道你的函数vec_ld,但我想因为它需要一个指向float的指针,该函数会改变指向的值。

然后,你必须提供一个可修改的值。

我不会使用你讨厌的解决方法,因为调用你的方法的用户不会期望它的浮动值被修改,这肯定是因为将来会有一个讨厌的bug。

如果您可以将方法foo更改为foo(float * A)foo(float & A),那将是一种解脱。

有关const指针的更多信息,请参阅:What is the difference between const int*, const int * const, and int const *?