多任务并行

将任务结果输出到临时文件中然后收集起来实现多任务同时执行输出。
通过文件名来确认任务完成状态
// 参数:文件列表,最大同时进行任务数
ArrageTask(files, 3);
// 参数:文件列表,最大同时进行任务数
function ArrageTask(paraCmdList, paramiMaxMul)
{

var sQuery = "Select * from Win32_Process where Name = 'cmd.exe'";

var WshShell = new ActiveXObject("WScript.Shell");
var WMI = GetObject("WinMgmts:");
var objProcesses;
do
{
objProcesses = null;
WScript.Sleep(200);
objProcesses = WMI.ExecQuery(sQuery);
while(objProcesses.count < paramiMaxMul && paraCmdList.length != 0)
{
WshShell.Run("cmd /c " + paraCmdList);
paraCmdList.splice(0, 1);
objProcesses = WMI.ExecQuery(sQuery);
}
}
while(objProcesses.count != 0 || paraCmdList.length != 0)
}

====================================version 1=============================================

var objStartDate = new Date();
var strStartDate = objStartDate.getYear().toString();
strStartDate += "-" + ((objStartDate.getMonth()+1).toString().length < 2 ? "0" : "") + (objStartDate.getMonth()+1).toString();
strStartDate += "-" + (objStartDate.getDate().toString().length < 2 ? "0" : "") + objStartDate.getDate().toString();
strStartDate += " " + (objStartDate.getHours().toString().length < 2 ? "0" : "") + objStartDate.getHours().toString();
strStartDate += ":" + (objStartDate.getMinutes().toString().length < 2 ? "0" : "") + objStartDate.getMinutes().toString();
strStartDate += ":" + (objStartDate.getSeconds().toString().length < 2 ? "0" : "") + objStartDate.getSeconds().toString();
// 打印开始日期
WScript.StdOut.WriteLine("StartTime:" + strStartDate);

String.prototype.Trim = function(){
    return this.replace(/(^s*)|(s*$)/g, "");
}
String.prototype.LTrim = function(){
    return this.replace(/(^s*)/g, "");
}
String.prototype.Rtrim = function(){
    return this.replace(/(s*$)/g, "");
}

var fso = new ActiveXObject("Scripting.FileSystemObject");
var objPathListFile = fso.OpenTextFile("InputFile", 1 , false);
var files = new Array();
while (!objPathListFile.AtEndOfStream)
{
    var strLine = objPathListFile.ReadLine();
    strLine = strLine.Trim();
    if((strLine != "") && (strLine.charAt(0) != "\\"))
    {
        var i = 0;
        for(; i < files.length; i++)
        {
            if(files[i] == strLine)
            {
                break;
            }
        }
        if(i == files.length)
        {
            files.push(strLine);
        }
    }
}
objPathListFile.Close();



var WshShell = new ActiveXObject("WScript.Shell");
var WMI = GetObject("WinMgmts:");
var sProcessorQuery = "Select * from Win32_Processor";

var iMaxMul = 3;
// 看看电脑有几个核
var objProcessors = WMI.ExecQuery(sProcessorQuery);
var pk = new Enumerator(objProcessors);
for (; !pk.atEnd(); pk.moveNext())
{
    var objProcessor = pk.item();
    var prok = new Enumerator(objProcessor.Properties_);
    for(; !prok.atEnd(); prok.moveNext())
    {
        var objProp = prok.item();
        if(objProp.Name == "NumberOfCores")
        {
            iMaxMul += objProp.Value;
        }
    }
}

var strResultNamePre = "Success";
var sCmdQuery = "Select * from Win32_Process where Name = 'cmd.exe'";

// 取得根文件夹
var strRootDir = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.length - WScript.ScriptName.length - 1);
var objRootDir = fso.GetFolder(strRootDir);

