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

调用CACHE_invL1d无效

我现在有个项目,需要C66788核同时并行执行一个复数矩阵转置算法,输入数据存储在共享存储区的0x0C000100,通过IPC中断触发同步,8核同时读取该输入数据,各内核处理完之后再将结果数据放入DDR3中,现在若用单核连续执行各内核的处理函数,结果是对的,但8核各自运行各自的,算出的结果不对,考虑到CACHE一致性问题,调用CACHE_invL1d API,但是结果依旧是错误的

当前配置环境:

L1p:32K

L1d:32K

L2:512K

输入数据大小:128*128*sizeof(double),分核处理,其实每个Core只需读取输入数据的1/8,各个内核读的数据不重叠

源码:

void dsp_C66x_Mat_Trans_cplx_MultiCore2(volatile float * data_in, int rows, int cols, float * data_out,int CoreID, int TotalCore)
{
int i, j;
int rows_perCore = rows/TotalCore;
int rows_start =0;
int rows_end = 0;
int sft_forword =0; // 内存正向顺序偏移量
double * mat_in = (double *)data_in;//
// double * mat_in = (double*)malloc(rows*cols*sizeof(double));
// double * mat_in = (double*)malloc(rows_perCore*cols*8);
volatile double * mat_out = (double *)data_out;
double * sft_addr = 0;

rows_start = CoreID*rows_perCore;
rows_end = (CoreID+1)*rows_perCore;
sft_forword = rows_start*cols;

sft_addr = (double*)(data_in+(sft_forword<<1));
CACHE_invL1d((char*)sft_addr,rows_perCore*cols*8,CACHE_WAIT);  // 调用CACHE_invL1d也无效

// memcpy((char*)mat_in,(char*)(data_in+(sft_forword<<1)),rows_perCore*cols*8);//将MSM中的数据读回L2,只读1/8,结果不对
// sft_forword =0;

// memcpy((char*)mat_in,(char*)(data_in),rows*cols*sizeof(double));//将MSM中的数据读回L2   整个一块读进来,没问题,但时间不满足要求

for (i = rows_start; i < rows_end; i++) //H
{
for (j = 0; j < cols; j++) // W
{
mat_out[(j * rows) + i] = mat_in[sft_forword++];//
}
}
free((double*)mat_in);
}

ps:

1.若将输入数据存入DDR3中,8核处理的最终结果也是对的

2.由于项目要求的处理时间非常苛刻,不能将输入数据存入DDR3或者将MSM配置成SL3

3.若使用memcpy 将整块输入数据copy到LL2,处理结果也是对的,但是我若只memcopy输入数据的1/8,则处理结果依旧不对

这周就需要出结果,各路大神支支招

Devine:

补充:工程是没跑SYS/BIOS的,纯裸跑算法

Adam Yao94020:

回复 Devine:

你说的数据拷贝结果不对,是什么现象,在CCS的memory窗口中可以看到L1D cache中对应memory的内容,通过memcpy以后,对应L1D cache中的内容是什么。

可以做下面的检查:

每个核读入数据的首地址一定要64字节对齐,数据的长度也要是64字节的整数倍
仔细检查memcpy中首地址,长度是否正确。
通过CCS的memory窗口仔细观察memcpy之前和之后,L1D cache中的内容

user3757070:

回复 Adam Yao94020:

1这个是怎么理解   拷贝数据  需要64字节对齐吗?  

赞(0)
未经允许不得转载:TI中文支持网 » 调用CACHE_invL1d无效
分享到: 更多 (0)