关于DM8168中移植算法速度慢、效率低的新发现

有不少的朋友,特别是刚刚接触DSP的朋友。基于DVRRDK编写C代码发现执行速度特别慢,我在上面简单的对每一个像素的UV分量赋值=0x80,这样就成了灰度图像。对1080P图像进行操作,发现处理每帧要耗时10-20ms,真是慢的不可思议。

近期将SWOSD的完整代码看了一遍发现了玄机。

主要问题是在DDR中读写数据拖慢了速度。

经測试SWOSD进行一帧D1的叠加仅须要400us(叠加大小大概208*32*3个窗体);

细致分析。其内部使用了基于内部 IALG_DARAM0(双通片上数据存储)的乒乓缓存结构:

Int SWOSD_TI_alloc(const IALG_Params *algParams, IALG_Fxns **pf, IALG_MemRec memTab[])
{
    const SWOSD_Params *params = (SWOSD_Params *)algParams;

    memTab[0].size = sizeof(SWOSD_TI_Obj);
    memTab[0].alignment = 0;
    memTab[0].space = IALG_DARAM0;
    memTab[0].attrs = IALG_PERSIST;
        //InA  InB Out[2]
    memTab[1].size = (params->maxWidth*(2+2+2+2))*2;
    memTab[1].alignment = 128;
    memTab[1].space = IALG_DARAM0;
    memTab[1].attrs = IALG_PERSIST;

    return (2);
}

此函数为TMS320 Algorithm Standard 即xDAIS中的 algAlloc()函数的实现。其返回一个该算法所需的内存记录表。(详见SPRU360E)

Int SWOSD_TI_initObj(IALG_Handle handle, const IALG_MemRec memTab[],
    IALG_Handle p, const IALG_Params *algParams)
{
    const SWOSD_Params *params = (SWOSD_Params *)algParams;
    SWOSD_TI_Obj *obj = (SWOSD_TI_Obj *)handle;

    if (params == NULL) {
        params = &SWOSD_TI_PARAMS;
    }

    obj->swOsdCtrl.openPrm.maxWidth  = params->maxWidth;
    obj->swOsdCtrl.openPrm.maxHeight = params->maxHeight;

    obj->memLineBuf = memTab[1].base;

    return (SWOSD_SOK);
}

在使用时:

pLineBufA[0]  = (Int64*)(swOsdObj->memLineBuf + offset);
  offset += width;

  pLineBufA[1]  = (Int64*)(swOsdObj->memLineBuf + offset);
  offset += width;

  pLineBufB[0]   = (Int64*)((Int32)swOsdObj->memLineBuf  + offset);
  offset += width;

  pLineBufB[1]   = (Int64*)((Int32)swOsdObj->memLineBuf  + offset);
  offset += width;

  pLineBufOut[0] = (Int64*)((Int32)swOsdObj->memLineBuf + offset);
  offset += width;

  pLineBufOut[1] = (Int64*)((Int32)swOsdObj->memLineBuf + offset);
  offset += width;

然后内部将要处理的数据用DMA复制到memLineBuf,并使用乒乓结构:

    SWOSD_TI_DMA_Fast2D1D
    (
        dmaHandle,
        SWOSD_DMA_CH_IN_A,
        (void *)pInA,
        (void *)((UInt32)pLineBufA[0] + 0x30000000),
        width,
        2,
        srcPitch,
        width,
        srcPitch,
        (-width)
    );

至于上面的代码片段中目的地址 (void *)((UInt32)pLineBufA[0] + 0x30000000)中为什么在pLineBufA[0] 加了0x30000000还是没有弄明确。请高人指点。

(由于dma是个外设,他看到的地址和dsp看到的地址是不一样的。

之间有个0x30000000的偏移。

L2 SRAM address is 0x108_00000. The L3 address of c674 L2 SRAM address (GEM UMAP0) is 0x408_0000 .The conversion is from 0x108_0000 to 0x408_0000 by adding 0x0300_0000.
DONT USE 0x300_0000 .IT WILL CRASH THE SYSTEM.)

本文眼下仅仅总结出了原因,至于实现正在尝试。

欢迎交流沟通。

转载注明:http://blog.csdn.net/guo8113/article/details/25026777

??

??

??

??

时间: 2024-08-26 17:26:57

关于DM8168中移植算法速度慢、效率低的新发现的相关文章

Lua中table内建排序与C/C++/Java/php/等内排序算法的排序效率比较