ArrageTask(files, iMaxMul);
// 收集打印已完成的结果
function ShowFinishedFiles()
{
    var files = new Enumerator(objRootDir.Files);
    var cmds = WMI.ExecQuery(sCmdQuery);
    var cmdsK =  new Enumerator(cmds);
    for (; !files.atEnd(); files.moveNext())
    {
        var objFile = files.item();
        var strSubFileName = objFile.Name;
        if(strSubFileName.substring(0, strResultNamePre.length) != strResultNamePre)
        {
            continue;
        }

        // 看看文件是不是没有进程在写
        cmdsK.moveFirst();
        for (; !cmdsK.atEnd(); cmdsK.moveNext())
        {
            var bIs = false;
            var cmdPropertyK = new Enumerator(cmdsK.item().Properties_);
            for(; !cmdPropertyK.atEnd(); cmdPropertyK.moveNext())
            {
                var cmdProperty = cmdPropertyK.item();
                if(cmdProperty.Name != "CommandLine")
                {
                    continue;
                }

                // 貌似有些进程对出时间CommandLine变成了NULL,所以判断一哈
                if(cmdProperty.Value != null && cmdProperty.Value.substring(cmdProperty.Value.length - strSubFileName.length - 1, cmdProperty.Value.length - 1) == strSubFileName)
                {
                    bIs = true;
                }
                break;
            }
            if(bIs)
            {
                break;
            }
        }

        if(!cmdsK.atEnd())
        {
            // 还没用完呢
            continue;
        }

        var objTextStream = objFile.OpenAsTextStream(1/*只读*/, -2/*默认编码*/);
        while (!objTextStream.AtEndOfStream)
        {
            WScript.StdOut.WriteLine(objTextStream.ReadLine());
        }
        objTextStream.Close();
        objFile.Delete();
    }
}

// 结束时打印所有结果
function ShowAllFiles()
{
    // 打印结果
    filesK = new Enumerator(objRootDir.Files);
    for (; !filesK.atEnd(); filesK.moveNext())
    {
        var objResultFile = filesK.item();
        var strSubFileName = objResultFile.Name;
        if(strSubFileName.substring(0, strResultNamePre.length) != strResultNamePre)
        {
            continue;
        }
        var objTextStream = objResultFile.OpenAsTextStream(1/*只读*/, -2/*默认编码*/);
        while (!objTextStream.AtEndOfStream)
        {
            WScript.StdOut.WriteLine(objTextStream.ReadLine());
        }
        objTextStream.Close();
        objResultFile.Delete();
    }
}

// 参数:文件列表,最大同时进行任务数
function ArrageTask(files, paramiMaxMul)
{
    var sExeQuery = "Select * from Win32_Process where Name = 'singleprocess.exe'";
    
    var iNo = 0;

    do
    {
        while(WMI.ExecQuery(sExeQuery).count < paramiMaxMul && files.length != 0)
        {
            var strResultName = strResultNamePre + iNo;
            iNo = iNo + 1;
            // 将识别的结果名称传入
            WshShell.Run("singleprocess.bat" + " " + files[0] + " " + ">" + strResultName, 0);

            files.splice(0, 1);
        }
        // 休息一会儿
        WScript.Sleep(300);
        
        ShowFinishedFiles();
    }
    while(WMI.ExecQuery(sExeQuery).count != 0)
    WScript.Sleep(100);

    WScript.Sleep(1000);
    ShowAllFiles();
}

// 打印结束日期
var objFinishDate = new Date();
var strFinishDate = objFinishDate.getYear().toString();
strFinishDate += "-" + ((objFinishDate.getMonth()+1).toString().length < 2 ? "0" : "") + (objFinishDate.getMonth()+1).toString();
strFinishDate += "-" + (objFinishDate.getDate().toString().length < 2 ? "0" : "") + objFinishDate.getDate().toString();
strFinishDate += " " + (objFinishDate.getHours().toString().length < 2 ? "0" : "") + objFinishDate.getHours().toString();
strFinishDate += ":" + (objFinishDate.getMinutes().toString().length < 2 ? "0" : "") + objFinishDate.getMinutes().toString();
strFinishDate += ":" + (objFinishDate.getSeconds().toString().length < 2 ? "0" : "") + objFinishDate.getSeconds().toString();
WScript.StdOut.WriteLine("FinishTime:" + strFinishDate);

 

====================================version 2=============================================

查找要处理的文件列表

@ECHO OFF
setlocal ENABLEDELAYEDEXPANSION
set CURRENT_DIR=%CD%
::设置工作目录
set WORK_PATH=.\work

IF EXIST "%WORK_PATH%\InputFile" (
    del "%WORK_PATH%\InputFile"
)

