【问题标题】:How to convert c datatype to neon datatype如何将 c 数据类型转换为 neon 数据类型
【发布时间】:2014-10-09 06:34:39
【问题描述】:

我正在学习使用ARM neon instructions优化代码。我有一个执行特定操作的 c++ 函数。比如说,

int* multiplyCorrespondingElements(int* arr1, int* arr2)

arr1 和 arr2 是两个大小相同的整数数组 n (n>50)。此函数应将给定数组的相应元素相乘。

我想用 arm neon 来实现这个功能。对于使用 neon 函数,数据类型应该类似于

int8x8_t or int16x4_t or int32x2_t or int64x1_t. 

我需要用于乘法的函数是

给出的函数之一

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491c/CIHJBEFE.html

如何将可作为函数参数的 int [] 转换为 arm neon 的矢量数据类型?决定使用哪个向量和使用哪个乘法函数的标准是什么?

我搜索了很多,但找不到任何类似的例子。网络上所有可用的示例都将向量数据类型本身作为参数。我不能这样做,因为该函数需要成为更大的 c++ 库的一部分,我只能更改此函数以优化性能。

有没有适合初学者使用 arm neon 的教程?谁能提供一个简单的例子。谢谢。

【问题讨论】:

    标签: c++ arm vectorization simd neon


    【解决方案1】:

    通常您会使用 vld 内部函数从每个输入数组中加载元素向量,例如

    for (i = 0; i < n; i += 4)               // iterate through arrays, 4 elements at a time
    {
        int4x32_t v1 = vld1q_s32(&arr1[i]);  // load vector of 4 x 32 bit ints from arr1
        int4x32_t v2 = vld1q_s32(&arr2[i]);  // load vector of 4 x 32 bit ints from arr2
        int4x32_t vp = vmulq_s32(v1, v2);    // multiply vectors
        // ... do other stuff ...
        // ... store results  ...
    }
    

    【讨论】:

    • 感谢您的回答。这正是我所需要的。你能为初学者推荐任何使用霓虹内在函数的教程吗?
    • 我不知道任何教程,但我认为有一个 SO user who might have been working on a book on NEON - 我相信他是一个纯粹的汇编程序,并且不使用内在函数,所以你必须处理这个.我建议仔细阅读他关于 SO 的所有答案,并使用 [neon] 标签搜索其他答案。
    • 感谢您的链接。我可以再问一个相关的疑问吗?通常用于在计算后将 neon 数据类型转换回 c 数据类型(例如转换为 int 数组)的函数是什么?当前情况下是vst1q_s32吗?
    • 是的,在这种情况下,vst1q_s32 可能是您想要的——尽管不要将其视为“转换”——您只是在向/从 NEON 向量寄存器加载/存储标量数据。
    猜你喜欢
    • 1970-01-01
    • 2020-10-22
    • 2016-06-25
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2019-08-04
    相关资源
    最近更新 更多