Lua这类脚本语言在处理业务逻辑作为配置文件的时候方便省事 但是在大量需要 运算的地方就显得略微不足   按照 Lua内建排序算法 对比C/C++ PHP Java等的快速排序算法进行一下比较. 快速排序算法是基于冒泡排序,优化而来,时间复杂度T(n)=O(nLog2n)  ,可见内部采用了二分策略 . 发现在LuaIDE LDT下直接运行效率要比 通过C++加载运行Lua脚本效率高的多  拿500W个数据排序 来说  ,脚本如下 同样的排序脚本Lua解释器的内置排序算法在LDT下,运行速度比通

在一个千万级的数据库查寻中,如何提高查询效率?

在一个千万级的数据库查寻中,如何提高查询效率? 1)数据库设计方面:  a.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. b.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0

STL中的算法小结

(1)要运用STL的算法,首先必须包含头文件<algorithm>,某些STL算法用于数值处理,因此被定义于头文件<numeric> (2)所有STL算法都被设计用来处理一个或多个迭代器区间,第一个区间通常以起点和终点表示,至于其他区间,多数情况下你只需提供起点便足以,其终点可以自动以第一个区间的元素数量推断出来,调用者必须保证这些区间的有效性. STL算法采用覆盖模式而非安插模式,所以调用者必须保证目标区间拥有足够的元素空间,当然你也可以运用特殊的安插型迭代器将覆盖模式改变为安插

[转载]提升SQLite数据插入效率低、速度慢的方法

转载地址:http://blog.csdn.net/majiakun1/article/details/46607163,如果有侵犯原创,请留言告知,本人会及时删除. 前言 SQLite数据库由于其简单.灵活.轻量.开源,已经被越来越多的被应用到中小型应用中.甚至有人说,SQLite完全可以用来取代c语言中的文件读写操作.因此我最近编写有关遥感数据处理的程序的时候,也将SQLite引入进来,以提高数据的结构化程度,并且提高大数据的处理能力(SQLite最高支持2PB大小的数据).但是最开始,我发

复杂度分析(上):如何分析、统计算法的执行效率和资源消耗

复杂度分析是什么? 复杂度分析就是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程. 为什么要学习复杂度分析? 没有复杂度分析怎么得到算法执行的时间和占用的内存大小 把代码运行一遍,通过统计.监控,就能得到算法执行的时间和占用的内存大小. 该方法的缺点在于: 1.测试结果非常依赖测试环境 拿同样一段代码,在 Intel Core i9 处理器上运行的速度肯定要比 Intel Core i3 快得多.同一段代码,在不同机器上运行,也可能会有截然相反的结果. 2.测试结

推荐系统中常用算法 以及优点缺点对比

推荐系统中常用算法 以及优点缺点对比 在 推荐系统简介中,我们给出了推荐系统的一般框架.很明显,推荐方法是整个推荐系统中最核心.最关键的部分,很大程度上决定了推荐系统性能的优劣.目前,主要的推荐方法包括:基于内容推荐.协同过滤推荐.基于关联规则推荐.基于效用推荐.基于知识推荐和组合推荐. 一.基于内容推荐 基于内容的推荐(Content-based Recommendation)是信息过滤技术的延续与发展,它是建立在项目的内容信息上作出推荐的,而不需要依据用户对项目的评价意见,更多地需要用机 器

数据挖掘中分类算法小结

数据挖掘中分类算法小结 数据仓库,数据库或者其它信息库中隐藏着许多可以为商业.科研等活动的决策提供所需要的知识.分类与预测是两种数据分析形式,它们可以用来抽取能够描述重要数据集合或预测未来数据趋势的模型.分类方法(Classification)用于预测数据对象的离散类别(Categorical Label);预测方法(Prediction )用于预测数据对象的连续取值. 分类技术在很多领域都有应用,例如可以通过客户分类构造一个分类模型来对银行贷款进行风险评估;当前的市场营销中很重要的一个特点是强

内存管理中一些算法

在内存管理中存在这两类算法:一类是内存分配算法,一类是页面置换算法 内存分配算法:是指怎么从连续的逻辑地址空间上分配内存地址给进程. 常见内存分配算法及优缺点如下: (1)首次适应算法.使用该算法进行内存分配时,从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止.然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中. 该算法倾向于使用内存中低地址部分的空闲分区,在高地址部分的空闲分区很少被利用,从而保留了高地址部分的大空闲区.显然为以后到达的

STL中排序算法的选择

 当大多数程序员需要对一组对象进行排序的时候,首先想到的一个算法是sort.sort是一个非常不错的算法,但它也并非在任何场合下都是完美无缺的.有时候我们并不需要一个完全的排序操作.比如说,如果我们有一个存放Widget的矢量,而我们希望将质量最好的20个Widget送给最重要的顾客,按照顾客的重要程度送上不同质量的Widget,那么只需要排序出前20个最好的Widget,其他的Widget可以不用排序.在这种情况下,需要的是一种部分排序的功能,而有一个名为partial_sort的算法正好