::遍历文件列表
FOR /F "eol=/delims=" %%i in (%WORK_PATH%\filelist.txt) do (
    set tmp=%%i
    set fileorfolder=!tmp:%%CURRENT_DIR%%=%CURRENT_DIR%!
    FOR /f "delims=" %%j in ('dir /s /b /A:-D !fileorfolder!') do (
        IF EXIST "%%j" (echo %%j >>%WORK_PATH%\InputFile)
    )
)
IF EXIST "%WORK_PATH%\InputFile" (
    cd "%WORK_PATH%"
    cscript.exe /nologo /d mulity2.js
)

exit

 

 多任务执行脚本

var objStartDate = new Date();
var strStartDate = objStartDate.getYear().toString();
strStartDate += "-" + ((objStartDate.getMonth()+1).toString().length < 2 ? "0" : "") + (objStartDate.getMonth()+1).toString();
strStartDate += "-" + (objStartDate.getDate().toString().length < 2 ? "0" : "") + objStartDate.getDate().toString();
strStartDate += " " + (objStartDate.getHours().toString().length < 2 ? "0" : "") + objStartDate.getHours().toString();
strStartDate += ":" + (objStartDate.getMinutes().toString().length < 2 ? "0" : "") + objStartDate.getMinutes().toString();
strStartDate += ":" + (objStartDate.getSeconds().toString().length < 2 ? "0" : "") + objStartDate.getSeconds().toString();
// 打印开始日期
WScript.StdOut.WriteLine("StartTime:" + strStartDate);

String.prototype.Trim = function(){
    return this.replace(/(^s*)|(s*$)/g, "");
}
String.prototype.LTrim = function(){
    return this.replace(/(^s*)/g, "");
}
String.prototype.Rtrim = function(){
    return this.replace(/(s*$)/g, "");
}

var fso = new ActiveXObject("Scripting.FileSystemObject");
var objPathListFile = fso.OpenTextFile("InputFile", 1 , false);
var files = new Array();
while (!objPathListFile.AtEndOfStream)
{
    var strLine = objPathListFile.ReadLine();
    strLine = strLine.Trim();
    if((strLine != "") && (strLine.charAt(0) != "\\"))
    {
        var i = 0;
        for(; i < files.length; i++)
        {
            if(files[i] == strLine)
            {
                break;
            }
        }
        if(i == files.length)
        {
            files.push(strLine);
        }
    }
}
objPathListFile.Close();

var WMI = GetObject("WinMgmts:");
var sProcessorQuery = "Select * from Win32_Processor";

var iMaxMul = 3;
// 看看电脑有几个核
var objProcessors = WMI.ExecQuery(sProcessorQuery);
var pk = new Enumerator(objProcessors);
for (; !pk.atEnd(); pk.moveNext())
{
    var objProcessor = pk.item();
    var prok = new Enumerator(objProcessor.Properties_);
    for(; !prok.atEnd(); prok.moveNext())
    {
        var objProp = prok.item();
        if(objProp.Name == "NumberOfCores")
        {
            iMaxMul += objProp.Value;
        }
    }
}

ArrageTask(files, iMaxMul);

// 参数:文件列表,最大同时进行任务数
function ArrageTask(files, paramiMaxMul)
{
    var WshShell = new ActiveXObject("WScript.Shell");
    var tasks = new Array();
    do
    {
        for(var i = 0; i < tasks.length; )
        {
            if(tasks[i].Status != 0)
            {
                WScript.StdOut.Write(tasks[i].StdOut.ReadAll());
                tasks.splice(i, 1);
            }
            else
            {
                ++i
            }
        }

        while(tasks.length < paramiMaxMul && files.length > 0)
        {
            // 将识别的结果名称传入
            tasks.push(WshShell.Exec("singleprocess.exe" + " " + files[0]));

            files.splice(0, 1);
        }

        // 休息一会儿
        WScript.Sleep(300);
    }
    while(tasks.length > 0)
}

// 打印结束日期
var objFinishDate = new Date();
var strFinishDate = objFinishDate.getYear().toString();
strFinishDate += "-" + ((objFinishDate.getMonth()+1).toString().length < 2 ? "0" : "") + (objFinishDate.getMonth()+1).toString();
strFinishDate += "-" + (objFinishDate.getDate().toString().length < 2 ? "0" : "") + objFinishDate.getDate().toString();
strFinishDate += " " + (objFinishDate.getHours().toString().length < 2 ? "0" : "") + objFinishDate.getHours().toString();
strFinishDate += ":" + (objFinishDate.getMinutes().toString().length < 2 ? "0" : "") + objFinishDate.getMinutes().toString();
strFinishDate += ":" + (objFinishDate.getSeconds().toString().length < 2 ? "0" : "") + objFinishDate.getSeconds().toString();
WScript.StdOut.WriteLine("FinishTime:" + strFinishDate);

 =======================================================================

