我正在学习使用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的 vector 数据类型?确定应该使用哪个 vector 以及应该使用哪个乘法函数的标准是什么?

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

是否有针对使用 ARM NEON 的初学者的教程?谁能提供一个简单的例子。谢谢。

最佳答案

通常,您将使用vld内部函数从每个输入数组加载元素 vector ,例如

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  ...
}

关于c++ - 如何将C数据类型转换为Neon数据类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25327857/

10-13 08:15