DSP_TMS320F28377D_算法加速方法3_使用TMU库加速

news2024/9/24 3:23:12

继上两篇方法

DSP_TMS320F28377D_算法加速方法1_拷贝程序到RAM运行_江湖上都叫我秋博的博客-CSDN博客

DSP_TMS320F28377D_算法加速方法2_添加浮点运算快速补充库rts2800_fpu32_fast_supplement.lib_江湖上都叫我秋博的博客-CSDN博客

之后,本文继续讨论第三种DSP算法加速的方法——TMU库

该方法的加速能力比方法2还强。不过同样也有一个范围的:

 方法2我们简称为FPU加速,本文的方法(方法3)我们简称为TMU加速  FPU加速和TMU加速是两种互斥的方法,就是你用了某一种,就不能用另一种了。 所以你必须有所取舍

1 速度对比

下面我们从速度和精度两方面做一个对比,首先来看速度。(代码贴到最后吧)

TMU相比于FPU在速度上有非常明显的优势,TMU相比于FPU能够加速两倍以上。 (最后10 11 12,都是测试的小数的除法,12的结果是我直接用常数运算,而没有用变量的方式)。 

2 精度对比

精度方面,我用sin(1.9)来做一个对比测试吧。

可以看到精度都要损失,但是FPU和TMU两种方法的精度是一样的。

结论:对于相同的函数,最优的选择就是TMU

3 代码

代码的整体框架本文不赘述,看:DSP_基于TMS320F28377D双核芯片和CCS7.40的编程入门_ccs双核芯片下载_江湖上都叫我秋博的博客-CSDN博客

如何获取代码块的运行时间,本文也不赘述,看: DSP_TMS320F28377D_使用定时器实现<获取代码块运算时间>的功能_江湖上都叫我秋博的博客-CSDN博客

代码我就只贴一下main.c 和 main.h

// main.c
#include <main.h>

float64 rt[13];
double s1;
double s2;
void main(void)
{
    int i;
    InitSysCtrl();
    DINT;
    InitPieCtrl();
    InitGpio();
    IER     = 0x0000;
    IFR     = 0x0000;
    InitPieVectTable();
    InitCpuTimers();

    s1 = sin(1.9);
    s2 = __sin(1.9);
    asm ("  ESTOP0");
    runtime_init();
    while(1){
        for(i = 0; i < 13; i++){
            runtime_start();
            testfunction(i+1);
            runtime_stop();
            rt[i] = runtime;
        }

    }

}


void testfunction(int sel){
    int i = 0;
    double s,a,b;
    a = 1.023;
    b = 2.312;
    switch(sel){
        case 1:
            for(i = 0; i < 1000; i++){
                s = sin(a);
            }
            break;
        case 2:
            for(i = 0; i < 1000; i++){
                s = __sin(a);
            }
            break;
        case 3:
            for(i = 0; i < 1000; i++){
                s = cos(a);
            }
            break;
        case 4:
            for(i = 0; i < 1000; i++){
                s = __cos(a);
            }
            break;
        case 5:
            for(i = 0; i < 1000; i++){
                s = atan(a);
            }
            break;
        case 6:
            for(i = 0; i < 1000; i++){
                s = __atan(a);
            }
            break;
        case 7:
            for(i = 0; i < 1000; i++){
                s = atan2(a,b);
            }
            break;
        case 8:
            for(i = 0; i < 1000; i++){
                s = __atan2(a,b);
            }
            break;
        case 9:
            for(i = 0; i < 1000; i++){
                s = sqrt(a);
            }
            break;
        case 10:
            for(i = 0; i < 1000; i++){
                s = __sqrt(a);
            }
            break;
        case 11:
            for(i = 0; i < 1000; i++){
                s = a/b;
            }
            break;
        case 12:
            for(i = 0; i < 1000; i++){
                s = __divf32(a,b);
            }
            break;
        case 13:
            for(i = 0; i < 1000; i++){
                s = 1.023 / 2.312;
            }
            break;
        default :
            break;
    }


}




// main.h
#include <F28x_Project.h>
#include <runtime.h>
#include <math.h>

interrupt void CpuTimer0ISR(void);
#pragma CODE_SECTION(testfunction,".TI.ramfunc");

void testfunction(int sel);

 算了,还是runtime的也贴上吧

// runtime.c

#include <runtime.h>

float64 runtime = 0;    // 单位us

void runtime_init(void){
    ConfigCpuTimer(&CpuTimer1, 200, 10000000);   // 支持代码块最长运行时常10s
}

