This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMDSEVM6678:在 TMDSEVM6678上加载大型程序(140MB)每个内核需要5分钟。 这是正常的吗?

Guru**** 2538950 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/897929/ccs-tmdsevm6678-loading-a-big-program-140mb-on-tmdsevm6678-takes-5mins-per-core-is-it-normal

器件型号:TMDSEVM6678

工具/软件:Code Composer Studio

我准备加载一个相当大的(140MB、许多嵌入式资源、例如 图像等) TMDSEVM6678上的程序(.out)...

该程序使用 OpenMP、我正在使用 来自 C:\ti\openmp_dsp _c667x_2_06_03_00\packages/examples\hello_with _make 示例的.cfg 文件来编译和链接我的代码。

我不能理解.cfg 文件中发生的情况...

因此、根据 此处演示的示例加载程序、我要做 的是对8个内核进行分组、然后将程序加载到我创建的内核组上。

我不明白为什么程序必须单独加载到每个内核上???!! RAM 是否在所有内核之间共享???

因为每个内核加载140MB 大约需要5分钟,而我认为没有理由为每个内核加载140MB……我一定会错的……

如果您有任何提示/意见或建议,请告诉我...

此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mike:

    [引用用户="Mike ITGeek"]

    因此、根据 此处演示的示例加载程序、我要做 的是对8个内核进行分组、然后将程序加载到我创建的内核组上。

    我不明白为什么程序必须单独加载到每个内核上???!! RAM 是否在所有内核之间共享???

    [/报价]

    如果加载程序的 RAM 在所有内核之间共享、那么您应该只需加载一次程序。 但是、您需要加载其他内核的调试符号、以便所有内核都具有调试可见性。 也许这就是文件所指的内容。

    另请注意、有两种类型的组-标准组和 同步组。 同步组会将组中的所有内核视为一个实体。 我不确定您的器件是否支持它。 如果出现同步组的选项、我会说它受支持。要使同步组正常工作、 需要将正在引用的存储器指定为调试器的"共享"

    [引用 user="Mike ITGeek"]因为每个内核加载140MB 大约需要5分钟[/引用]

    至于程序的缓慢加载、您使用的是哪个调试探针?

    谢谢

    Ki  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Ki"]

    如果加载程序的 RAM 在所有内核之间共享、那么您应该只需加载一次程序。 但是、您需要加载其他内核的调试符号、以便所有内核都具有调试可见性。 也许这就是文件所指的内容。

    [/报价]

    因此我只需在一个内核上加载程序,同时在所有其他7个内核上加载符号... 正确?

    [引用 user="Ki"]

    另请注意、有两种类型的组-标准组和 同步组。 同步组会将组中的所有内核视为一个实体。 我不确定您的器件是否支持它。 如果出现同步组的选项、我会说它受支持。要使同步组正常工作、 需要将正在引用的存储器指定为调试器的"共享"

    [/报价]

    我相信它支持同步组,因为我可以在上下文菜单(CCS9.2)中看到,如果我选择了一些内核,然后右键单击... 我只是不知道如何指定“内存是共享的”,因为我正在使用 makefile (我使用 hello openmp 示例中的.cfg 文件构建自己)来构建可执行文件... 我选中了"""="">使用 CCS 调试多核器件"。 在上面的链接中,您提到我找不到任何相关的东西... 我猜必须为调试会话设置它、因为我使用 makefile 来构建代码... 请告诉我...

    [引用 user="Ki"]

    至于程序的缓慢加载、您使用的是哪个调试探针?

    [/报价]

    我不知道诚实…… 我正在使用 TMDSEVM6678LE ( 我在 sepc 页面中找不到探针 ...) 调试探针是硬件模块还是 CCS 模块? (抱歉,它可能听起来像个愚蠢的问题...:D)

    请告诉我... 非常感谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Mike ITGeek">因此,我只需在一个内核上加载程序,同时在所有其他7个内核上加载符号... 正确的?[/引用]

    是(假设代码从共享存储器运行、并且为调试器正确配置了共享存储器)

    [引用 user="Mike ITGeek"]我只是不知道如何指定"存储器是共享的",因为我正在使用 makefile (我使用 hello openmp 示例中的.cfg 文件构建自己)来构建可执行文件

    为调试器指定共享存储器是通过 调试器存储器映射完成的、它与构建根本无关。 有关如何执行此操作的更多详细信息、请参阅以下文章:

    https://software-dl.ti.com/ccs/esd/documents/ccs_smp-debug.html#shared-memory

    [报价用户="Mike ITGeek"]我使用的是 TMDSEVM6678LE[/报价]

    如果要插入 EVM 基板上的 USB1 mini-USB 端口、则使用 XDS100v1。 这是我们性能最低的调试探针之一、将会解释您看到的下载速度缓慢。 您的电路板是否附带额外的夹层卡? 如果是、则用于 XDS560v2 调试探针支持。 XDS560v2的性能要快得多。 您使用的是什么?

    谢谢

    Ki

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Ki"]这是我们性能最低的调试探针之一,它将解释您看到的下载速度慢。 您的电路板是否附带额外的夹层卡? 如果是、则用于 XDS560v2 调试探针支持。 XDS560v2的性能要快得多。 您使用的是什么?[/quot]

    实际上、您的数字听起来与默认 XDS560v2性能的预期性能一致。 请参阅下图 C6600:

    http://software-dl.ti.com/ccs/esd/documents/application_notes/appnote-debug_probe_performance_results.html#load-results-on-c6600

    在~480kb/s 的速率下、这将与140MB *。out 文件的~5分钟下载速度保持一致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Ki"]

    Ki
    这是我们性能最低的调试探针之一、将会解释您看到的下载速度缓慢。 您的电路板是否附带额外的夹层卡? 如果是、则用于 XDS560v2 调试探针支持。 XDS560v2的性能要快得多。 您使用的是什么?

    [/报价]

    它出现在 CCS 调试器视图中的 XDS560v2 ... 但我不知道为什么它有 mini-USB。 感谢您的高性能链接... 另一件事是打印语句(例如 std::cout)也非常慢(几乎每秒100个字符),这使我认为我是在低频设置下运行 DSP (我听说过)... 是否有任何方法可以检查频率?



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、听起来您有 XDS560v2。 对于140MB *。out 文件、5分钟的时间听起来不错。

    [引用 user="Mike ITGeek">让我觉得我是在低频设置下运行 DSP (听说过)... 是否有任何方法可以检查频率?[/quot]

    我不确定。 我建议在 处理器论坛中开始新的主题。器件专家可以为您提供进一步的帮助。

    谢谢

    Ki

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    [引用 user="Mike ITGeek">另一件事是,打印语句(例如 std::cout)也非常慢(几乎每秒100个字符),这让我认为我是在低频设置下运行 DSP (我听说过)... 是否有任何方法可以检查频率?[/quot]

    控制台的速度在很大程度上取决于多个因素、例如代码优化、printf 支持级别、代码放置在快速内部 RAM 中而不是外部慢速 DDR 中、启用/禁用高速缓存等  

    如果您在 Ki 之前发送的页面中向下滚动并到达控制台 I/O 比较部分、您将看到 C66x 系列器件上控制台 I/O 的结果、每字符大约为1.2ms。  

    此致、

    拉斐尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    [引用 user="desouza"]

    控制台的速度在很大程度上取决于多个因素、例如代码优化、printf 支持级别、代码放置在快速内部 RAM 中而不是外部慢速 DDR 中、启用/禁用高速缓存等  

    [/报价]

    我理解... 我确保使用代码优化级别3,并将代码放置在 MSMC... 代码是相当简单的测试用例、您可以在下面的编译命令和 CTG 文件中看到。:

    #include 
    #include 
    //#include 
    #include 
    
    int main(){
    //printf ("=程序启动=-\n");
    #define NE(((int) 1e4)
    double oa[NE];
    int i;
    for (i = 0;i < NE;i++){
    OA [i]= sin (i)+ cos (i)+ tan (i);
    std:::cout <<"std:::cout 此处的行号为:"<< i << std::endl;
    }
    // for (i = 0;i < NE;i++){
    // OA [i]= sin (i)+ cos (i)+ tan (i);
    // printf ("printf 此处为行号:%d \n",i);
    //}
    
    //printf ("--=程序结束=-\n");
    }
    

    /*
    版权所有(c) 2012-2015年,德州仪器公司
    *保留所有权利。
    *
    *
    只要
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    ***二进制形式的再发行必须在
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    ***未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *、
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
    *贡献者都不对任何直接、间接、偶然、特殊、
    *模范、 或相应的损害(包括但不限于
    *采购替代产品或服务;丧失使用、数据或利润;
    *或业务中断)、但出于任何责任理论
    、*无论是在合同中、严格责任还是由于
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    、*即使已获悉可能会发生此类损坏。
    */
    
    
    ********* //*
    段映射 */
    ********* /
    var program = xdc.useModule('xdc.cfg.Program');
    // var BIOS = xdc.useModule('ti.sysbios.BIOS');
    
    program.sectMap[".args"] = new Program.SectionSpec ();
    program.sectMap[".bss"] = new Program.SectionSpec ();
    program.sectMap[".cinit"] = new Program.SectionSpec ();
    program.sectMap[".cio"] = new Program.SectionSpec ();
    program.sectMap[".const"] = new Program.SectionSpec ();
    program.sectMap[".data"] = new Program.SectionSpec ();
    program.sectMap[".far"] = new Program.SectionSpec ();
    program.sectMap[".fardata"] = new Program.SectionSpec ();
    program.sectMap[".neardata"]= new Program.SectionSpec ();
    program.sectMap[".rodata"] = new Program.SectionSpec ();
    program.sectMap[".stack"] = new Program.SectionSpec ();
    program.sectMap[".switch"] = new Program.SectionSpec ();
    program.sectMap[".sysmem"] = new Program.SectionSpec ();
    program.sectMap[".text"] = new Program.SectionSpec ();
    // Program.sectMap["systemHeap"]= new Program.SectionSpec ();
    
    //必须将这些段放在核心本地存储
    器 program.sectMap[".args"].loadSegment 中 ="L2SRAM";
    program.sectMap[".cio"].loadSegment ="L2SRAM";
    
    //
    在// OpenMP 中,以下数据段中的变量可能会被“共享”。 这些段必须放置在共享存储器中。
    program.sectMap[".bss"].loadSegment ="DDR3";
    program.sectMap[".cinit"].loadSegment ="DDR3";
    program.sectMap[".const"].loadSegment ="DDR3";
    program.sectMap[".data"].loadSegment ="DDR3";
    program.sectMap[".far"].loadSegment ="DDR3";
    program.sectMap[".fardata"].loadSegment ="DDR3";
    program.sectMap[".neardata"].loadSegment ="DDR3";
    program.sectMap[".rodata"].loadSegment ="DDR3";
    program.sectMap[".sysmem"].loadSegment ="DDR3";
    //Program.sectMap["systemHeap"].loadSegment="DDR3";
    
    //内核共享的代码段-放置在共享存储器中以避免复制
    program.sectMap[".switch"].loadSegment = program.platform.codeMemory;
    program.sectMap[".text"].loadSegment = program.platform.codeMemory;
    
    //调整默认堆栈的大小并将其放置在 L2SRAM
    var deviceName = String (Program.cpu.deviceName);
    if (deviceName.search("DRA7XX")=-1){program.stack = 0x20000;}
    否则 {program.stack = 0x8000;}
    program.sectMap[".stack"].loadSegment ="L2SRAM";
    
    //由于没有参数传递给 main、因此将.args 大小设置为0
    program.argSize = 0;
    
    
    //设置堆系统大小
    // BIOS.heapSize = 0x12000000;
    // BIOS.heapSection ="systemHeap";
    
    
    /******** /*
    OpenMP 运行时配置*/********
    //
    
    在编译
    中包含 OMP 运行时 var ompSettings = xdc.useModule("ti.runtime.openmp.Settings");
    
    //如果应用程序使用 BIOS 组件或依赖 BIOS 组件,则设置为 true
    ompSettings.usingRtsc = true;
    
    if (ompSettings.usingRtsc)
    {
    /*为 BIOS 配置 OpenMP
    *- OpenMP* configureCores (masterCoreId、numberofCoresInRuntime)
    * 配置主内核的 ID 和内核数
    * 运行时可用。
    *
    
    VAR OpenMP = xdc.useModule('ti.runtime.ompbios.OpenMP');
    
    //配置主内核的索引和可用内核的数量
    //到运行时。 内核是连续的。
    OpenMP*主 CoreIdx = 0;
    
    //根据器件设置内核数
    如果 (deviceName.search("DRA7XX")!=-1){OpenMP*= 2;}
    否则,如果(deviceName.search("6670")!=-1){ OpenMP*= 4;}
    否则,如果(deviceName.search("6657")!=-1){ OpenMP*= 2;}
    否则,如果(deviceName.search("K2L")!=-1){ OpenMP*= 4;}
    其他 { OpenMP*= 8;}
    
    //拉入 Platform.XDC 中描述的内存范围以配置运行时
    VAR DDR3 = Program.cpu.memoryMap["DDR3"];
    VAR DDR3_NC = Program.cpu.memoryMap["DDR3_NC";
    VAR MSMC = Program.cpu.memoryMap["MSMCSRAM"];
    var msmcNcVirt= Program.cpu.memoryMap["OMP_MSMC_NC_virt"];
    var msmcNcPhy = Program.cpu.memoryMap["OMP_MSMC_NC_PHY"];
    
    // BIOS.heapSize = 0x18;
    // BIOS.heapSection ="systemHeap";
    
    //使用内存范围信息初始化运行时间
    if (deviceName.search("DRA7XX")=-1){
    OpenMP* msmcBase = MSMC.base
    OpenMP* msmcSize = MSMC.len;
    
    OpenMP* msmcNoCacheVirtualBase = msmcNcVirt.base;
    OpenMP* msmcNoCacheVirtualSize = msmcNcVirt.len;
    
    OpenMP*。msmcNoCachePhysicalBase = msmcNcPhy.base;
    }
    其他
    {
    OpenMP*分配堆栈= true;
    OpenMP*分配堆栈 FromHeapSize = 0x010000;
    
    OpenMP* HASMsmc =错误;
    OpenMP*版 NoCacheBase = DDR3_NC.base;
    OpenMP*版。ddrNoCacheSize = DDR3_NC.len;
    }
    
    OpenMP*版 = DDR3.base;
    OpenMP*文件大小 = DDR3.len;
    
    //使用 HeapOMP 配置内存分配
    // HeapOMP 句柄
    //- BIOS 组件发出的内存分配请求(内核本地内存)
    //-使用 IPC 模块启用共享内存分配
    //从同一堆中分配内存的多个内核-由 malloc 使用
    if (deviceName.search("DRA7XX")=-1){
    VAR HeapOMP = xdc.useModule('ti.runtime.ompbios.HeapOMP');
    
    //必须为 IPC 初始化共享区域0
    VAR sharedRegionId = 0;
    
    //内核本地堆的大小
    VAR localHeapSize = 0x8000;
    
    //所有内核共享的堆的大小
    // var sharedHeapSize = 0x08000000;
    var sharedHeapSize = 0x08000000;
    
    //初始化共享区域并在 DDR3存储器区域中创建堆
    VAR SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
    SharedRegion.setEntryMeta (sharedRegionId、
    {base:dr3.base、
    Len:sharedHeapSize、
    ownerProId:OpenMP*。masterCoreIdx、
    高速缓冲启用:true、
    createHeap:true、
    IsValid:true、
    名称:"DDR3_SR0"、
    });
    
    //配置和设置 HeapOMP
    HeapOMP.configure (sharedRegionId、localHeapSize);
    }
    其他
    {
    OpenMP.useIpcSharedHeap = false;
    OpenMP*分配本地 HeapSize = 0x8000
    OpenMP*分配共享 HeapSize = 0x00800000
    }
    
    
    VAR 启动= xdc.useModule('xdc.runtime.Startup');
    startup.lastFxns.$add ('&_TI_omp_initialize_rtsc_mode');
    }
    否则
    {
    /*调整堆的大小。 必须将其放置在共享存储器中*
    program.heap = sharedHeapSize;
    }
    

    调用:XDCtools
    "C:/ti/ccs920/xdctools_3_60_01_27_core/xs "-xdcpath="C:/ti/openmp_dsp_c667x_2_06_03_00/packages;C:/ti/pdk_c667x_2_0_15/packages;C:/ti/ctoolslib_2_2_0_0/packages;C:/ti/linalg_1_2_0_0/packages;C:/ti/ipc_3_50_04_07/packages;C:/ti/libarch_1_0_0_0/packages;C:/ti/ndk_3_61_01_01/packages;C:/ti/bios_6_76_02_02/packages;C:/ti/uia_2_30_01_02/packages;C:/ti/xdais_7_24_00_04/packages;C:/ti/xdais_7_24_00_04/examples;C:/ti/openmp_dsp_c667x_2_06_03_00/packages/ti/runtime/openmp/platforms/evm6678;" XDC.tools.configuro -o Debug /configdmak -t "
    (因为/ti/edma3_lld_2_12_05_30C/packages ti.runtime.openmp.platforms.evm6678 -config.t)包为/ti/ccs920/ccs/tools/compiler/ti-cgt-c6000_8.3.6 -d.p.r.r.r.cfg .c .c .c .c .gp.gp.gp.c、因为它是-d.p.c .r.r.c .gp.gp.r.c、因为它是一个-config.r.c
    正在为软件包 configPkg 生成接口(因为 package/package.xdc.inc 比 package.XDC 旧)...
    从 package/cfg/omp_config_pe66.cfg 配置 omp_config.xe66 ...
    为设备配置 OpenMP 运行时:TMS320C6678
    生成自定义 ti.sysbios 库 makefile ...
    链接库 ti.drv.qmss:./lib/c66/ti.drv.qmss.ae66
    正在链接库 ti.csl:./lib/c6678/c66/release/ti.csl.ae66
    正在开始构建库源...
    制作 C:/Users/Mike-laptop/workspace_v9_2/ark_cpplab/src/sysbios/sysbios.ae66 ...
    已完成库构建。
    cle66软件包/cfg/omp_config_pe66.c……
    已完成构建:./omp_config.cfg
    听到...
    "c:/ti/ccs920/ccs/tools/compiler/ti-cgt-c6000_8.3.6/bin/cl6x -mv6600 -include_path="C:/Users/Mike-laptop/workspace_v9_2/hello_openmp -include_path="C:/ti/ccs920/ccs/tools/compiler/ti-cgt-c6000_8.3.6/include -include_path="C:/ti/openmp_dsp_c667x_2_06_03_00/packages/ti/runtime/openmp -i/arK_cpplab/arK_matrix -ii/example_ctrad_cprab/impcv -i/cp_cprap/linalg -i=i/cp=example_example/ctrad_example/ctrab/ap_example_example.-example_ctrab/ap_ctrab/ap_example.-ctrab/icab/icab/icab_example_port=-ap_example_example_example_example_example_for_example_port=-ctrab/ap_example_cep-ap_example_ctrab/ap_example.-ctrab/icab/icab/icab/icab/icab/icab/icab/icab/icab/icab/ap_export_example_for_example_port_example_port_example.-c -duse_ark_fs -opt_level=0 -g -optimize_wave_debug=on -D_debug -duse_diag -dmp_NUM_threads=8 -output_file debug/obj/obj/opar.obj -c_opencpplab/board/whiteboard.cpp
    /Users/Mike-laptop/workspace_v9_2/hello_openmp /ti/ccs920/ccs/tools/compiler/ti-cgt-c6000_8.3.6/include "c:/ti/ccs920/ccs/tools/compiler/ti-cgt-c6000_8.3.6/bin/cl6x /ti/openmp_dsp_c667x_2_06_03_00/packages/ti/runtime/openmp -include_path=-excob_apar_i_example/cob_apar_ap_i=-example/ctrab/ip_ap_ap_ipc.ob/ipcob_example/cob_apar_ap_ap_i_ipc.ob/ipc.ob/ipc.ob_example/cob_ap_ap_ipc.ob_ap_ap_ipc.ob_ap_ipc.ob_example_cob/ipc.ob_example_cob_ap_cob/cc=-cob/ipc.ob_cob_ap_ap_ap_ap_ap_ap_ap_ipc.ob_ap_ap_example_cob/ipc.ob/ipc.ob_ap_/ti/ccs920/ccs/tools/compiler/ti-cgt-c6000_8.3.6/include /ti/ccs920/ccs/tools/compiler/ti-cgt-c6000_8.3.6/lib
    
    "C:/Users/Mike-laptop/workspace_v9_2/hello_openmp/Debug/configPkg/linker.cmd "、第118行:警告#10068-D:无匹配部分 

    [引用 user="desouza"]

    如果您在 Ki 之前发送的页面中向下滚动并到达控制台 I/O 比较部分、您将看到 C66x 系列器件上控制台 I/O 的结果、每字符大约为1.2ms。  

    [/报价]

    每个 char 1.2ms 的速度非常快... 我的结尾可能有问题… 我尝试更多并更新

    感谢您的意见...

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    让我们随时了解您的进度。

    谢谢

    Ki

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    std:::cerr 相当慢、例如3个字符/秒 但是 std:::金属陶瓷无论如何都应该很慢... 不过、std:::cout 速度非常快、就像每秒一行一样。 我想这是因为 host-dsp 通信延迟...  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Mike 的更新