首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Altivec --常量变量加载

Altivec --常量变量加载
EN

Stack Overflow用户
提问于 2015-11-05 16:24:05
回答 3查看 130关注 0票数 2

使用altivec从常量指针加载的最好方法是什么?

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

因此,像这样的东西将会失败:

代码语言:javascript
复制
void foo(const float* A){
   vector4double a = vec_ld(0,A);
   ...
}

一个令人讨厌的变通方法是:

代码语言:javascript
复制
void foo(const float* A){
   vector4double a = vec_ld(0,const_cast<float*>A);
   ...
}

有没有更好的方法来做这件事?谢谢。

EN

回答 3

Stack Overflow用户

发布于 2015-11-05 17:23:43

使用const_cast

它的存在就是为了这个目的:处理常量错误的API。

票数 2
EN

Stack Overflow用户

发布于 2015-11-05 17:15:22

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

代码语言:javascript
复制
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。

票数 1
EN

Stack Overflow用户

发布于 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 *?

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33539672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档