void runtime_start(void){
    CpuTimer1Regs.TCR.bit.TRB = 1;  // 周期计时器重装载
    CpuTimer1Regs.TCR.bit.TSS = 0;  // 开始计数
}

void runtime_stop(void){
    runtime = (float64)(CpuTimer1Regs.PRD.all -  CpuTimer1Regs.TIM.all) * 0.005;    // 等价于 / 200, 单位us
    CpuTimer1Regs.TCR.bit.TSS = 1;  // 停止计数
}


// runtime.h
#ifndef PROGRAM_RUNTIME_RUNTIME_H_
#define PROGRAM_RUNTIME_RUNTIME_H_

#include <main.h>

extern float64 runtime;
void runtime_init(void);
void runtime_start(void);
void runtime_stop(void);

#endif /* PROGRAM_RUNTIME_RUNTIME_H_ */

4 关于是否与方法1叠加加速

答:可以! 亲测可叠加!  

5 中断中是否可用

答:肯定可以!我猜的,我没测😄。 

后续会再推出DSP算法加速的方法与大家探讨。感谢您的阅读,如果您有什么优化方法,欢迎留言分享、收藏点赞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/958556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Google Pay外包开发流程

集成 Google Pay 可以为你的应用提供方便的支付体验。下面是一个简要的 Google Pay 集成流程概述&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.创建 Google 开发者账号&#xff1a; 如果你还没有…

激活函数总结(二十六):激活函数补充(Probit、Smish)

激活函数总结&#xff08;二十六&#xff09;&#xff1a;激活函数补充 1 引言2 激活函数2.1 Probit 激活函数2.2 Smish 激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PReLU、Swish、ELU、SELU、GELU、Softmax、…

CUDA小白 - NPP(2) - Arithmetic and Logical Operations(1)

cuda小白 原文链接 NPP GPU架构近些年也有不少的变化&#xff0c;具体的可以参考别的博主的介绍&#xff0c;都比较详细。还有一些cuda中的专有名词的含义&#xff0c;可以参考《详解CUDA的Context、Stream、Warp、SM、SP、Kernel、Block、Grid》 常见的NppStatus&#xff0c…

Sentinel配置的blockHandler方法不生效

①首先配置流控的资源名跟SentinelResource中的Value配置的一定要一直且唯一 ②其次blockhandler后面的方法一定要跟下面指定的方法名称是一样的 ③也就是我犯下的错误&#xff0c;一定要注意是上面那个才是Sentinel的&#xff0c;下面的是sun公司的…我说呢&#xff0c;一直…

Java“牵手”京东商品列表数据,关键词搜索京东商品数据接口,京东API申请指南

京东商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取京东商品列表和商品详情页面数据&#xff0c;您可以通过开放平台的接口或者直接访问京东商城的网页来获取商品详情信息。以下是两种常用方法的介绍&…

Nacos 配置管理及相关使用

文章目录 Nacos 配置管理一、统一配置管理1、在Nacos 中添加配置文件2、从微服务拉取配置3、配置实现步骤&#xff08;1&#xff09;引入 nacos-config 依赖&#xff08;2&#xff09;添加 bootstrap.yml&#xff08;4&#xff09;在 nacos 中添加配置 二、配置热更新1、配置热…

Sentry 是一个开源的错误监控和日志聚合平台-- 通过docker-compose 安装Sentry

概述 Sentry 是一个开源的错误监控和日志聚合平台&#xff0c;用于帮助开发团队实时监控和调试应用程序中的错误和异常。它可以捕获应用程序中的错误和异常&#xff0c;并提供详细的错误报告&#xff0c;包括错误堆栈跟踪、环境信息、用户信息等。这些报告可以帮助开发团队快速…

关于C语言参数传递的

一、C语言参数传递是整体带入 #include <stdio.h> #define DF(a,b) (a2*b) int main() { int s5; int k DF((s1),(s-3)); printf("%d",k); }输出结果 原因&#xff1a; #define DF(a,b) (a2*b) int k DF((s1),(s-3)); //等效 int k DF((s1)2 * (s-3)); …

CRM软件排行榜靠前的都有哪些特点?

CRM软件是企业管理客户关系的重要工具&#xff0c;它可以帮助企业提高销售效率、增强客户满意度、提升市场竞争力。在众多的CRM软件中&#xff0c;排名靠前的CRM软件有哪些&#xff1f; 1、功能全面 Zoho CRM提供了从销售、营销、客服到AI人工智能、BI数据分析再到定制开发等…

Dockerfile 使用教程

