DSP线性汇编优化

DSP 汇编 CCS(Code Composer Studio)是TI公司的DSP集成开发环境。它提供了环境配置、源文件编辑、程序调试、跟踪和分析等工具,帮助用户在一个软件环境下完成编辑、编译链接、调试和数据分析等工作。与TI提供的早期软件开发工具相比,利用CCS能够加快软件开发进程,提高工作效率。CCS一般工作在两种模式下:软件仿真器和与硬件开发板相结合的在线编程。前者可以脱离DSP芯片,在PC机上模拟DSP 阅读详情

转自:
https://blog.51cto.com/junzhuivs/1398316

从dct简单了解一种线性汇编优化方法

一直在看这方面的东西,自己也写过代码,但是始终都没有掌握其中的真谛。其实现在也是半懂不懂,然而还是感觉有些灵感了,写起代码也不那么慢了。今天下午就调试了四个代码,前提是这四个函数前几天是看过的:dct4x4dc,idct4x4dc,quant4x4dc和iquant4x4dc。效果dct变换还是很好的,基本提高了一半的效率,而iquant就没甚么改进,而且quant还不如以前了,原因估计是代码太长,以后还要进一步优化。

今天调的这么快,主要是把2x2的都做好了,那么简单将进行四个循环就可以了,而最后把循环展开,反正c64是有那么多寄存器的,一下就做完这16个,效果当然要比循环四次好的多(而且从水平和垂直两个方面就是八次循环了)。

今天想写下的心得不是对于dct变换本身的,虽然这部分也是很关键的,但今天就说一下优化dct2x2dc的过程。

void
dct2x2dc_c(int16_t* data)
{  
   int16_t s[4];

   s[0] = data[0];
   s[1] = data[1];
   s[2] = data[2];
   s[3] = data[3];

   data[0] = s[0] + s[2] + s[1] + s[3];
   data[1] = s[0] + s[2] - s[1] - s[3];
   data[2] = s[0] - s[2] + s[1] - s[3];
   data[3] = s[0] - s[2] - s[1] + s[3];
}

这是T264中的dct2x2dc的c代码,其实很简单,dct变换就是矩阵变换,最适合做优化了。单独测试这部分代码的c函数,两个主要参考:总周期2157,data cache misses50次。

简单的改为汇编,只要取数做运算就可以了。

  .global _dct2x2dc_sa
_dct2x2dc_sa:.cproc data
           .no_mdep
  .reg data0,data1,data2,data3,data02,data13,data20,data31
  .reg s0,s1,s2,s3

  LDH *data,s0
  LDH *+data[1],s1
  LDH *+data[2],s2
  LDH *+data[3],s3  ;分四次把data取出

  ADD s0,s2,data02
  ADD s1,s3,data13
  ADD data02,data13,data0

  SUB data02,data13,data1

  SUB s0,s2,data20
  SUB s1,s3,data31
  ADD data20,data31,data2

  SUB data20,data31,data3  ;把公式综合起来进行运算

  STH data0,*data
  STH data1,*+data[1]
  STH data2,*+data[2]
  STH data3,*+data[3]      ;存数

  .endproc

这样的实现很简单,相关的注释在后面,剖析结果:周期2109,data cache misses46次。

