该算法在本文中描述:多道程序多处理器的线程调度。简而言之,计算分布在进程中,每个进程都有一个线程双端队列来完成这项工作。进程可以将(弹出)线程推送到(从)其双端队列的底部,而其他进程可以通过从顶部弹出线程来窃取它的工作。因此,可以通过推送操作动态地创建工作。算法如下。
我的问题是关于 popTop() 工作窃取功能。我不认为它适用于所有情况。例如,假设一个拥有队列 Q 的进程 A 和一个试图从 Q 窃取工作的进程 B,调用 popTop()。假设此时 B 在 popTop() 的第 2 行和 localBot = X 之后被抢占。如果 A 运行并且 popBottom() 直到 Q <= X 的底部,当 B 恢复运行时,它将获得一个已经被 A 处理的线程。
我的想法正确吗?我需要验证它,因为我将实现它以在 CUDA 程序中进行工作平衡。