2

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

有一个更好的方法吗?谢谢你。

4

3 回答 3

2

使用const_cast.

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

于 2015-11-05T09:23:43.223 回答
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。

于 2015-11-05T09:15:22.073 回答
-1

你的const float *意思是你指向不可修改的东西,但你仍然可以指向别的东西。

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

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

我不会使用您讨厌的解决方法,因为调用您的方法的用户不会期望它的浮点值被修改,并且肯定会因为将来出现一个讨厌的错误。

如果你能改变你的方法foofoo(float * A)否则foo(float & A)这将是一种解脱。


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

于 2015-11-05T08:47:37.257 回答