改进非常小。这是个中间阶段,测试数据是正确的,就可以进行进一步优化了。很明显,汇编中最费时的就是load和store。以前就看到数据打包的概念,这次终于理解了。首先,我们知道(主函数中)data的数据是16bit的,而c64的寄存器都是32位,那么我们就可以把每两个数放在一个寄存器中,然后再利用其他相关的操作来进行运算(很明显c64这样的设计就是要我们这样用的)。说起来很不明确,具体的讲就很清楚了。首先,一个LDW在一个地址取一个字,那么就是32bit,就是取了两个data:LDW *data,data10。同时再来一个:LDW *+data[1],data32。很明显就取出了所有的四个data,data0和data1分别位于寄存器data10的低16位和高16位,同样data2和data3在data32中。如果画图就很明白了,这个文字说明:
data10: data1(H)data0(L)
data32: data3(H)data2(L)
而且我们知道c64有两条指令:ADD2和SUB2(具体可以参看相关资料),分别是将两个操作数的高16位相加、相减放在dst的高16位,同时低16位相加相减放在低16位。也就是说,如果我们使用这样两条语句:ADD2 data10,data32,data0213和SUB2 data10,data32,data2031,那么在data0213和data2031中存储为:
data0213: 1+3(H)0+2(H)
data2131: 1-3(H)0-2(H)  相当整齐。
之后我们再看c代码,得到的data0到data3正是data0213和data2031高低共四个元素1+3、0+2、1-3、0-2的组合。当然首先要把他们分离,还没发现c64有指令可以高低位计算的,把这两个寄存器右移16得到了1和3的两个运算,原始的(data0213和data2031)就是0和2的运算。这样的计算好像是不对的,因为使用的0、2运算的高16位并不是单纯的,而使用的1、3运算的高16也是与计算没关系的。这个不用担心,我们的结果就是16位,最后只要考虑低16位就可以了,而且我们最后还有pack的操作,就会把高16位冲掉了。我们计算一个data2作为说明。
观察c代码,data2是(0-2)+(1-3),先把0-2移出来:SHR data2031,16,data31;然后再相加即可:ADD data2013,data31,data2。搞定。其他的也是类似了。关于PACK2的运算可以看整个代码就明确了。
  LDW *data,data10
  LDW *+data[1],data32   ;整字取数据,这里注意不要因为是按字取就加2,同样LDDW是也是加1

  ADD2 data10,data32,data0213
  SUB2 data10,data32,data2031  ;得到四个元素

  SHR data0213,16,data13
  SHR data2031,16,data31     ;分离1和3的运算

  ADD data0213,data13,data0
  ADD data2031,data31,data2 ;计算data0和data2

  SUB data0213,data13,data1
  SUB data2031,data31,data3 ;计算data1和data3

  PACK2 data1,data0,data10
  PACK2 data3,data2,data32  ;打包一个是冲掉高16位,一个也是为STW做准备

  STW data10,*data
  STW data32,*+data[1]    ;按字再存数据,也是提升性能的主要部分。

为简明起见,去掉了线性汇编的头尾以及定义寄存器。最后的剖析结果:周期1955,data cache misses42次。再进一步想,如果使用双字取数和存,是不是更会提升呢?
  LDDW *data,data32:data10

  ;中间代码与LDW一致

  STDW data32:data10,*data   最后的剖析结果:周期1877,data cache misses40次。
2x2的情况还看不那么明显,按照这样的方法改了dct4x4dc_c,二者的剖析结果为:
c:4591       108
sa:2405       52(都是上面一样的指标)。
可见,提升了近一半的性能。
其他函数的优化也是相类似的。
目前的理解就这么多了,其他的更深刻慢慢就会知道了。

第七节:关于优化,线性汇编和汇编(未完待续) 优化是一个值得讨论的话题,要最大程度利用缓存,并且合理使用线性汇编,若你有信心比编译器优化的 好,也可以尝试汇编。      有些人可能一直搞不清楚,自己的算法究竟要优化到何种程度才算完结。要用什么样的方式去优化。当你 的优化取得一定成绩时,你一定非常开心,但是,问题来了,是否应该继续。。。,我曾经也为这些问题困扰着。      我觉得,要达到这样一个能力:能够结合项目需求为优化工作制定一 阅读详情

相关推荐

DSP上AES算法性能优化实战:从C代码到线性汇编的深度调优

高级加密标准(AES)作为对称加密算法的核心,其安全性与效率在嵌入式系统中至关重要。AES算法基于置换和代换操作,通过多轮迭代实现数据混淆与扩散,其性能直接影响到实时通信与数据保护系统的吞吐率与功耗。在通用处理器上,AES通常通过查表(T-table)等优化实现较高速度,但在数字信号处理器(DSP)等异构平台上,其访存模式与并行计算架构的匹配成为关键挑战。通过编译器优化、内存访问对齐、指令级并行(ILP)及数据级并行(DLP)等技术,可以显著提升加密吞吐率,满足物联网终端、工业控制等高实时性场景的需求。本文

weixin_29192365的博客 249

DSP DSP汇编伪指令汇总

段定义伪指令: 段定义伪指令 .asect “段名” , 地址 汇编到一以绝对地址为起始的段中 作用类似于.sect,但多了绝对地址定位功能,此功能现常用更强大又灵活的命令文件来完成,故不常用。 .bss 符号,字数[,块标号] 未初始化变量段,用于为未初始化的变量在.bss 段内保留空间。 (定义变量存放空间) .data 已初始化数据段,用于包含已初始化的数据

老干妈拌雪梨喂张学友的博客 6955

DSP性能优化实战:从C代码到线性汇编的Residu函数优化路径

