Altivec——常量变量的负载

Altivec -- load of const variable

本文关键字:负载 常量 Altivec 变量      更新时间:2023-10-16

使用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);
   ...
}

有更好的方法吗?非常感谢。

使用const_cast

它的存在正是为了这个目的:处理常量不正确的API。

函数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。

您的const float *意味着您指向不可修改的内容,但您仍然可以指向其他内容。

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

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

我不会使用你讨厌的变通方法,因为调用你的方法的用户不会期望它的浮点值被修改,而且肯定会因为将来会出现讨厌的错误。

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


有关const指针的更多信息,请参阅:const int*、const int*const和int const*之间的区别是什么?