Part Number:TMS320C6678
TI工程师,您好
采用主从核的模式做多核分区计算矩阵乘法,0核为主核1~7核为从核,结果分区写入内存,代码如下:
bool stepCal(Uint32 COREID){
int i = 0;
int inputIndex2 = 0, outputIndex3 = 0;
int procRowNumber = 0;
double* s_step_loc = malloc(2 * (CHANNEL + 1) * sizeof(double));
double* trans_JR_loc = malloc(2 * (CHANNEL + 1) * sizeof(double));
double* inv_M_loc = malloc((CHANNEL + 1) * (CHANNEL + 1) * sizeof(double));
memset(s_step_loc, 0, 2 * (CHANNEL + 1) * sizeof(double));
memset(trans_JR_loc, 0, 2 * (CHANNEL + 1) * sizeof(double));
memset(inv_M_loc, 0, (CHANNEL + 1) * (CHANNEL + 1) * sizeof(double));
memcpy(trans_JR_loc, trans_JR, 2 * (CHANNEL + 1) * sizeof(double));
memcpy(inv_M_loc, inv_M, (CHANNEL + 1) * (CHANNEL + 1) * sizeof(double));
/*按核编号,分配处理地址范围(工作量)*/
if(COREID == 7){
inputIndex2 = (CHANNEL + 1 – 6 * (8 – COREID)) * (CHANNEL + 1);
outputIndex3 = (CHANNEL + 1 – 6 * (8 – COREID)) * 2;
procRowNumber = 6;
}
else if(COREID == 5 || COREID == 6) {
inputIndex2 = (CHANNEL + 1 – 6 * (8 – COREID)) * (CHANNEL + 1);
outputIndex3 = (CHANNEL + 1 – 6 * (8 – COREID)) * 2;
procRowNumber = 6;
}
else {
inputIndex2 = COREID * 4 * (CHANNEL + 1);
outputIndex3 = COREID * 4 * 2;
procRowNumber = 4;
}
/*矩阵求逆结束后,多核计算步长,由于inv_M矩阵的对称性,不需要转置*/
DSPF_dp_mat_mul_gemm((double*)trans_JR_loc, 1, 2, (CHANNEL + 1), (double*)(inv_M_loc + inputIndex2), procRowNumber, (double*)(s_step_loc + outputIndex3));
for(i = outputIndex3 / 2; i < outputIndex3 / 2 + procRowNumber; i++){
*(s_step + i) = *(s_step_loc + 2 * i);
}
Cache_wbInvAll();
free(s_step_loc);
free(trans_JR_loc);
free(inv_M_loc);
return true;
}
其中,trans_JR,inv_M,s_step 是全局指针变量
函数运行后,每个核用Memory Browser看到的结果一致,如下:
其中,s_step是double型指针,应该有37个非0数据。但是从Memory Browser看到的结果,每个核看到的前4个数据都是0(0核负责前4个核)。请问为什么会发生这个错误
以及,对于1~7核(从核),取消勾选L1D Cache或 L2Cache,Memory Browser看到的内容如下:
请问,Memory Browser看到的是哪一块存储空间的内容(L1D L2 MSMC)?
Nancy Wang:
先从ccs->expressions中看一下s_step指针指向的地址,然后再从memory browser中查看该地址。
,
Hongliang Mao:
可以直接在Memory Browser里输入指针变量名 来查看指针指向的内存
,
Nancy Wang:
s_step指向的地址是0xc1cd348,调试的时候值是从哪个地址开始变化的?
s_step只是在以下代码中进行赋值吗?i是如何变化的?
for(i = outputIndex3 / 2; i < outputIndex3 / 2 + procRowNumber; i++){*(s_step + i) = *(s_step_loc + 2 * i);}
Memory Browser中如果勾选cache,看到的是cache中的数据,如果不勾选看到的是实际物理地址中的数据。
,
Hongliang Mao:
s_step的首地址是0x0C1CD348,内存中存放的是38个,double型数据,第38个数据稳定是0。
s_step只是在以下代码中赋值,C66788个核,输出38个数据,前5个核每个核输出4个数据,后3个核每个核输出6个数据for(i = outputIndex3 / 2; i < outputIndex3 / 2 + procRowNumber; i++){*(s_step + i) = *(s_step_loc + 2 * i);}
现在令,0核输出8个数据,1~6核每个核输出4个数据,7核输出6个数据,s_step内存的每个位置都有正常的数据输出(请问,为什么会有这种变化)
感谢解答Memory Browser的事宜
,
Nancy Wang:
不清楚,只能建议再调试看看,是不是有可能存在数据覆盖的情况。