在嵌入式语音处理系统中,线性预测残差计算是CELP编码器的核心环节,其性能直接影响实时性。定点DSP实现通常采用Q格式运算,通过循环展开和软件流水线技术提升指令级并行度。优化关键在于理解VLIW架构的数据通路与编译器交互,利用内联函数和双字访问优化数据吞吐。针对TMS320C6000系列DSP,从自然C代码出发,通过消除内层循环、重构数据流,逐步过渡到分区线性汇编,可有效解决交叉路径瓶颈。这种优化方法在GSM EFR和G.729等语音编解码场景中,能显著提升闭环搜索效率,其数据分区与资源调配思想对现代多核S

weixin_42653691的博客 270

dsp线性汇编的一个课件

转载的,不知道出处 DSP技术与应用—— 线性汇编语言简介 线性汇编语言简介 • 汇编代码结构 • 线性汇编语言简介 汇编代码结构 Label: parallel bars [condition] instruction unit operands;comments (1)Label标号 标号用来定义一行代码或一个变量,它代表一条指 令或数据的存储地址,标

自动驾驶与智能制造--深度学习 4467

dsp优化-线性汇编中调用全局变量

;int g_arr[10] = {0,1,2,3,4,5,6,7,8,9}; ;int g_b = 10; .global add .ref g_arr .global g_b add: .cproc cnt .reg sum,tmp,arr,b

骑驴看唱本 2120

DSP架构如何优化AES加密性能:从原理到工程实践

在嵌入式系统开发中,实时数据加密是保障通信安全的核心需求。AES(高级加密标准)作为广泛使用的对称加密算法,其计算密集型特性对处理器架构提出了挑战。数字信号处理器(DSP)凭借其深度并行硬件架构和确定性执行特性,为高效实现加密算法提供了独特优势。其超长指令字(VLIW)架构和多功能单元设计,能够将加密算法的多轮迭代操作转化为高度并行的流水线执行,从而在指令级并行(ILP)层面实现性能突破。这种硬件特性与AES算法的规整计算模式相结合,使得DSP在流加密场景下能够实现远超通用处理器的吞吐率。通过针对性的代码优

weixin_30357231的博客 400

CCS中C语言程序调用线性汇编资源文件介绍:深度优化DSP性能的秘密武器

CCS中C语言程序调用线性汇编资源文件介绍:深度优化DSP性能的秘密武器 【下载地址】CCS中C语言程序调用线性汇编资源文件介绍 在DSP开发中,性能优化往往需要深入到汇编层面。本开源项目详细介绍了如何在CCS开发环境中,通过C语言程序高效调用线性汇编代码,以实现更深层次的性能优化。资源涵盖了线性汇编的基础概念、调用方法...

gitblog_06701的博客 1045

DSP 汇编:DSP 开发指南

通过示例代码,您可以更好地理解和应用 DSP 汇编开发的概念和技术。您可以根据需要调整输入信号和滤波器系数的值,并根据实际应用进行修改和优化。与通用微处理器相比,DSP 具有更高的计算能力和更多的专用硬件资源,使其在实时信号处理和高性能应用中表现出色。在 DSP 开发中,汇编语言是一种常用的编程语言,它允许开发人员直接控制 DSP 的硬件资源和寄存器。以下是一个示例的 DSP 汇编代码,实现了一个简单的数字滤波器。本文将介绍 DSP 开发的基本概念和技术,并提供一些示例源代码来帮助您理解和应用这些概念。

TjsReact的博客 2518

TI C6000 DSP优化:从C到线性汇编的渐进式性能提升方法论

在嵌入式系统与实时信号处理领域,软件性能优化是提升系统效率的核心技术。其基本原理在于通过编译器与硬件架构的协同,将高级语言算法高效映射到底层硬件资源。这一过程的技术价值在于平衡开发效率与执行性能,避免过早陷入底层细节。典型的应用场景包括通信基带处理、音视频编解码、雷达信号处理等对计算吞吐量和实时性要求极高的领域。本文聚焦于TI TMS320C6000系列DSP,其独特的VelociTI VLIW架构对代码优化提出了特殊挑战。通过剖析**软件流水**与**指针别名**等关键热词,文章系统阐述了如何利用工具链进

weixin_34101784的博客 280

DSP:基于CCS(TI C6000)的图像二次曝光设计

