用Makefile模拟一个的wlm并实现并行任务分发

看到关于Makefile的必要性讨论,忽然想起自己干过一些有趣的的事情。

一个目录下有一大堆同质或不同质的程序,要测试系统处理并发任务的效率不得不写一个任务分发器(work load manager),用C写对新手来说还是有点大条的,利用make -j可以模拟一个简单的wlm。代码大概如下:

 用Makefile模拟一个的wlm并实现并行任务分发_设计制作_存储技术

binaries := $(foreach ccode, \

$(shell for cfile in `ls *.c`; do echo $cfile; done),\

$(ccode:.c=))

$(binaries): %:%.c

@echo BLD $@

@gcc -o $@ $《 》/dev/null 2》&1

to_run := $(foreach ccode, \

$(shell for cfile in `ls *.c`; do echo $cfile; done),\

to_run_$(ccode:.c=))

run: clean $(to_run)

to_run_%: %

@to_run=$@; \

echo ${to_run##to_run_};

clean:

@echo -n “-------------------------------- CLEAN ”

@echo “--------------------------------”

@echo RMV $(binaries)

@rm -f $(binaries)

.PHONY: run clean

运行 make -jN 即可

简而言之就是:

1. default 的 target 是 run,run 依赖于 clean 和 to_run

run: clean $(to_run)

2. to_run 是由一段 shell 产生的

to_run := $(foreach ccode, \

$(shell for cfile in `ls *.c`; do echo $cfile; done),\

to_run_$(ccode:.c=))

3. 假设目录下有 1.c 2.c 3.c 4.c 。。. 100.c 这100个c程序, 那段 shell 生成的变量 to_run 等于这样的一串: to_run_1 to_run2 。。. to_run_100

4. to_run_%: % 那一段 rule 的意思是对于某个目标 to_run_73 依赖于 73,当 73 不存在或者 73.c 被更新过, make 就按照上面声明的 binaries 的规则去(重新)生成它:

$(binaries): %:%.c

@echo BLD $@

@gcc -o $@ $《 》/dev/null 2》&1

5. 73 生成以后就运行它,示例里用的是 echo

@to_run=$@; \

echo ${to_run##to_run_};

实际上可以是

@to_run=$@; \

。/${to_run##to_run_};

这样 73 就在适当的时候被运行了。

假设输入 make -j32 run,结果就是可执行文件 1, 2, 3 。。. 32 同时被运行,其中的某个结束后 make 会自动启动后面的 33, 34 。。. 直至所有的运行结束,这就模拟了一个简单的本地 work load manager。

这个make脚本的另外一个变种可以是:你有一个程序(假设叫 EXEC0),在一台16核的机器上你希望并行地运行32个带不同参数的 EXEC0 实例,总共运行 1024 个实例来测试系统或者 EXEC0 的运行效率,Makefile大概可以这样写:

ifeq ($(MAX),)

MAX=1024

endif

parame     te   r0=0

parameter1=11

parameter2=22

parameter3=33

prerequisites := $(foreach num, \

$(shell i=0; while [ $$i -lt $(MAX) ]; \

do \

echo $$i; \

i=$$((i + 1)); \

done), \

target_$(num))

run:$(prerequisites)

EXEC0: EXEC0.c

gcc -o $@ $《

target_%:EXEC0

@./EXEC0 $(parameter$(shell expr $(subst target_,,$@) % 4))

.PHONY: run

一个无聊的EXEC0.c 可以是:

int

main(int argc, char **argv)

{

sleep(atoi(argv[1]));

printf(“%s %d\n”, argv[0], atoi(argv[1]));

return 0;

}

然后make -j32 MAX=1024

/////////////////////////////////////////////////////////////////////////////////////////////////////////

试验记录:

testcase := $(shell for test in `ls 。。/tests/`; do echo $$test; done)

to_run := $(foreach test, \

$(shell for test in `ls 。。/tests/`; do echo $$test; done), \

to_run_$(test))

run : $(to_run)

to_run_%:

@to_run=$@; \

run_test $${to_run##to_run_};

#$(shell grep -rn “Error” 。/$${to_run##to_run_}/irun.log 》》 error.log)

clean:

@echo -n “-------------------------- CLEAN”

@echo “--------------------------”

@echo RMV $(testcase)

@rm -rf $(testcase)

.PHONY: run clean

18
116
0
53

相关资讯

  1. 1、周星驰新作片名《新喜剧之王》,王宝强持“七种武器之首”现身175
  2. 2、唐艺昕张若昀身穿情侣装现身机场,两人开启度假模式1227
  3. 3、六月院线好片盘点,除了《侏罗纪世界2》,还有这些好电影值得看3977
  4. 4、《香蜜》大结局,看完唏嘘不已3265
  5. 5、是C位出道还是销声匿迹?关晓彤鞠婧祎沈月的人生可能会就此不同5064
  6. 6、《面包树》探班陈铭章:没准备好见俞灏明2067
  7. 7、曾是罗晋最爱的人,分手后嫁大21岁富豪,如今一对儿女颜值逆天2235
  8. 8、碾压《闪灵》的经典恐怖片,90%的人熬不过前10分钟!4221
  9. 9、《警察故事2013》诞生记丁晟让成龙变平凡人1149
  10. 10、网曝成龙身体状况让人堪忧?本人回应:至少再拼15年2083
全部评论(0)
我也有话说
0
收藏
点赞
顶部