目前项目为图像处理,需要8核并行处理 ,实际测试存在cache 一致性的问题。具体说明如下:
1、将输入数据inbuff 和输出数据 outbuffer放到DDR3中 (想加快速度,使能cache);
2、计算过程中数据相关,见代码
//——————-原始算法—————————————-
//计算均值
double Mean_Inv_Conv_Cut_Image()
{
int i, j;
double sum = 0, num = 0;
double mean_sum = 0;
for (i = 0; i < height_cut; i++)
{
for (j = 0; j < wide_cut; j++)
{
sum = sum + img_data_cut_1[i][j]; //数据相关部分
num = num + 1;
}
}
mean_sum = sum / (num – 2 * wide_cut);
//printf("num is %f\n sum is %f\n meansum is %f\n",num,sum,mean_sum);
return mean_sum;
}
//——————-8核算法—————————————-
#pragma DATA_SECTION(cut_value_1,".Xdata2");
const int cut_value_1[9] = {0,9,18,27,36,45,54,63,71}; //第一块数据
//计算均值多核 mode 分主核 和从核
void Multi_Mean_Inv_Conv_Cut_Image(int coreId,int Mode)
{
int i, j;
double sum = 0, num = 0;
//double num = 0;
double mean_sum = 0;
for(i=(cut_value_1[coreId-1]); i < height_cut ; i++)
{
if(i==cut_value_1[coreId])
{
//printf("i%d end\n",i);
goto EXIT;
}
//printf("core%d start\n",coreId);
for (j = 0; j < wide_cut; j++)
{
SUM[coreId-1] = SUM[coreId-1] + img_data_cut_1[i][j];
}
}
EXIT:
switch (Mode)
{
case MOUDLE_MASTER:
//等待从核完成计算
Semaphore_pend(semHandle, BIOS_WAIT_FOREVER);
num=wide_cut*height_cut;
for(i=0; i < 8; i++)
sum +=SUM[i];
avg_copy = sum / (num – 2 * wide_cut);
break;
case MOUDLE_SLAVE:
// printf("slave sum is %f\n",SUM[coreId-1]);
break;
default:
break;
}
}
3、计算过程中数据无关,见代码
原始算法———————-
void Conv_Cut_Image()
{
int i, j;
for (i = 1; i < height_cut – 1; i++)
{
for (j = 0; j < wide_cut; j++)
{
img_data_cut_1[i][j] = img_data_cut[i – 1][j] * filter[0][0]+ img_data_cut[i][j] * filter[1][0]+ img_data_cut[i + 1][j] * filter[2][0];
img_data_cut_1[i][j] *= -1;
}
}
}
//———-8核算法
void Multi_Conv_Cut_Image(int coreId)
{
int i, j;
for(i=(cut_value[coreId-1]+1); i < height_cut – 1; i++)
{
//printf("core%d start\n",coreId);
for (j = 0; j < wide_cut; j++)
{
img_data_cut_1[i][j] = img_data_cut[i – 1][j] * filter[0][0]+ img_data_cut[i][j] * filter[1][0]+ img_data_cut[i + 1][j] * filter[2][0];
img_data_cut_1[i][j] *= -1;
}
if(i==cut_value[coreId])
{
//printf("core%d end\n",coreId);
return;
}
}
}
问题:1、数据相关代码:实际测试在1-7核可以看到计算之后的数据正确,0核看不到计算之后的数据;
实际测试将数据存放的DDR段 禁用 cache 数据正确 但是时间很慢;
2、数据无关代码 : 实际测试在1-7核可以看到计算之后的数据正确,0核看也可以看到计算之后的数据;
期望解决的:
1、在数据相关情况下,数据的同步问题,cache一致性问题;
Shine:
多核直接操作的共享memory,且使能cache,则core进行读写时需要维护cache一致性,在写之后需要write back cache,读之前需要invalid cache