Parallel processing 获取makefile中的当前作业编号

Parallel processing 获取makefile中的当前作业编号,parallel-processing,makefile,Parallel Processing,Makefile,有没有一种方法可以在makefile规则中获取当前作业编号 让我给你讲一点背景。 我正在使用一个在多个文件上运行的工具。当然,我使用并行作业来加快速度。这里真正的问题是,这个工具产生了多个线程,我希望它们在单个内核中运行——因为这样速度更快。我做了一些测试,这样运行速度更快 我需要作业编号来设置cpu核心的进程关联。无法获取“作业编号”,因为make不跟踪作业编号。基本上,单个构建中make的所有实例都共享一个相同令牌的列表。当make想要启动作业时,它会获得一个令牌。当make完成一个作业时,

有没有一种方法可以在makefile规则中获取当前作业编号

让我给你讲一点背景。 我正在使用一个在多个文件上运行的工具。当然,我使用并行作业来加快速度。这里真正的问题是,这个工具产生了多个线程,我希望它们在单个内核中运行——因为这样速度更快。我做了一些测试,这样运行速度更快

我需要作业编号来设置cpu核心的进程关联。

无法获取“作业编号”,因为make不跟踪作业编号。基本上,单个构建中make的所有实例都共享一个相同令牌的列表。当make想要启动作业时,它会获得一个令牌。当make完成一个作业时,它会将令牌添加回列表。如果它试图获取一个令牌,但其中一个令牌不可用,它将一直休眠,直到有一个令牌可用为止。这些标记没有明显的特征,因此无法获得“工作编号”

要了解更多关于GNU make如何处理并行构建的信息,您可以阅读

我不太确定这对你有什么帮助。Make对线程一无所知,它只启动进程。如果单个进程由多个线程组成,make仍然会将其视为单个作业

编辑: 假设您在make的单个非递归调用中,您可以这样做:

COUNT :=

%.foo :
        $(eval COUNT += x)
        @echo "$@: Number of rules run is $(words $(COUNT))"

all: a.foo b.foo c.foo d.foo

我对此感到震惊。我浏览了makefile源代码,没有看到任何与我的需要相关的内容。也许你还有其他建议-比如如何为每个工具运行获取uniqe id?我在想$RANDOM之类的东西——但随机性是多少;)我仍然不明白你为什么需要这个,但是为什么不直接使用PID呢?这是一个系统范围内的唯一值。是的,PID是唯一的,正如你所说的。我没有提到我需要连续的唯一ID,这样就不会出现两个进程运行在同一个cpu内核上的情况。我知道在递归构建环境中没有办法做到这一点。如果您位于单个非递归makefile中,那么您可以在规则中使用
$(eval…
)这样的操作,以便在每次调用变量时对其进行修改。这可以让你“计算”它们。有一个很好的例子,你需要一个作业id:提取失败作业的日志。可以使用作业id作为命令输出的前缀,以便解开
make
的所有交错输出
--output sync=target
会有所帮助,但速度太慢,错误仍然不在日志末尾。另一种情况是在作业运行时监视作业的执行情况,并动态地在不同作业的日志之间切换。