您好:
我们使用DSPC6678的EVM板,利用CCS5.5编程,想利用OpenMp的相关指令进行算法的多核并行运行。利用创龙的一个例程OpenMp_Hello_C6678发现是DSP是可以正常多核运行的,但是当利用我们的程序加载多核运行时,在多核加载.out文件后,点击运行程序却没有反应。我们的程序是在加载完.out文件后,又通过Load Memory的方式向DDR3(0x80000000)的连续地址里添加了两张图片(200×200像素)的数据,请问会是图片数据地址与算法代码地址冲突的问题吗,或者图片数据过大,还是会有什么其他的问题?(我们自己的算法如果不使用OpenMp指令,运行在单核上,加载普通的CMD文件,也是可以正常跑通的。)
下面是多核运行时的CMD文件内容:
-heap 0x1000
-stack 0x1000
/* 库 */
-l ti_runtime_rts6000_debug_e66.ae66
-l ti.drv.qmss.ae66
-l ti_runtime_device_c6678_debug_e66.ae66
-l ti_runtime_openmp_c6678_debug_e66.ae66
MEMORY
{
/****************************************************************************/
/* */
/* DSP 本地内存区域 */
/* */
/****************************************************************************/
/* 注意:每个核心的 0x00872DC0 – 0x0087FFFF 这段地址空间启动的时候被 ROM BootLoader(RBL) 占用! */
/* 注意:核心 0 的 0x00800000 – 0x0081FFFF 这段地址空间启动的时候被 Intermediate BootLoader(IBL) 占用! */
/* 当启动完成后这两段空间可以被应用程序使用! */
L2SRAM(RW) o = 0x00800000 l = 0x00060000 /* 384KB L2 本地静态内存 */
/****************************************************************************/
/* */
/* DSP 全局内存区域 */
/* */
/****************************************************************************/
MSMC_NC_VIRT(RW) o = 0xA0000000 l = 0x00020000 /* 128KB 非缓存多核共享内存(虚拟地址) */
MSMC_NC_PHY(RW) o = 0x0C000000 l = 0x00020000 /* 128KB 非缓存多核共享内存(物理地址) */
MSMCSRAM o = 0x0C020000 l = 0x003E0000 /* 3968KB 多核共享内存 */
DDR3 o = 0x80000000 l = 0x20000000 /* 512MB DDR3 */
}
SECTIONS
{
.Entry :
{
"*rts6000*" (.text:retain)
} > MSMCSRAM START(BootMagic)
.text > MSMCSRAM /* 可执行代码及常数 */
.cinit > DDR3 /* 初始化表(全局及静态变量) */
.const > DDR3 /* 全局及静态常量 */
.switch > MSMCSRAM /* 跳转表 */
.stack > L2SRAM /* 栈 */
.far > DDR3 /* 全局及静态变量(远) */
.fardata > DDR3 /* 已初始化的非静态全局及静态变量(远) */
.cio > L2SRAM /* C 输入输出缓存 */
.sysmem > DDR3 /* 动态内存分配区域(堆) */
.data > DDR3 /* 已初始化的全局及静态变量 */
GROUP
{
.neardata /* 已初始化的非静态全局及静态变量(近) */
.rodata /* 全局及静态常量(近) */
.bss /* 未初始化的全局及静态常量 */
} > DDR3
/* 每核心 .far 与 .fardata 段中的一些全局变量必须本地存储 */
.localfar :
{
"*rts*.lib" (.far)
"*rts*.lib" (.fardata)
"ti.drv.qmss.ae66" (.far:local) } > L2SRAM
/* 线程本地存储 */
.TI.tls > DDR3 /* .TI.tls 段并未被使用 运行时会动态分配 TLS */
.TI.tls_init > DDR3 /* .TI.tls_init 必须被分配到未被 MPAX 映射的地址 */
.tbss > DDR3 /* 未初始化的全局及静态常量(线程) */
.tdata > DDR3 /* 已初始化的全局及静态变量(线程) */
/* OpenMP 运行时 */
.tomp_gvMem load = L2SRAM, fill = 0
.tomp_svNcMem load = MSMC_NC_PHY, run = MSMC_NC_VIRT, fill = 0
.tomp_svMemSlow load = DDR3
/* 队列 */
.qmss load = MSMC_NC_PHY, run = MSMC_NC_VIRT, fill = 0
}
Nancy Wang:
将cmd中的DDR3的起始地址或者将load memory的起始地址改一下不要重叠试一下可以吗?
,
user6033638:
我们程序最开始有一个输出函数,输出"start",改完之后点击运行,就是程序只会输出一个"start",后续还是没有反应。后面就是创建矩阵,接收之前存在DDR里的两幅图像,也不太像是程序跑飞了的样子。程序里用到OpenMp的地方也主要是下面这一块函数:omp_set_nested(1);//允许并行嵌套#pragma omp parallel sections num_threads(4){#pragma omp section{n1 = getf(img1, &feat1);//主体函数,用于处理图像1fprintf(stderr, "%d%d\n", n1, omp_get_thread_num());}
#pragma omp section{n2 = getf(img2, &feat2); //主体函数,用于处理图像2fprintf(stderr, "%d%d\n", n2, omp_get_thread_num());}
}
,
Nancy Wang:
user6033638 说:
我们自己的算法如果不使用OpenMp指令,运行在单核上,加载普通的CMD文件,也是可以正常跑通的。
先创建一个简单的openmp工程看一下有没有问题。
downloads.ti.com/…/building_openmp_app.html
,
user6033638:
我们是基于openmp_dsp_2_01_17_01跑的裸机,普通的OpenMp例程可以运行,但是我们的算法运行了前几句后就没反应了,不知道是不是CMD文件编写的内存不对?
printf("start\n");
int ii, j,result1,mresult1;
unsigned int* ptr1 = (unsigned int*)(0x81000000);
CvMat* mat1 = cvCreateMat(100, 100, CV_8UC1); //这一句运行就没反应了
for (ii = 0; ii < 100; ii++)
{
for (j = 0; j <100; j++)
{
result1 = ptr1[ii * 100 + j];
cvSetReal2D(mat1, ii, j, result1);
}
}
free(ptr1);
,
Nancy Wang:
cmd可以试一下都放到DDR上看一下,并且增大堆栈看一下是否有效。
openmp没有研究的很细,建议可以去英文论坛发帖咨询。