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.
大家好、
我最近一段安静的时间一直在使用 OpenMP 应用程序。 我一直在使用以下 cfg 文件。
C:\ti\openmp_dsp_c667x_2_06_03_00\packages\examples\hello_with _make\omp_config.cfg
代码中有一个段用于设置
OpenMP*分配堆栈= true;
OpenMP*分配堆栈 FromHeapSize = 0x010000;
我在下面的代码中不完全理解上述内容、我希望专业人士对此提供意见。 它到底做了什么、它可以用作 program.stack 的替代方案吗?? 此设置是否适用于 TMDSEVM6678LE。
我期待转发任何评论。
谢谢
//使用内存范围信息初始化运行时间 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; }
器件型号:TMS320C6678
工具/软件:TI C/C++编译器
大家好、
我正在尝试为 OpenMP 应用生成随机数。
有一点、我知道随机数生成需要一个种子、它恰好是一个全局变量、使 Rand 函数不安全、这对 OpenMP 多线程应用不安全。 我知道 POSIX 提供了一个线程安全版本的 rand、称为 rand_r、该版本已过时、更适合 drand48系列函数。
请告诉我 OpenMP 应用是否有任何替代方案。
此致、
Mike
器件型号:TMS320C6678
大家好、
我正在阅读如何使用 makefile (此处)构建 OpenMP 应用程序,其中有一部分内容是:
"如果应用程序使用 BIOS 或其他 RTSC 模块、则将 USE_BIOS 设置为1、否则设置为0 "
但我不确定我的应用程序是否需要 BIOS 或其他 RTSC 模块? 我知道、我们迟早需要 EDMA 功能。
请告诉我...
此致
器件型号:TMS320C6678
大家好、
我正在编译和构建 OpenMP hello 字示例并进行了一些修改。 我收到了低度的警告,但我不知道这意味着什么... 我在优化编译器手册中找不到这些部分...
警告#10247-D:在没有 SECTIONS 规范的情况下创建输出段".tbss"
警告#10247-D:在不使用 SECTIONS 规范的情况下创建输出段".tdata"
请告诉我代码 tbss 和 tdata 的哪个部分代表...
我还阅读了以下主题
https://e2e.ti.com/support/processors/f/791/t/495007?-ProcessorSDK-OpenMP-tdata-and-tbss-sections
因此、我更改了 cfg 文件并添加了两个段、并将它们分配给 DDR3、从而使 linker.cmd 反映更改
但是,警告仍然存在... 请告诉我这些部分是什么... 我看到了以下描述、但仍然不确定这意味着什么。
https://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/specialsections.html
任何评论都非常感谢。
此致
omp_config.cfg
/* 版权所有(c) 2012-2015年,德州仪器公司 *保留所有权利。 * * 只要 符合以下条件*、允许以源代码和二进制形式重新分发和使用: * *源代码的重新分发必须保留上述版权 声明*、此条件列表和以下免责声明。 * ***二进制形式的再发行必须在 *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。 * ***未经 事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。 * *本软件由版权所有者和贡献者"按原样"提供 *、 不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或 *贡献者都不对任何直接、间接、偶然、特殊、 *模范、 或相应的损害(包括但不限于 *采购替代产品或服务;丧失使用、数据或利润; *或业务中断)、但出于任何责任理论 、*无论是在合同中、严格责任还是由于 使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他) 、*即使已获悉可能会发生此类损坏。 */ ********* //* 段映射 */ ********* /var program = xdc.useModule('xdc.cfg.Program'); 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[".tdata"] = new Program.SectionSpec (); program.sectMap[".tbss"] = 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[".tdata"].loadSegment ="DDR3"; program.sectMap[".tbss"].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;} // if (deviceName.search("DRA7XX")==1){program.stack = 128*1024;} // if (deviceName.search("DRA7XX")==1){program.stack =(512-20)*1024; 否则} {program.stack = 0x8000;} program.sectMap[".stack"].loadSegment ="L2SRAM"; //由于没有参数传递给 main,因此将.args 大小设置为0 program.argSize = 0; /************ /* 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"]; //使用内存范围信息初始化运行时间 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; //初始化共享区域并在 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; }
linker.cmd
/* 请勿修改此文件;它是从 ti.targets.elf 软件包中的模板* linkcmd.xdt 自动生成的、将被覆盖。 */ * 将''放置在路径周围、因为如果没有这一点、链接 器*会将'-'视为减号运算符、而不是文件名字符。 */ -l"C:\users\Mehdi-laptop\workspace_v9_2\test_omp_recursion\Debug\configPkg\packages/ti\omp_config_pe66.oe66"-l"C:\ti\openmp_dsp_c667x_2_06_00\packages\cti\ti\runtime_bios\tid_ipoti_06\t\tid_ipoti_m\v06\t_ip_us\v06\t_ipot_ipt\t\t\t\t\t\t\v6_ip_ipt\v06\t_em_em_ip_06\t\t\t\t\t\t\v6_emb\v6_emb\v06\t_ip_ip_ip_em_emb\v06\t\t\v06\t\t\v06\t_ip_ip_ip_emb\v06\t\t\t\t\v06\t_emb\t\v06.micro L2SRAM (RW):org = 0x800000,len = 0x60000 OMP_MSMC_NC_virt (RW):org = 0xa0000000,len = 0x20000 OMP_MSMC_NC_PHY (RW):org = 0xc000000,len = 0x20000 MSMCSRAM (rwx):org = 0xc020000,len = 0x3e0000 DDR3 (rwx):org = 0x80000000,len = 0x20000000 } //* 所有已加载软件包的链接器命令文件贡献: */ *来自 xdc.services.global 的内容(空):*/ //*来自 XDC 的内容(空):*/ //*来自 XDC.corevers 的内容(空):*/ *//来自 XDC.ROV 的内容 xdc.runtime (空): // xdc.rov.runtime 中的*//*内容(空):*// //*来自 XDC.shelf 的内容(空):*// *来自 xdc.services.spec 的内容(空):*// *来自 xdc.services.intern.xsr 的内容(空):*// //*来自 xdc.services.intern.gen 的内容(空):*// //*来自 xdc.services.intern.cmd 的内容(空):*// //* 来自 XDC.bld 的内容(空): // *来自 ti.targets.elf 的内容(空):// //*来自 ti.targets.rts6000的内容(空):// *来自 ti.runtime.rts6000 xdc.runtime.knl 的内容(空):////*来自 ti.runtime.argsmain 的内容(空):////////*来自 ti.csl 的内容(空)://////////*来自 ti.sysbios.interfaces 的内容(空)://*/*。 ti.sdo.ipc.interfaces 中的*/*内容(空):*/ * xdc.services.getset 中的内容(空):*/ *来自 ti.sdo.ipc.family 的内容(空):*/ *来自 ti.sysbios.family.c62的内容(空):*/ //来自 ti.sysbios.family.c64p.tci6488的内容(空) */ ti.runtime.device *// openmsdrmscmd:*/(空)*/*来自 ti.runtime.openmp:// */ SECTIONS { /* * RTSC 生成的"C"文件(AppName)的.far 和.fardata 段 *和 RTS 库(* rts*。lib)包含必须执行的全局变量 *每个内核都是本地的。 因此、这些段放置在中 每个内核的本地存储器。 * .localfar: { "* rts*。lib"(.far) "* rts*。lib"(.fardata) "ti.drv.qmss*.ae66"(.far:local) "OMP_CONFIG_PE66.oe66"(.far) "OMP_CONFIG_PE66.oe66"(.fardata) } > L2SRAM /* *放置.TI.TLS 段以避免与相关的链接器缺陷 *默认放置。 由于运行时、不使用此段 *动态分配 TLS。 * TI.TLS > DDR3 /* TLS_INIT 必须放置在尚未通过 MPAX 映射的区域中 因为它由加载程序初始化 * .TI.TLS_INIT > DDR3 } 段 { tomp_gvMem: load= L2SRAM、fill = 0x0 qms: load= OMP_MSMC_NC_PHY、run= OMP_MSMC_NC_virt、fill = 0x0 tomp_svNcMem: load= OMP_MSMC_NC_PHY、run= OMP_MSMC_NC_virt、fill = 0x0 tomp_svMemSlow:load= DDR3 } // ti.catalog.c6000中的内容(空):*/ * ti.catalog 中的内容(空):*/ * ti.catalog.peripherals.hdvicp2中的内容(空):*/ //* xdc.platform 中的内容(空):*/ //* xdc.cfg 中的内容(空):*/ //* ti.platforms.generic 中的内容(空):*/ */*(空) ti.runtime.openmp.platforms.evm6678中的内容(空): ti.sysbios 的*/*内容(空):*/ * ti.sysbios.rts 的内容(空):*/ * ti.linkbios.rts.ti 的内容(ti/sysbios/ti/linkcmd.xdt):*/ /* ti.sysbios.ti.rts 的内容(空)* / sysbios.ti.ti/sysbios.ti.ti/sysbios.ti.ti.ti/sysbios.ti.ti.ti.rts ( 空) *内容 :*/sysbios/sysbios.ti.ti.ti.ti/sysbios.ti.ti.ti/sysbios.ti.ti.ti.ti.ti/sysbios.ti.ti.ti.ti/sysbios.rts (空) // ti_sysbios_family_C66_cache_l1dSize = 32768; ti_sysbios_family_C66_cache_l1pSize = 32768; ti_sysbios_family_c66_cache_l2Size = 131072; //* ti.sysbios.states 中的内容(空):*// (空 ) // //* ti.sdo IPC 的内容(ti/sdo /ipc/linkcmd.xdt):*/ SECTIONS { TI.sdo.ipc.SharedRegion_0:{. += 0x800000000;}运行> 0x8000000000、类型=空载 } //来自 ti.sdo.ipc.ch堆 的内容(空):*/ //来自 ti.sdo.ipc.family.c647x 的内容(空):*/ // ti.sdo.ipc.notifyDrivers 的内容(空):* ////来自 ti.sdo.ipc.gates 的内容(空)* /*(空)://从 ipc.tid.ipc.nulls *(空 ti.runtime.ompbios) // //* configPkg 中的内容(空):// //////*来自 ti.ipc.remoteproc 的内容(ti/ipc/remoteproc/linkcmd.xdt):* ////*来自 xdc.services.io 的内容(空):*// ////* 静态实例对象的符号别名*/ xdc_runtime_Startup__EXECFXN_C = 1; xt_runtime_x_= 1;xtex_rtc_runtime = 1 ; = xdc_r_r_rtc_1;x_r_r_r_runtime_s_ 1;xt_r_r_ex_rand_r_ex_r_r_ex_ex_ .text:load >> MSMCSRAM .ti.decompress: load > MSMCSRAM .stack:加载> L2SRAM 组:加载> DDR3 { .bss: .neardata: .rodata: } .cinit:加载> DDR3 .pinit:加载>> DDR3 init_array:load > DDR3 .const:load >> DDR3 .data:load >> DDR3 .fardata:load >> DDR3 .switch:load >> MSMCSRAM .sysmem:load > ddr3 .far:load >> DDR3 .args:load > L2SRAM align = 0x4、fill = 0{_argsize = 0x0;} .cio:load >> L2SRAM .ti.handler_table:load > DDR3 .c6xabi.exidx:加载> DDR3 .c6xabi.extab:load >> DDR3 .tdata:加载> DDR3 tbss:load > DDR3 vecs:load > MSMCSRAM xdc.meta:load > DDR3、type = copy }
此致
如果有任何更新,请告诉我...
此致