0

问题

假设我有 20 个处理器可用。我想将参数传递给
IPython 的外部程序,该程序一次运行 4 个线程最好,并使用 map_async 继续添加作业,直到所有作业完成。下面是示例代码,我相信一次只会为每个作业分配一个进程。这是您将使用“块大小”标志的示例吗?似乎会做相反的事情,即将多个作业发送到一个处理器。

在 IPython 之外启动引擎

ipcluster start -n 20 --daemon

IPython 代码

import ipyparallel as ipp
import subprocess


def func(args): 
    """ function that calls external prog w/ 4 threads """
    subprocess.call([some_external_program, args, nthreads=4])


args = [...]
ipyclient = ipp.Client().load_balanced_view()  
results = ipyclient.map_async(func, args)  
results.get()
4

1 回答 1

1

如果一个任务是多线程的,你不想在太多的引擎上运行它。如果这是您的大部分工作,最好启动n_cpus/n_threads引擎而不是n_cpus(在您的 20 个 CPU、4 个线程的情况下启动 5 个引擎)。如果它是像这样多线程的工作的子集,那么您可能只想将它们的分配限制为n_cpus/n_threads. 您可以targets在创建视图时使用参数执行此操作,这会将任务分配限制为引擎子集:

n_threads = 4
client = ipp.Client()
all_view = client.load_balanced_view() # uses all engines
threaded_view = client.load_balanced_view(targets=client.ids[::n_threads])

这假设您在单台机器上的每个 CPU 有一个引擎。如果您使用多台机器或引擎数量与 CPU 数量的关系不同,您将必须计算出要使用的正确引擎子集。目标可以是任何手动指定的引擎 ID 列表。

于 2015-10-10T16:49:56.437 回答