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

标签 c++ arm vectorization simd neon

我正在学习使用 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/

相关文章:

c++ - 从并行数组返回值并在后面的函数中使用这些值

Linux DMA API 问题

android - 如何配置 IBM Worklight Studio 以构建 ARM 和 MIPS 设备?

c++ - ARMCC 如何优化 C++ 代码

matlab - 如何减少for循环消耗的时间?

matlab - 如何矢量化此代码?

c++ - 如何在运行时检查对象是否派生自特定类?

c++ - 为什么在<algorithm>和<utility>中都存在std::move

performance - 使用 MATLAB 高效创建特定矩阵

c++ - 在不将它们包含在结果中的情况下在两个字符串之间获取结果?