AAch64 高级 SIMD 向量加法

     2023-02-16     286

关键词:

【中文标题】AAch64 高级 SIMD 向量加法【英文标题】:AAch64 Advanced SIMD vector addition 【发布时间】:2016-02-03 19:22:21 【问题描述】:

我正在尝试在我的汇编代码中添加两个高级 SIMD 向量。在这里,我有两个向量v0v1,我想将v0 的上半部分与v1 的下半部分相加,并将结果放在v0 的上半部分。性能在我的代码中至关重要,因此我正在尝试找到一种方法,可以通过一条附加指令来做到这一点。我知道我可以将上半部分移到另一个寄存器中,只需使用UADDL 指令即可。 在 AArch32 NEON 指令集中,可以使用 Dn 而不是 Qn 来完成。例如,在我的情况下,它可以这样做: vqadd.u64 d1, d1, d2 有什么办法可以在 AArch64 高级 SIMD 指令中做到这一点?

【问题讨论】:

您必须重新排列代码以避免出现这种情况。您能否发布代码片段来说明您如何达到需要这样做的地步? 【参考方案1】:

正如@sh1 所指出的,您需要重新安排一些事情。

vqadd 的等效 AArch64 指令是 sqadd 或 uqadd。但是,他们会将 v0 中的 8 个单字节 0-7 添加到 v1 中的 8 个单字节 0-7;这不是你想要的。但是,如果您可以重新安排 v1 的加载指令,您就可以达到预期的目标。

.data
 array:        .ascii  "73167176531330624919225119674426574742355349194934"
...
ldr x20,=array // ptr
ld1 v0.16b, v1.16b, [x20] // load multiple 1-element structures to two consecutive elements
uqadd v0.8b,v1.8b,v0.8b

...
(gdb) p $v0.b.s
$14 = 7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 0, 6, 2
(gdb) p $v1.b.s
$15 = 4, 9, 1, 9, 2, 2, 5, 1, 1, 9, 6, 7, 4, 4, 2, 6
(gdb)
(gdb) p $v0.b.s
$26 = 11, 12, 2, 15, 9, 3, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0

【讨论】:

SIMD 零向量测试

】SIMD零向量测试【英文标题】:SIMDzerovectortest【发布时间】:2015-03-1417:18:09【问题描述】:是否存在一种快速的方法来检查SIMD向量是否为零向量(所有分量都等于+-0)。我目前正在使用一种算法,使用移位,在log2(N)时间内运行... 查看详情

Swift 中的向量 SIMD 类型

】Swift中的向量SIMD类型【英文标题】:VectorSIMDtypesinSwift【发布时间】:2014-10-3123:33:43【问题描述】:我想知道是否可以在Swift中使用<simd/simd.h>中定义的SIMD类型(例如vector_float3)。我似乎想不出办法。谢谢!【问题讨... 查看详情

带有 Altivec 的 SIMD:为啥将两个向量相乘比相加两个向量更快?

】带有Altivec的SIMD:为啥将两个向量相乘比相加两个向量更快?【英文标题】:SIMDwithAltivec:whyismultiplyingtwovectorsfasterthanaddingtwovectors?带有Altivec的SIMD:为什么将两个向量相乘比相加两个向量更快?【发布时间】:2017-05-3023:37:17【... 查看详情

动态分配 SIMD 向量数组是不是安全?

】动态分配SIMD向量数组是不是安全?【英文标题】:IsitsafetodynamicallyallocateanarrayofSIMDvectors?动态分配SIMD向量数组是否安全?【发布时间】:2021-06-2102:01:04【问题描述】:在普通C++中,我们可以使用标准库函数malloc或new关键字动... 查看详情

向量与 SIMD 的点积

】向量与SIMD的点积【英文标题】:DotProductofVectorswithSIMD【发布时间】:2017-11-2105:20:19【问题描述】:我正在尝试使用SIMD指令来加速我的C代码中的点积计算。但是,我的函数的运行时间大致相等。如果有人能解释为什么以及如何... 查看详情

为啥向量长度 SIMD 代码比普通 C 慢

】为啥向量长度SIMD代码比普通C慢【英文标题】:WhyvectorlengthSIMDcodeisslowerthanplainC为什么向量长度SIMD代码比普通C慢【发布时间】:2019-06-1623:04:56【问题描述】:为什么我的SIMDvector4长度函数比简单的向量长度方法慢3倍?SIMDvector4... 查看详情

RGB 到 YCbCr 使用 SIMD 向量丢失一些数据

