使用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);
...
}
有更好的方法吗? 谢谢。
答案 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 *?