我理解就是你有:
for (i = 0; i < n; i ++){
for (j = 0; j < m; j ++) {
DO_COMPUTE(i, j);
}
}
在从核上可以尝试:
int global_task_ptr = 0; //设置一个原子变量
void slave_kernel(){
if (_MYID ==0) global_task_ptr = 0; //先清零
athread_syn(ARRAY_SCOPE, 0xffff); //同步防止从核清零前偷跑
int local_task_ptr = 0;
while (1) {
asm volatile("faal %0, 0(%1)\n\t" : "=r"(local_task_ptr): "r"(&global_task_ptr)); //原子取并+1
if (local_task_ptr >= n * m) break;
int i = local_task_ptr / m;
int j = local_task_ptr % m;
DO_COMPUTE(i, j);
}
}
需要DO_COMPUTE(i, j)占用的时间足够长。