】RGB到YCbCr使用SIMD向量丢失一些数据【英文标题】:RGBtoYCbCrusingSIMDvectorslosesomedata【发布时间】:2015-01-2123:47:03【问题描述】:我正在用Rust编写JPEG解码器/编码器,我在RGB↔YCbCr转换方面遇到了一些问题。我的代码:usestd::simd::f32... 查看详情

SIMD 减少 4 个向量而没有 hadd

】SIMD减少4个向量而没有hadd【英文标题】:SIMDreduce4vectorswithouthadd【发布时间】:2020-03-2117:28:21【问题描述】:我正在尝试优化一些代码,并且我处于有4个向量__m256d的状态,我想将每个向量的总和存储在另一个__m256d中。所以基... 查看详情

向量体系结构----simd指令集扩展和gpu

进行SIMD多媒体扩展的设计,源于一个很容易观察到的事实:许多多媒体应用程序操作的数据类型比对32位处理器进行针对性优化的数据类型更窄一些。图像三基色,都是8位。音频采样也都是8位和16位来表示。SIMD的多媒体扩展指... 查看详情

我如何知道向量函数 (SIMD) 是不是真的一次对多个对象起作用?

】我如何知道向量函数(SIMD)是不是真的一次对多个对象起作用?【英文标题】:HowdoIknowifavectorfunction(SIMD)reallyworkedonmultipleobjectsatatime?我如何知道向量函数(SIMD)是否真的一次对多个对象起作用?【发布时间】:2011-07-3010:33:04【问... 查看详情

Rust 获取 SIMD 向量中真实字节的索引

】Rust获取SIMD向量中真实字节的索引【英文标题】:RustgetindexoftruebytesinSIMDvector【发布时间】:2018-04-1017:53:56【问题描述】:我想比较两个16字节的向量并获取每个匹配的索引。一个小例子来说明我想要什么:fnget_matching_idx(arr1:&am... 查看详情

如何使用内部函数 C++ 将 3 个加法和 1 个乘法转换为矢量化 SIMD

】如何使用内部函数C++将3个加法和1个乘法转换为矢量化SIMD【英文标题】:Howtoconvert3additionand1multiplyintovectorizedSIMDusingintrinsicfunctionsC++【发布时间】:2020-07-3011:32:11【问题描述】:我正在使用2D前缀总和(也称为Summed-AreaTableS)来... 查看详情

C# 中带 SIMD 的 2x2 矩阵向量积

】C#中带SIMD的2x2矩阵向量积【英文标题】:2x2MatrixvectorproductinC#withSIMD【发布时间】:2020-05-2618:11:03【问题描述】:我正在做一些事情,我想每秒多次将相同的2x2short值矩阵与不同的二维short值向量相乘,在这种情况下,性能很重... 查看详情

使用 SIMD 对半字节的去交错向量

】使用SIMD对半字节的去交错向量【英文标题】:DeinterlevevectorofnibblesusingSIMD【发布时间】:2020-07-3122:55:34【问题描述】:我有一个16384有符号四位整数的输入向量。它们被打包成8192字节。我需要将这些值交错并解压缩为两个单独... 查看详情

使用 SIMD 根据另一个向量位值计算值的乘积

】使用SIMD根据另一个向量位值计算值的乘积【英文标题】:ComputingaproductofvaluesbasedonanothervectorbitvaluesusingSIMD【发布时间】:2019-11-0717:17:32【问题描述】:我有两个向量。大小为N的双精度向量a和大小为ceil(N/8)的无符号字符向量b... 查看详情

如何使用 SIMD 比较两个字符向量并将结果存储为浮点数?

】如何使用SIMD比较两个字符向量并将结果存储为浮点数?【英文标题】:HowtocomparetwocharvectorsusingSIMDandstoretheresultasfloats?【发布时间】:2016-05-2323:30:06【问题描述】:目标:使用最少数量的算术运算(即每个mask1ANDmask2)识别内在... 查看详情

使用 SIMD (System.Numerics) 编写向量求和函数并使其比 for 循环更快

】使用SIMD(System.Numerics)编写向量求和函数并使其比for循环更快【英文标题】:WritingavectorsumfunctionwithSIMD(System.Numerics)andmakingitfasterthanaforloop【发布时间】:2021-08-0820:15:02【问题描述】:我编写了一个函数,使用SIMD(System.Numerics.Vecto... 查看详情

计算两个 _m128i SIMD 向量之间的匹配字节数

】计算两个_m128iSIMD向量之间的匹配字节数【英文标题】:Countnumberofmatchingbytesbetweentwo_m128iSIMDvectors【发布时间】:2021-04-2622:43:44【问题描述】:我正在开发一种生物信息学工具,并尝试使用SIMD来提高其速度。给定两个长度为16的... 查看详情