使用altivec从常量指针加载的最好方法是什么?
根据文档(和我的结果),vec_ld不接受常量指针作为参数: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);
...
}有没有更好的方法来做这件事?谢谢。
发布于 2015-11-05 17:23:43
使用const_cast。
它的存在就是为了这个目的:处理常量错误的API。
发布于 2015-11-05 17:15:22
函数vec_ld将128位矢量(4个浮点值)加载到Altivec寄存器。加载从16字节对齐的地址执行。如果地址没有16字节对齐,它就不能正常工作。在这种情况下,您必须使用next函数:
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处理器,请使用函数vec_vsx_ld。
发布于 2015-11-05 16:47:37
你的const float *意味着你指向的东西是不可修改的,但你仍然可以指向其他东西。
我不知道你的vec_ld函数,但我猜因为它需要一个指向浮点数的指针,所以函数会改变指向的值。
然后,您必须提供一个可修改的值。
我不会使用你讨厌的变通方法,因为调用你的方法的用户不会期望它的浮点值会被修改,而且它肯定会被修改,因为将来会有一个讨厌的bug。
如果您可以将方法foo更改为foo(float * A)或foo(float & A),那将是一种解脱。
有关常量指针的更多信息,请参阅:What is the difference between const int*, const int * const, and int const *?
https://stackoverflow.com/questions/33539672
复制相似问题