学习目标:
OMP ( OpenMP Runtime for SYS/BIOS ) Users Guide
学习内容:
目录
1、OMP产品目录结构
2、用CCSv4/5编译OpenMP例子
3、不用CCSv4/5编译OpenMP例子
4、创建一个新的OMP应用
5、SYS/BIOS OMP和Linux OpenMP运行时的不兼容
6、创建一个RTSC平台
“dataMemory”规则
“codeMemory”规则
“stackMemory”规则
通用平台规则
OMP应用的优化
7、运行构建的OMP程序
用CCS IDE 运行
用提供的运行脚本运行
8、重编译“OMP”产品
4、创建一个新的OpenMP应用
你需要使得你的应用是一个RTSC(Real Time Software Components,实时软件组件)。这包括添加一个 .cfg文件,最简短的cfg文件需要有如下内容:
xdc.loadCapsule(‘ti/omp/common.cfg.xs’);
默认地,被OMP应用使用的核数量等于装置上的最多核数(C6670有4个核、C6678有8个核)。但是,核的数量可以重新配置。应用中处理器核数的设置如下:
var OpenMP = xdc.useModule(‘ti.omp.utils.OpenMP’);
OpenMP.setNumProcessors(3); /Only use CORE0,CORE1 and CORE2/
设置程序共享内存堆。设置堆处为可缓存区。
var HeapOMP = xdc.useModule(‘ti.omp.utils.HeapOMP’);
HeapOMP.sharedRegionId = 2;
HeapOMP.localHeapSize = 0x20000;
HeapOMP.sharedHeapSize = 0x1000000;
//Specify the Shared Region
SharedRegion.setEntryMeta( HeapOMP.sharedRegionnId,
{ base: 0x90000000,
len: HeapOMP.sharedHeapSize,
ownerProcId: 0,
createHeap: true,
isValid: true,
name: “HeapOMP”,
}
);
var Cache = xdc.useModule(‘ti.sysbios.family.c66.Cache’);
Cache.setMarMeta(0x80000000,0x20000000, Cache.PC | Cache.WTE);
对于一些可选择的配置有一些默认值
OpenMP.stackRegionId = -1; //Stack region for dynamic tasks
OpenMP.qmssInit = true; //QMSS to be Initialized by OMP
OpenMP.qmssMemRegion = -1; //QMSS Mem region to be used by OMP
OpenMP.qmssStartIndex = 0; //QMSS Start index to be used by OMP
OpenMP.qmssDestQueueNum = -1; //QMSS Destination Queue to be used by OMP
OpenMP.internalOsal = true; //OMP OSAL to be used
OpenMP.cppiHwSem = 3; //if OMP OSAL,CPPI HW Semaphore
OpenMP.qmssHwSem = 4; //if OMP OSAL,QMSS HW Semaphore
OpenMP.autoDnld = true; //Slave cores load and run by Master core
OpenMP.mpaxIndex = 3; //MPAX Index for mapping DDR to MSMC
如果ti/omp不在编译器的头文件路径中,头文件需要使用绝对路径
i.e.
#include “omp.h”
需要改变为
#include<ti/omp/omp.h>
6、创建一个RTSC平台
为了成功编译和执行一个OMP应用程序,RTSC平台必须满足一定的规则。破坏这些规则会造成某个程序能成功编译但在运行时会发生故障。RTSC平台包含配置,被称为‘dataMemory’、‘codeMemory’、‘stackMemory’,它们决定各种链接段放置的位置。
‘dataMemory’规则
1、共享OpenMP状态包含在RTSC平台的“数据内存”部分。尽管缓存一致性不表现在这个状态上,‘dataMemory’必须设置到没有缓存的共享内存部分。
2、在C66x设备上,只要libomp状态位于非缓存共享内存区,L1D就能被设置成非零值。‘dataMemory’可以设置为MSMCSRAM,只要RAM是通过非缓存的MPAX页面访问的。为了允许这个,OMP运行使用在c_init_00函数之前执行的复位函数,并将整个MSMCSRAM(0x0C0 0000)映射到0xA00 0000处的非缓存别名。
(1)C6678平台(ti.omp.examples.platforms.evm6678)包含内存段“MSMCSRAM_NOCACHE”,该内存段放在了非缓存页。
(2)如果‘dataMemory’被设置成一个内存段,该内存段位于物理地址范围MSMCSRAM(0x0C000000),则L1D必须设置成0K,以使该地址范围不可缓存。
‘codeMemory’规则
1、‘codeMemory’包含代码和常数,它应该被设置成缓存共享存储区。L1P缓存应该总是被设置成32K以最大化性能。
‘stackMemory’规则
1、‘stackMemory’包含数据,数据在每个核里面。‘stackMemory’必须设置到一个存储段,在每个核的L2SRAM中。理想情况下,该存储空间也应该设置成缓存区。(即,如果可能,打开L1D缓存)
通常的平台规则
必须确保平台段0xA0000000地址不重叠本地(0x0C000000地址)平台段范围重合。
/* BAD坏的 (overlapping segments) */
[ “MSMCSRAM” , { name: “MSMCSRAM” , base: 0x0C000000 , len: 0x00200000 } ],
[ “MSMCSRAM_NOCACHE” , {name: “MSMCSRAM_NOCACHE” , base: 0xA0100000, len: 0x00300000} ],
/* GOOG (no overlapping segments) */
[ “MSMCSRAM” , {name : “MSMCSRAM” , base: 0x0C000000 , len : 0x00100000 } ],
[ “MSMCSRAM_NOCACHE” , {name: "MSMCSRAM_NOCACHE " , base: 0xA0100000 , len : 0x00300000 }],
优化OMP应用
‘debug’编译配置文件最好被使用在调试OMP应用时,但使用‘release’编译配置文件将产出最好的性能。整个程序[_debug]配置文件是不宜用的,且不再被支持。请查阅IPC USERs Guide和BIOS Users Guide,以优化内存使用进而改善实时性能。
学习时间:
2020/11/27
学习产出:
翻译OpenMP使用指南重要章节:第4章和第6章。