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

c6678 多核 一致性

目前项目为图像处理,需要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

赞(0)
未经允许不得转载:TI中文支持网 » c6678 多核 一致性
分享到: 更多 (0)