void setSyncFlag(int stage, Uint32 core, bool value)
{
CACHE_invL1d(&bSyncCores[0][0], sizeof(bool)*NUM_SYNC_STAGES*NUM_CORE, CACHE_WAIT);
bSyncCores[stage][core] = value;
CACHE_wbL1d (&bSyncCores[stage][core], sizeof(bool), CACHE_WAIT);
}
void waitSyncFlag(int stage, Uint32 core, bool value)
{
do
{
CACHE_invL1d(&bSyncCores[0][0], sizeof(bool)*NUM_SYNC_STAGES*NUM_CORE, CACHE_WAIT);
}while(bSyncCores[stage][core] != value);
//也试过下面这种方法
//while(bSyncCores[stage][core] != value)
//CACHE_invL1d(&bSyncCores[0][0], sizeof(bool)*NUM_SYNC_STAGES*NUM_CORE, CACHE_WAIT);
}
其中stage取值如下:
enum SYNC_STAGES {
SYNC_INIT = 0,
SYNC_INTEGRAL,
SYNC_DETECTION,
SYNC_MERGE_MARKS,
SYNC_MERGE_WINDOWS,
SYNC_CLASSIFY,
NUM_SYNC_STAGES
};
core取值从0到3,就是DNUM,value就是true或者false。
看起来可能是个cache之类的问题,在共享内存中的变量应该被设置正确了,但可能读取的时候没有得到正确值。
Lei Cai:
另外 ,waitSyncFlag(currentStage, 0, 1); 最后一个参数的1跟函数定义的bool的true/false不一致,这是因为我试过把参数从bool换成int,发帖的时候直接拷过来没有发现,不是影响因素。
King Wang1:
o3优化等级很高,看看汇编,是不是把while循环给优化掉了,直接变成死循环了。
建议改成o2试试。
Lei Cai:
回复 King Wang1:
开成O2还是不行
Andy Yin1:
建议你将多核同步的flag变量放在noncache,并且声明为volatile变量测试看看,保证其他core在读共享变量时读到最新的数据。
dennis wu:
回复 Lei Cai:
您好,我遇到同样的问题,开优化选项后程序执行结果不对。请问你的编译器(或者CCS)从哪个版本升级到哪个版本后解决的问题?(我当前的编译器版本是7.2.3).
非常感谢!