如何将c数据类型转换为neon数据类型

时间:2014-08-15 14:02:50

标签: c++ arm vectorization simd neon

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

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

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

我想用arm 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 ++库的一部分,我只能更改此函数以优化性能。

是否有任何使用手臂霓虹灯的初学者教程?谁能提供一个简单的例子。感谢。

1 个答案:

答案 0 :(得分:2)

通常,您将使用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  ...
}