摘要:本文基于TIC6000DSP设计了一种图像二次曝光处理系统,实现了两幅RGB图像的加权平均融合(C=0.5×A+0.5×B)。系统采用三级优化方案:基础C语言实现保证功能正确性;通过intrinsic函数(如AVGU4)优化数据处理效率;最终采用线性汇编对关键代码深度优化。实验表明,优化后处理速度提升40%,时钟占用减少30%。系统分层设计包含应用层(lab_03_app)负责文件I/O和流程控制,算法层(lab_03_lib)提供三种实现方式。该方案有效利用了DSP硬件加速特性,为嵌入式图像处理提供

qq_74395263的博客 1036

保姆级教程:用YOLOv8/9/10搞定仪表盘指针识别,附完整数据集和Python环境配置

本文提供了一份基于YOLOv8/v9/v10的仪表盘指针检测全流程指南,涵盖环境配置、数据集构建、模型选型、训练调优和部署落地等关键步骤。通过详细的代码示例和实战经验,帮助开发者高效解决工业视觉中的仪表盘检测难题,特别适合电力巡检、智能监控等应用场景。

weixin_29031057的博客 1335

TMS320C62x DSP运动补偿优化:从C代码到线性汇编的性能跃迁

在嵌入式视频处理系统中,运动补偿是MPEG-4等视频压缩标准的核心模块,其计算效率直接影响实时性与功耗。其原理是通过运动矢量从参考帧获取预测块,涉及密集的内存访问与插值运算。为充分发挥硬件潜力,常需从算法层面向下深入至指令级优化。线性汇编作为关键优化技术,允许程序员在保留数据流逻辑的同时,将指令调度与资源分配交由编译器优化器处理,从而有效隐藏内存延迟、实现软件流水线。在TMS320C62x等VLIW架构DSP上,通过重构内存访问模式、循环展开与指令交错,可显著提升数据吞吐率。本文以运动补偿插值为例,详细解析

weixin_27956639的博客 220

TMS320F28377D/F28379D CAN通信避坑指南:从寄存器配置到中断处理的完整流程

本文详细解析了TMS320F28377D/F28379D在CAN通信开发中的关键技术与避坑指南,涵盖时钟配置、寄存器初始化、中断处理等完整流程。针对工业控制和汽车电子应用,提供了实用的优化技巧和错误诊断方法,帮助开发者高效实现稳定可靠的CAN通信。

weixin_30954265的博客 492

C6000的线性汇编--格式,用法以及优化策略

本文主要介绍TI C6000系列DSP的线性汇编格式,用法以及SIMD、循环、软件流水线、指令打包和寄存器、功能单元分配平衡等优化策略。 优化过程: ?优化根据程序剖分结果,把占用运行时间较多的模块进行优化,优化到代码能够有效的满      足需要 ?三阶段: –分析和设计C代码 –利用硬件平台信息优化C代码 –汇编优化 线性汇编与汇编不同: 不需要考虑汇编的功能单元的使用、寄

yuyin86的专栏 2608

端侧视觉赋能手游自动化:YOLOv8+NCNN实现低风险挂机与广告拦截

本文提出一种基于端侧AI的移动游戏自动化解决方案,采用YOLOv8目标检测和NCNN推理框架,结合AutoJS实现"感知-决策-执行"闭环。方案通过轻量化模型训练、多分辨率适配和行为拟态优化,解决了传统脚本的适配性和风控问题。关键技术包括:构建游戏专属数据集、模型量化优化、广告拦截和挂机功能实现,具有本地运行、安全稳定等特点,为个人开发者提供了一套完整的自动化开发框架。

milk416666的博客 1264

SRE校招面试全攻略:从基础理论到实战场景解析

本文为SRE(站点可靠性工程)校招面试提供全面攻略,涵盖计算机基础、运维核心技能、场景设计与系统架构等关键模块。文章结合真实面试真题,解析了从Linux原理、网络协议到容器化、监控告警等实战考点,并分享了高可用设计、故障排查等工程思维,旨在帮助应届生夯实基础、理清思路,从容应对SRE校招挑战。

bush的博客 644

DSP代码优化

最近研究DSP代码优化,真是一头雾水。以前没接触过汇编,DSP代码优化需要会写线性汇编,努力看书中。 转载于:https://www.cnblogs.com/smartliu/archive/2010/04/01/1702333.html...

weixin_30564785的博客 529

实战指南:彻底清除TIA Portal卸载后遗留的SQL Server WinCC实例

本文详细介绍了如何彻底清除TIA Portal卸载后遗留的SQL Server WinCC实例,解决重新安装时的冲突问题。通过控制面板排查、注册表验证、安全卸载操作流程和注册表深度清理等步骤,确保完全移除残留组件,避免系统崩溃。文章还提供了安装环境重建策略和预防措施,帮助工程师高效管理西门子自动化软件。

