各位老师同学,问一个有关动态线程调度的问题。



  • 有一个两层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)占用的时间足够长。


登录后回复