各位老师同学,问一个有关动态线程调度的问题。
-
有一个两层for循环的代码,我想把代码内部的内容写成一个从核函数,但是两层循环的次数均为止,所以准备用动态线程,就是循环体写成从核函数,然后保留主核代码的两层循环,循环内部检测空闲状态的从核,然后将函数加载到空闲的核心上运行,或者抢占任务,但是循环控制变量也是从核函数运行的参数,请问这样的想法应该如何实现呢?
-
@bch 各位大佬,有一点想法也可以来说说啊。。。。。。。。。
-
我理解就是你有:
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)
占用的时间足够长。