TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320C6678: 多核写入内存

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:

不清楚,只能建议再调试看看,是不是有可能存在数据覆盖的情况。

赞(0)
未经允许不得转载:TI中文支持网 » TMS320C6678: 多核写入内存
分享到: 更多 (0)