weixin_30482181的博客 405

CCS 中C语言程序调用线性汇编资源文件介绍

CCS 中C语言程序调用线性汇编资源文件介绍 【下载地址】CCS中C语言程序调用线性汇编资源文件介绍 在DSP开发中,性能优化往往需要深入到汇编层面。本开源项目详细介绍了如何在CCS开发环境中,通过C语言程序高效调用线性汇编代码,以实现更深层次的性能优化。资源涵盖了线性汇编的基础概念、调用方法及C语言嵌入汇编的技巧,并分...

gitblog_06724的博客 313

深入浅出:.sh文件在Linux系统中的实战应用与技巧

本文深入浅出地介绍了.sh文件在Linux系统中的实战应用与技巧。从基础概念入手,详细讲解了Bash脚本的运行方法、权限管理,并通过编写自动化备份脚本等实例,展示了如何利用Shell脚本提升工作效率。文章还涵盖了脚本调试、错误处理以及函数、参数解析等进阶技巧,帮助读者从入门到精通,掌握这一强大的自动化工具。

weixin_29243279的博客 348

通过Python实现物联网金橙子自动打标

对于自家公司使用金橙子打标卡时,为了与生产线或者PLC联动等,往往需要对金橙子打标卡进行二次开发,而在二次开发中不得不涉及到MarkEzd.dll这个文件,而这个dll文件网上版本多不说,一般都没法直接使用,最后还不得不花大价钱购买专用库。而本文针对这个问题,涉法通过python来绕过MarkEzd.dll文件,直接进行自动化控制EzCad来实现联动,可应用于实际生产。文章最后拓展一下以物联网的形式,实现手机平台等登录网页,输入想要的印字内容后,远程打印的案例。

lylelo的博客 3365

Intrinsic函数与线性汇编:解锁TI DSP硬件加速的密钥

本文深入探讨了如何利用Intrinsic函数和线性汇编技术充分释放TI C6000系列DSP的硬件并行计算能力,以应对图像二次曝光等嵌入式视觉处理中对实时性的苛刻要求。文章通过对比传统C语言实现与硬件级优化的性能差异,为开发者提供了从Intrinsic函数到线性汇编的渐进式优化路径和实用技巧。

ss78901的博客 765

【时时三省】tessy 进入调试模式 教程

山不在高,有仙则名。水不在深,有龙则灵。----优快云 时时三省。

时时三省的博客 771

基于TI C6000系列DSP的C/C++程序优化技术

摘 要:在现代DSP的开发中,越来越多地采用C/c++作为开发语言,而C/C++程序的优化成为DSP’软件开发的重要环节。在此介绍TI C6000的软件开发流程,重点讨论C6000系列的C/C++程序优化技术,包括优化流程,C/C++代码优化方法,编写线形汇编代码优化方法等。为DSP的C/C++软件开发提供了全面的程序优化技术和方法,对实际系统的开发具有重要的现实意义。 0 引 言

老刘老牛 1593

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

H.264性能优化

H.264代码优化 2007-05-24 2:20 H.264的DSP实现流程分为三个阶段: 第一个阶段产生和评估C代码,第二个阶段优化和评估C代码,第三个阶段编写和评估线性汇编。 每个阶段完成任务如下: 第一阶段:首先,产生C代码并进行时间评估。一般情况下,这个阶段的代码性能很低。如果经过评估后,仍然满足不了实时要求的话,需要进入第二个阶段以进一步改进代码性能。 第二阶段:利用优化选

zoutian007的专栏 803

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

TMS320C62x DSP上MPEG-4运动补偿的深度优化实战

视频压缩技术通过消除空间与时间冗余来减少数据量,其核心原理之一是运动补偿,它利用运动矢量预测帧间变化,是实现高压缩比的关键。这项技术的价值在于显著降低码率,支撑了从实时视频会议到高清流媒体等广泛应用。在嵌入式领域,算法的高效实现直接决定了产品的性能与功耗。本文将聚焦于如何在资源受限的DSP平台上进行极致优化,以TMS320C62x处理器上的MPEG-4运动补偿模块为例,深入剖析针对内存对齐、存储体冲突和指令级并行等挑战的解决方案。通过线性汇编等底层优化手段,开发者可以深入理解VLIW架构,将算法理论转化为高

weixin_29172963的博客 340

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 嵌入式移植代码优化
下一篇: Windows APO
audiocool
博客等级 码龄9年 335粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值