Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用指令内部函数在Hexagon DSP中实现HVX_C_Assembly_Clang_Llvm_Hexagon Dsp - Fatal编程技术网

C 使用指令内部函数在Hexagon DSP中实现HVX

C 使用指令内部函数在Hexagon DSP中实现HVX,c,assembly,clang,llvm,hexagon-dsp,C,Assembly,Clang,Llvm,Hexagon Dsp,我使用HexagonSDK3.0为HVX DSP架构编译示例应用程序。有许多与Hexagon LLVM相关的工具可用于位于以下位置的文件夹: ~/Qualcomm/HEXAGON_Tools/7.2.12/Tools/bin 我编写了一个小示例来计算两个阵列的乘积,以确保我可以利用HVX硬件加速。然而,当我用-S或-S-emit llvm生成我的程序集时,我找不到HVX指令的任何定义,例如vmem、vX等。我的C应用程序目前正在hexagon sim上执行,直到我设法找到在主板上运行的方法 据

我使用HexagonSDK3.0为HVX DSP架构编译示例应用程序。有许多与
Hexagon LLVM
相关的工具可用于位于以下位置的文件夹:

~/Qualcomm/HEXAGON_Tools/7.2.12/Tools/bin
我编写了一个小示例来计算两个阵列的乘积,以确保我可以利用
HVX
硬件加速。然而,当我用
-S
-S-emit llvm
生成我的程序集时,我找不到HVX指令的任何定义,例如
vmem
vX
等。我的C应用程序目前正在
hexagon sim
上执行,直到我设法找到在主板上运行的方法

据我所知,我需要在
C internal
中定义代码的HVX部分,但无法调整现有示例以满足我自己的需要。如果有人能证明这个过程是如何完成的,那就太好了。同样在
[Hexagon V62程序员参考手册][1]
中,许多内在指令没有定义

这是我的纯C小应用程序:

#包括
#包括
#包括
#包括
#如果已定义(_六边形)
#包括“hexagon_standalone.h”
#包括“subsys.h”
#恩迪夫
#包括“io.h”
#包括“hvx.cfg.h”
#定义内核大小9
#定义Q 8

#定义精度(1有点晚,但可能仍然有用

Hexagon向量扩展不是自动发出的,当前指令集(从8.0 SDK开始)只支持整数操作,因此编译器不会为包含“double”类型的C代码发出任何内容(类似于SSE编程,您必须手动打包xmm寄存器,并使用SSE内部函数来完成您需要的操作)

您需要定义应用程序真正需要什么。 例如,如果您正在编写与3D相关的内容,并且确实需要计算双(或浮点)点积,则可以将您的浮点转换为16.16定点,然后使用如下说明(即C intrinsic)
Q6_Vw_vmpyo_VwVh
Q6_Vw_vmpye_VwVuh
模拟定点乘法

要“启用”HVX,应使用中定义的HVX相关类型

#include <hexagon_types.h>
#include <hexagon_protos.h>
您的(定点)版本的dot_乘积一次可以读取16个整数,在一对指令中将所有16个整数相乘(请参阅HVX62编程手册,这里有一个技巧可以从16位1实现32位整数相乘), 然后洗牌/deal/ror数据,将重新排列的向量相加,得到点积(这样你几乎可以一次计算4个点积,如果你预加载4个HVX寄存器,即16个4D向量,你可以并行计算16个点积)


如果您所做的实际上只是字节/整数图像处理,那么您可以在Hexagon指令集中使用特定的16位和8位硬件点积,而不是模拟
double
s和
float
s。

行为可能与上游
clang
略有不同,但似乎没有太大的不同
foo.s
您显示的是文本LLVM IR。第二个是Hexagon Assembly。您为什么想要/需要
opt
?您想做什么?感谢您的回复。我只是想看看在这个上下文中我们是否可以使用opt可用的优化过程。@BrianCain另外,我想确保我的程序集具有exp合法调用HVX指令。找不到在我的代码中定义HVX的方法。如果存在
-mhvx
,则驱动程序应定义
\uuuuuhvx\uuuuuu
。使用
hexagon llvm objdump
反汇编代码以验证HVX指令的存在。您还可以使用内联汇编来测试它是否有效。如果您更改r问题为了描述验证HVX是否启用的问题,我将在下面的答案中编写一个示例演示。感谢@BrianCain。更新了问题。感谢您抽出时间让我知道如何在这里执行内部C作为示例。
hexagon-clang -O2 -mv60 -o arrayProd.exe  arrayProd.o subsys.o -lhexagon
hexagon-sim -mv60 arrayProd.exe
#include <hexagon_types.h>
#include <hexagon_protos.h>
// 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;