@ECHO OFF
setlocal ENABLEDELAYEDEXPANSION
set PRJ_DIR=%CD%
rem set I=..
rem set I='%%~pI'
rem echo !I!
::设置工作目录
set WORK_PATH=.\work

IF EXIST "%WORK_PATH%\InputFile" (
    del "%WORK_PATH%\InputFile"
)

set existfile=
::遍历文件列表
FOR /F "eol=/delims=" %%i in (%WORK_PATH%\filelist.txt) do (
    set tmp=%%i
    set fileorfolder=!tmp:%%PRJ_DIR%%=%PRJ_DIR%!
    set time_string=%TIME%
    set existfile=a
    FOR /f "delims=" %%j in ('dir /s /b /A:-D !fileorfolder!') do (
        IF EXIST "%%j" (
            set existfile=b
            echo %%j >>%WORK_PATH%\InputFile
        )
    )
    
    IF !existfile!==a (
        echo !tmp! error
        echo !fileorfolder!
    )
)
IF EXIST "%WORK_PATH%\InputFile" (
    cd "%WORK_PATH%"
    cscript.exe /nologo /d mulity2.js "%WORK_PATH%\InputFile"
)

exit

 

function WriteLog(str)
{
    objLogFile.WriteLine(str);
    objLastLogFile.WriteLine(str);
}

function WriteConsole(str)
{
    WriteLog(str);
    WScript.StdOut.WriteLine(str);
}
var fso = new ActiveXObject("Scripting.FileSystemObject");
var objLogFile = fso.OpenTextFile("log.txt", 8 , true);
var objLastLogFile = fso.OpenTextFile("lastlog.txt", 2 , true);

var objStartDate = new Date();
//objStartDate.getVarDate()-objStartDate.getVarDate()
var strStartDate = objStartDate.getYear().toString();
strStartDate += "-" + ((objStartDate.getMonth()+1).toString().length < 2 ? "0" : "") + (objStartDate.getMonth()+1).toString();
strStartDate += "-" + (objStartDate.getDate().toString().length < 2 ? "0" : "") + objStartDate.getDate().toString();
strStartDate += " " + (objStartDate.getHours().toString().length < 2 ? "0" : "") + objStartDate.getHours().toString();
strStartDate += ":" + (objStartDate.getMinutes().toString().length < 2 ? "0" : "") + objStartDate.getMinutes().toString();
strStartDate += ":" + (objStartDate.getSeconds().toString().length < 2 ? "0" : "") + objStartDate.getSeconds().toString();
// 打印开始日期
WriteConsole("StartTime:" + strStartDate);

String.prototype.Trim = function(){
    return this.replace(/(^s*)|(s*$)/g, "");
}
String.prototype.LTrim = function(){
    return this.replace(/(^s*)/g, "");
}
String.prototype.Rtrim = function(){
    return this.replace(/(s*$)/g, "");
}

var aryError = new Array();

function RecordError(str)
{
    var reError = /(Error|Warning|Info)\s(\d+)\:/gim;
    while(reError.exec(str))
    {
        aryError.push(RegExp.$2);
    }
}

var objPathListFile = fso.OpenTextFile("File", 1 , false);
var files = new Array();
while (!objPathListFile.AtEndOfStream)
{
    var strLine = objPathListFile.ReadLine();
    strLine = strLine.Trim();
    if((strLine != "") && (strLine.charAt(0) != "\\"))
    {
        var i = 0;
        for(; i < files.length; i++)
        {
            if(files[i] == strLine)
            {
                break;
            }
        }
        if(i == files.length)
        {
            files.push(strLine);
        }
    }
}
objPathListFile.Close();

var WMI = GetObject("WinMgmts:");
var sProcessorQuery = "Select NumberOfCores, NumberOfLogicalProcessors from Win32_Processor";

var iMaxMul = 1;
// 看看电脑有几个核
var objProcessors = WMI.ExecQuery(sProcessorQuery);
if(objProcessors.Count == 1)
{
    var numberOfCore = new Number(objProcessors.ItemIndex(0).Properties_.Item("NumberOfCores"));
    var numberOfLogicalProcessor = new Number(objProcessors.ItemIndex(0).Properties_.Item("NumberOfLogicalProcessors"));
    iMaxMul = numberOfCore * numberOfLogicalProcessor - 1;
}

