例如,有三个线程。
- 线程 1 被分配了任务 1、2 和 3。
- 线程 2 被分配了任务 4、5 和 6。
- 线程 3 被分配了任务 7、8 和 9。
任务规模不统一。分配给一个线程的任务具有非常相似的工作集,因此当这三个任务都由同一个线程执行时,缓存将得到有效利用。我还应该注意,这些任务将在具有四个节点的 NUMA 系统上运行。四个线程中的每一个都必须分配给系统的一个节点。
我的问题是关于负载平衡。例如,如果线程 1 在其他任务之前完成其任务并且任务 9 未启动,我希望 Cilk 调度程序将任务 9 分配给线程 1。
欢迎所有解决方案,包括 Cilk Plus、OpenMP 或网络上免费提供的其他调度程序。
更新:线程必须分配给 NUMA 系统的节点,并且这些线程使用的内存位置必须分配在特定节点上。我已经成功地使用libnuma
了 OpenMP。但是,我无法找到如何使用 Cilk、TBB 等将线程映射到节点。如果可以在 Cilk Plus 中获取生成的工作线程 id,我会使用numa_run_on_node(nodeid)
.
有关 NUMA 架构上 Cilk 可扩展性问题的更多信息:http ://www.sciencedirect.com/science/article/pii/S0167739X03001845#