我正在使用GNU make 3.81.这是一个演示问题的测试makefile:
define BOZO
a$(1): b c
touch a$(1)
endef
$(foreach i,1 2 3,$(call BOZO,$(i)))
Run Code Online (Sandbox Code Playgroud)
这里的想法是使用宏模板(BOZO)来生成遵循可预测模式的规则.
问题:当我在这个makefile上运行make时,我收到一个错误说:
Makefile.fake:10: *** multiple target patterns. Stop.
Run Code Online (Sandbox Code Playgroud)
(第10行是foreach的行).
现在,我知道错误通常表示的是什么.通过使用info函数将扩展发送到标准输出,让我们看看该行扩展到了什么.我将第10行更改为:
$(info $(foreach i,1 2 3,$(call BOZO,$(i))))
Run Code Online (Sandbox Code Playgroud)
我跑:
$ make -n
a1: b c
touch a1
a2: b c
touch a2
a3: b c
touch a3
make: *** No targets. Stop.
Run Code Online (Sandbox Code Playgroud)
请注意,"无目标"消息是预期的,因为$(info ...)函数的计算结果为空,但会导致make 打印生成的规则.
我们应该运行那些规则吗?
$make -n > out.txt
make: *** No targets. Stop.
$make -f out.txt a1 a2 a3
touch a1 …Run Code Online (Sandbox Code Playgroud) 简短版本在标题中.
长版:我正在开发一个使用Java进行科学优化的程序.程序的工作量可以分为并行和串行阶段 - 并行阶段意味着正在执行高度可并行化的工作.为了加速程序(它运行数小时/天),我创建了许多线程,这些线程等于我正在使用的机器上的CPU核心数 - 通常是4或8 - 并在它们之间划分工作.然后我开始这些线程并加入()它们,然后再进入串行阶段.
到现在为止还挺好.令我困扰的是,并行阶段的CPU利用率和加速量远远没有达到"理论最大值" - 例如,如果我有4个核心,我预计会看到350-400%"利用率"(如上图所示)但它反而在180到310之间反弹.仅使用一个线程,我获得100%的CPU利用率.
我知道线程不能全速运行的唯一原因是:由于同步导致的I/O阻塞造成的阻塞
在我的并行线程中没有任何I/O,也没有任何同步 - 线程共享的唯一数据结构是只读的,并且是基本类型或(非并发)集合.所以我正在寻找其他解释.一种可能性是多个线程反复阻塞垃圾收集,但这在内存压力的情况下似乎才有意义,而且我的分配远远高于所需的最大堆空间.
任何建议,将不胜感激.
更新:万一有人好奇,经过一些调查后,我调整了代码以获得一般性能并且看到更好的利用率,即使我改变的任何事情都与同步有关.但是,一些更改应该导致更少的新堆分配,特别是我摆脱了一些迭代器和临时盒装数字的使用(用于高性能Java计算的CERN"Colt"库在这里很有用:它提供了像IntArrayList这样的集合,DoubleArrayList等基本类型.).所以我认为垃圾收集可能是罪魁祸首.
我有一个perl脚本,它将大量输出发送到多个子进程.我需要能够关闭所有管道的末端,然后等待子流程完成他们的工作.到目前为止,我只是成功地关闭了每个管道并等待每个子进程逐个完成.更具体地说,我正在做这样的事情:
for ($i=0;$i<24;$i++) {
my $fh;
open $fh, "|externalprogram $i";
$fhs{$i}=$fh;
}
#...now I can write output to the pipes
while (moreworktodo()) {
$whichone, $data = do_some_work();
print $fhs{$whichone} $data;
}
#Now I just need to wait for all the subprocesses to finish. However, they
#need to do a lot of work that can only begin when they've finished reading input. So I need to close my end of the pipe to indicate I'm finished.
for ($i=0;$i<24;$i++) {
my $file …Run Code Online (Sandbox Code Playgroud)