var deadTestInterval = 30 * 1000;
var WshShell = new ActiveXObject("WScript.Shell");
ArrageTask(files, iMaxMul);

function SetPriorityLow(processId)
{
    var sCmdQuery = "Select * from Win32_Process where ProcessId = " + processId;
    var cmds = WMI.ExecQuery(sCmdQuery);
    if(cmds.Count != 1)
    {
        return 0;
    }
    /*
    64 低
    32 标准
    128 高
    256 实时
    Idle 低
    Below Normal 低于标准
    Normal 标准
    Above Normal 高于标准
    High Priority 高
    Realtime 实时
    */
    try
    {
        cmds.ItemIndex(0).SetPriority(64);
    }
    catch (e)
    {
        WriteConsole("Process" + processId + " setpriority failed");
    }
}
function GetCPUTime(processId)
{
    var sCmdQuery = "Select KernelModeTime, UserModeTime from Win32_Process where ProcessId = " + processId;
    var cmds = WMI.ExecQuery(sCmdQuery);
    if(cmds.Count != 1)
    {
        return 0;
    }

    var kernelModeTime = new Number(cmds.ItemIndex(0).Properties_.Item("KernelModeTime").Value);
    var userModeTime = new Number(cmds.ItemIndex(0).Properties_.Item("UserModeTime").Value);
    //debugger;
    return (kernelModeTime + userModeTime);
}

// 参数:文件列表,最大同时进行任务数
function ArrageTask(files, paramiMaxMul)
{
    function Task(time, file, taskinfo)
    {
        this.m_cpuTime = 0;
        this.m_time = time;
        this.m_file = file;
        this.m_info = taskinfo;
    }

    var tasks = new Array();
    do
    {
        var currentTime = (new Date()).getVarDate();
        //WScript.StdOut.WriteLine("tasknum:" + tasks.length);
        for(var i = 0; i < tasks.length; )
        {
            if(tasks[i].m_info.Status != 0)
            {
                var strOutput = tasks[i].m_info.StdOut.ReadAll();
                RecordError(strOutput)
                WriteConsole(strOutput);
                tasks.splice(i, 1);
            }
            else
            {
                //WScript.StdOut.WriteLine("file" + tasks[i].m_file + ":" + tasks[i].m_info.Status);
                if((currentTime - tasks[i].m_time) > deadTestInterval)
                {
                    //WScript.StdOut.WriteLine(GetCPUTime(tasks[i].m_info.ProcessId));
                    //debugger;
                    //WScript.StdOut.WriteLine("Process" + " " + tasks[i].m_file + " " + "too" + " " + "long!!");
                    tasks[i].m_time = currentTime;
                    // 触发一下,不然会有些任务死掉,不明原因
                    var cpuTime = GetCPUTime(tasks[i].m_info.ProcessId);
                    if(cpuTime > tasks[i].m_info.m_cpuTime)
                    {
                        tasks[i].m_info.m_cpuTime = cpuTime;
                    }
                    else
                    {
                        //tasks[i].m_info.StdOut.ReadAll();
                        //tasks[i].m_info.Terminate();
                        // 不占CPU的任务了,直接读取等它死了
                        var strOutput = tasks[i].m_info.StdOut.ReadAll();
                        RecordError(strOutput)
                        WriteConsole(strOutput);
                    }
                }
                ++i
            }
        }

        while(tasks.length < paramiMaxMul && files.length > 0)
        {
            // 将识别的结果名称传入
            var process = WshShell.Exec("singleprocess.exe" + " " + files[0]);
            SetPriorityLow(process.ProcessId);
            tasks.push(new Task((new Date()).getVarDate(), files[0], process));

            // 将识别的结果名称传入
            process = WshShell.Exec("singleprocess2.exe" + " " + files[0]);
            SetPriorityLow(process.ProcessId);
            tasks.push(new Task((new Date()).getVarDate(), files[0], process));

            files.splice(0, 1);
        }

        // 休息一会儿
        WScript.Sleep(50);
    }
    while(tasks.length > 0)
}

var strError = "Error:" + aryError.length;
WriteConsole(strError);