1.Dockerfile 1.1 什么是Dockerfile Dockerfile可以认为是 Docker镜像的描述文件&#xff0c;是由一系列命令和参数构成的脚本 。主要作用是 用来构建docker镜像的构建文件 。 通过架构图可以看出通过DockerFile可以直接构建镜像 1.2 Dockerfile解析过程 构建镜像步骤&#xf…

Java中的Reference

1. 常用四种引用 快速记忆法&#xff1a;“硬(俗称的强引用) --> 软(SoftReference) --> 弱(WeakReference) --> 虚(PhantomReference)” 此处将常说的“强引用”记忆成“硬引用”可以对应到次席的“软引用”&#xff08;反义词&#xff1a;硬-软&#xff09;这样更容…

ExpressLRS开源代码之框架结构

ExpressLRS开源代码之框架结构 1. 源由2. Arduino应用框架3. ExpressLRS应用框架4. 硬件设计框架4.1 单天线4.2 双天线单PA4.3 双天线双PA 5. 应用软件设计6. 参考资料 1. 源由 最近为了理解《ExpressLRS开源之基本调试数据含义》&#xff0c;做了一些源代码的研读。 概念、文…

Nginx基础+高级(2022版):待更新

1. 文章说明 说明&#xff1a;目前讲的是第一部分nginx核心技术篇&#xff0c;后需篇章会以第一部分为核心技术篇为基础来展开深度讲解&#xff0c;详情关注后续课程的发布。 2. 介绍和准备环境 2.1 介绍 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xf…

WebDAV之π-Disk派盘 + 人升

人升是一款融入了游戏化元素的待办事项应用,旨在为用户提供一种记录待办事项的过程像玩游戏打怪升级的体验。该应用致力于在保持实用性的基础上,扩展应用的乐趣。 在实用性方面,人升提供了以下功能: – 简洁界面:符合Material Design的简约界面,使新建待办事项变得更加轻…

嘉泰实业和您共创未来财富生活

每一次暖心的沟通都是一次公益,真诚不会因为它的渺小而被忽略;每一声问候都是一次公益,善意不会因为它的普通而被埋没。熟悉嘉泰实业的人都知道,这家企业不但擅长在金融理财领域里面呼风唤雨,同时也非常擅长在公益事业当中践行,属于企业的责任心,为更多有困难的群体带来大爱的传…

【机器视觉】HALCON目标图像检测实践(零基础版非常有用!)

开发环境&#xff1a; 基本思路&#xff1a; 灰度阈值处理特征提取 ps:思考&#xff1a;如何通过阈值处理后&#xff0c;后续缩小检测目标范围&#xff1f; 二值化、梯度阈值、自适应阈值等方法来增强图像的对比度&#xff0c;从而突出目标特征&#xff0c;进一步缩小检测目标…

对话永洪科技CEO何春涛:专注BI,决胜AI时代丨数据猿专访

大数据产业创新服务媒体 ——聚焦数据 改变商业 大数据、云计算、人工智能为代表的新一代信息技术走向普及&#xff0c;数据驱动业务&#xff0c;逐渐成为现代化企业管理、运作的日常。对于年均复合增长率超过20%的国内商业智能&#xff08;BI&#xff09;市场而言&#xff0c…

OpenHarmony 应用 ArkUI 状态管理开发范例

本文转载自《#2023 盲盒码 # OpenHarmony 应用 ArkUI 状态管理开发范例》&#xff0c;作者&#xff1a;zhushangyuan_ 本文根据橘子购物应用&#xff0c;实现 ArkUI 中的状态管理。 在声明式 UI 编程框架中&#xff0c;UI 是程序状态的运行结果&#xff0c;用户构建了一个 UI …

技术奇瑞高能出击,四大品牌联袂燃擎成都车展

8月25日&#xff0c;成都国际汽车展览会于中国西部国际博览城正式拉开帷幕。成都车展作为西南地区首屈一指的国内四大A级车展之一&#xff0c;不仅是下半年国内车市的风向标&#xff0c;也因天府之国弥漫着火锅味与茶香的烟火气而独具一番风味。成都车展上&#xff0c;奇瑞集团…

【校招VIP】前端算法考点之大数据相关

考点介绍&#xff1a; 大数据的关键技术分为分析技术和处理技术&#xff0c;可用于大数据分析的关键技术主要包括A/B测试&#xff0c;关联规则挖掘&#xff0c;数据挖掘&#xff0c;集成学习&#xff0c;遗传算法&#xff0c;机器学习&#xff0c;自然语言处理&#xff0c;模式…