Ami*_*mir 5 c assembly simd intrinsics hexagon-dsp
我使用 Hexagon-SDK 3.0 编译 HVX DSP 架构的示例应用程序。有许多与 Hexagon-LLVM 相关的工具可供使用,位于以下文件夹:
~/Qualcomm/HEXAGON_Tools/7.2.12/Tools/bin
Run Code Online (Sandbox Code Playgroud)
我编写了一个小示例来计算两个数组的乘积,以确保我可以利用 HVX 硬件加速。但是,当我生成程序集时,无论是使用-S,还是使用,-S -emit-llvm我都找不到 HVX 指令的任何定义,例如vmem,vX等。我的 C 应用程序现在正在执行hexagon-sim,直到我设法找到一种在董事会也是如此。
据我了解,我需要在 C Intrinsics 中定义代码的 HVX 部分,但无法调整现有示例来满足我自己的需求。如果有人能够演示如何完成此过程,那就太好了。此外,在Hexagon V62 程序员参考手册中,许多内在指令都没有定义。
这是我用纯 C 编写的小应用程序:
~/Qualcomm/HEXAGON_Tools/7.2.12/Tools/bin
Run Code Online (Sandbox Code Playgroud)
我使用以下方法编译它hexagon-clang:
hexagon-clang -v -O2 -mv60 -mhvx-double -DLOG2VLEN=7 -I../../common/include -I../include -DQDSP6SS_PUB_BASE=0xFE200000 -o arrayProd.o -c arrayProd.c
Run Code Online (Sandbox Code Playgroud)
然后将其链接到subsys.o(在 DSK 中找到并已编译)并-lhexagon生成我的可执行文件:
hexagon-clang -O2 -mv60 -o arrayProd.exe arrayProd.o subsys.o -lhexagon
Run Code Online (Sandbox Code Playgroud)
最后,使用 sim 运行它:
hexagon-sim -mv60 arrayProd.exe
Run Code Online (Sandbox Code Playgroud)
有点晚了,但可能仍然有用。
Hexagon Vector eXtensions不会自动发出,并且当前指令集(从8.0 SDK开始)仅支持整数操作,因此编译器不会为包含“double”类型的C代码发出任何内容(这与SSE编程类似,您必须手动打包xmm 注册并使用 SSE 内在函数来完成您需要的操作)。
您需要定义您的应用程序真正需要什么。例如,如果您正在编写与 3D 相关的内容并且确实需要计算双精度(或浮点)点积,您可以将浮点数转换为 16.16 定点,然后使用类似于 和 的指令(即 C 内在函数)来模拟
Q6_Vw_vmpyio_VwVh定点Q6_Vw_vmpye_VwVuh乘法。
要“启用”HVX,您应该使用中定义的 HVX 相关类型
#include <hexagon_types.h>
#include <hexagon_protos.h>
Run Code Online (Sandbox Code Playgroud)
对于以下语句,会自动发出“vmem”和“vmemu”等指令
// I assume 64-byte mode, no `-mhvx-double`. For 128-byte mode use 32 int array
int values[16] = { 1, 2, 3, ..... };
/* The following line compiles to
{
r4 = __address_of_values
v1 = vmem(r4 + #0)
}
You can get the exact code by using '-S' switch, as you already do
*/
HVX_Vector v = *(HVX_Vector*)values;
Run Code Online (Sandbox Code Playgroud)
你的(定点)版本的 dot_product 可以一次读出 16 个整数,用几条指令将所有 16 个整数相乘(请参阅 HVX62 编程手册,有一个技巧可以从 16 位整数实现 32 位整数乘法) ,然后随机/处理/错误数据,并对重新排列的向量求和以获得点积(这样您几乎可以一次计算 4 个点积,如果您预加载 4 个 HVX 寄存器 - 即 16 个 4D 向量 - 您可以计算 16 个点积在平行下)。
如果您所做的实际上只是字节/整数图像处理,您可以在 Hexagon 指令集中使用特定的 16 位和 8 位硬件点积,而不是模拟doubles 和floats。