// 打印结束日期
var objFinishDate = new Date();
var strFinishDate = objFinishDate.getYear().toString();
strFinishDate += "-" + ((objFinishDate.getMonth()+1).toString().length < 2 ? "0" : "") + (objFinishDate.getMonth()+1).toString();
strFinishDate += "-" + (objFinishDate.getDate().toString().length < 2 ? "0" : "") + objFinishDate.getDate().toString();
strFinishDate += " " + (objFinishDate.getHours().toString().length < 2 ? "0" : "") + objFinishDate.getHours().toString();
strFinishDate += ":" + (objFinishDate.getMinutes().toString().length < 2 ? "0" : "") + objFinishDate.getMinutes().toString();
strFinishDate += ":" + (objFinishDate.getSeconds().toString().length < 2 ? "0" : "") + objFinishDate.getSeconds().toString();
WriteConsole("FinishTime:" + strFinishDate);
//}
objLogFile.Close();
objLastLogFile.Close();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

光电经纬仪是最早、最广泛应用于飞行器测控领域的光电跟踪测量设备,它 的组成部分包括大地测量光学经纬仪、激光跟踪测量系统、微机控制系统与图像 处理系统组成。光电经纬仪通过记录飞行过程中的目标图像,并测量传动机架的 角度,从而获得目标飞行参数,它在飞行实况记录中发挥重要的作用 [1] 。此外, 它还可以实现迅速定位目标位置和自动跟踪高速目标,已被广泛地应用于诸如航 天发射、飞行器测控等光电测量领域 [1] 。 随着数字图像处理等技术的发展,光电经纬仪由胶片式成像向数字式成像转 变。此外,高帧速率、高分辨率成像传感器技术已被广泛应用于光电经纬仪。这 些给光电经纬仪实时图像处理平台的发展带来新的挑战:复杂图像处理算法的实 现和数据吞吐量的巨大需求 [1-2] 。 DSP 作为一种密集型数据运算与实时信号处理的微处理器,能够很好的满足 复杂图像处理算法、实时性处理的需求。DSP 技术经过多年的发展,被广泛应用 在信号、图像、通信等技术领域,尤其是高性能计算、高速实时图像处理、超大 数据量处理的军用电子领域 [2] 。现今的图像处理平台由于芯片单片运算能力受到 限制,绝大部分使用了多个 DSP + FPGA 的架构,才能勉强实现实时图像处理任 务 [3] 。但是这样的平台带来的困难是显而易见的: 1. 系统结构复杂。采用多片 DSP+FPGA 的架构,系统的整体处理性能受片 间(DSP 与 FPGA 之间、DSP 与 DSP 之间)通信带宽瓶颈而下降。 2. 系统功耗大。多片 DSP 在单块电路板上的集成度越高,带来了单板整体 功耗的增加和散热的问题,导致单板多片 DSP 整体处理性能的可靠性和稳定性。 3. 系统调试困难。由于系统结构的复杂,导致系统的调试异常的困难。芯 片之间的任务分配、数据传输、并行处理非常复杂,使得产品在设计、调试、生 产阶段的难度加大。 本文研究的课题来源于光电经纬仪图像处理平台由多片 DSP 架构升级到多 核 DSP 架构而提出的系统应用需求。结合实验室的项目情况,本文将重点放在 多核 DSP 并行的以下相关技术: 1. DSP+FPGA 架构下图像数据流的设计。光电经纬仪的图像处理系统需要 兼容前端的多种图像输入格式,包括 CameraLink、SDI 以及光纤接口,DSP+FPGA载板搭配不同的子板就可以实现输入的灵活性;此外,DSP+FPGA 图像处理系 统中的高速 SRIO 接口用于图像数据通信。本文在 CameraLink 和 SRIO 这两个关 键接口做了一定的研究工作。 2. 多核环境下并行访问共享/外部存储器的性能研究和设计原则分析。多核 DSP 中存在多个主设备,包括多个 DSP 内核、多个 EDMA 设备等,它们并行访 问存储器的数据带宽,对于应用程序存储资源的安排、软件结构的设计是至关重 要的。 3. 多核 DSP 并行调度方案的研究。多核 DSP 图像处理平台,一方面要实 现复杂的图像处理算法,另一方面要满足超大运算量对实时性处理的需求。基于 多核的系统应用开发关键的一步,就是选择合适的处理模型实现任务并行调度。 本文将介绍多核 DSP 并行调度的几种方案,并以算法实例对主从模型进行分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值