【问题标题】:Load vector NEON intrinsics加载向量 NEON 内在函数
【发布时间】:2013-09-09 16:15:25
【问题描述】:

我想从 128 位的内存向量中加载: 我有这些指针:

int8x16_t* p1=(int8x16_t*)srcimg.data;
int8x16_t* p2=(int8x16_t*)(srcimg.data+srcimg.cols); 

问题是加载函数是这个:

int8x16_t vld1q_s8(__transfersize(16) int8_t const * ptr); 

我不明白为什么函数需要输入一个 int8_t* 值。

我想做这样的事情:

int8x16_t vector;
vector=vld1q_s8(p1); 

我该怎么做?谢谢。

【问题讨论】:

    标签: arm neon intrinsics


    【解决方案1】:

    它应该已经像下面那样工作了。

    int8x16_t vector;
    vector=vld1q_s8((int8_t *) srcimg.data);
    

    int8x16_t 是一种矢量类型,创建它是为了便于阅读矢量布局。

    int8_t 就是你所说的字节。

    大声朗读应该听起来像“从这个字节流加载到一个四元寄存器”。

    如果您还检查了gcc arm intrinsics page,您应该找不到任何指向这些向量类型的指针。它们的意思是映射到SIMD 寄存器,而您通常不会谈论指向寄存器的指针。

    如果您想了解有关霓虹灯编程的更多信息,可以查看ARM's website 和此blog series

    【讨论】:

    • 我不太清楚这样做的区别:int8x16_t* p1=(int8x16_t*)srcimg.data;并像你说的那样用 (int8_t *) srcimg.data 做一个演员。我的意思是,在一种情况下,我们谈论的是 128 位的向量,而在另一种情况下,我们谈论的是一个字节。
    • @user2696208 再次重申,所有行为都取决于vld1q_s8 读取数据的方式。
    • 什么意思?如何理解它是如何读取数据的?对不起,我是 NEON 的新手,所以多一点解释会有所帮助。谢谢你。在接下来的部分中我想做的是一个循环,在这个循环中,我从 p1 和 p2 指向的内存位置增加指针 p1 和 p2 的值,并在每个循环中加载 128 位的向量。
    猜你喜欢
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 2019-12-04
    • 2013-03-01
    • 2015-08-20
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    相关资源
    最近更新 更多