如何在TILEPro64多核心板卡上编译和运行Erlang
原创文章,转载请注明: 转载自系统技术非业余研究
本文链接地址: 如何在TILEPro64多核心板卡上编译和运行Erlang
参考文章:
1. https://groups.google.com/group/erlang-programming/msg/2d61b1083a10a7b6
美国Tilera公司的众核服务器,单颗内核包含64颗CPU。硬件架构图:
卡长这样的:
Erlang已经可以在这款CPU上成功运行,我们可以参考Ulf Wiger在Multicore ☺ Message-passing Concurrency 文档中关于Erlang在Tilera上的性能图.
Erlang系统前2年就开始正式支持Tilera,一直用这个CPU来调整他的调度器,所以性能和基础的编译运行支持都很到位。
Linux内核2.6.36起就开始支持Tilera的CPU架构了,看起来前途不错。
最近 上海泛腾电子科技 开始在国内销售 Tilera机器, 我公司也得到一台样机,使得我有机会把玩下这个高科技!
该测试机是PCI-e的形式,是单板机,直接安装在PC机或者是服务器里,好处是可以通过主机的VGA口接显示器直接调试。当然也可以作为智能网卡来使用。构成一个与Host的异构结构,通过PCI-e总线进行通讯。
还需要相应的配套SDK: 目前有TileraMDE-2.1.2.112814 和 TileraMDE-3.0.alpha3.116173 二个版本, 来负责和板卡的通信。 推荐用2.0的,好像不容易出问题。
废话少说,让我们开始享受64核心快乐旅程吧!
# wget http://www.erlang.org/download/otp_src_R13B03.tar.gz %%R13B04后otp_build变了好像有点问题,编译不过去。 # tar xzf otp_src_R13B03.tar.gz # cd otp_src_R13B03 %%由于R13B03有个小小的bug会导致segment fault,我们需要对erl_misc_utils.c打个patch,以下是要打patch的地方: # diff -Nau otp_src_R13B04/erts/lib_src/common/erl_misc_utils.c{~,} --- otp_src_R13B04/erts/lib_src/common/erl_misc_utils.c~ 2009-11-20 14:32:23.000000000 +0100 +++ otp_src_R13B04/erts/lib_src/common/erl_misc_utils.c 2010-03-29 15:53:28.000000000 +0200 @@ -373,8 +373,8 @@ return 0; memcpy((void *) topology, (void *) cpuinfo->topology, - cpuinfo->configured*sizeof(erts_cpu_topology_t)); - return cpuinfo->configured; + cpuinfo->topology_size*sizeof(erts_cpu_topology_t)); + return cpuinfo->topology_size; } %%源码算是准备完毕了 %%开始编译前的环境准备 # export ERL_TOP=`pwd` # eval `./otp_build env_cross $ERL_TOP/xcomp/erl-xcomp-TileraMDE2.0-tilepro.conf` # export TILERA_ROOT=/root/TileraMDE-2.1.2.112814/tilepro/ %%这个最好用2.x版本的 # export PATH=$TILERA_ROOT/bin:$PATH # tile-monitor --pci -- uname -a %%验证板卡确实可用 Linux localhost 2.6.26.7-MDE-2.1.2.112814 #1 SMP Wed Sep 1 00:05:06 EDT 2010 tile GNU/Linux %%开始交叉编译 # ./otp_build configure # touch lib/crypto/SKIP && touch lib/ssl/SKIP && touch lib/ssh/SKIP %%这几个模块用到了openssl, 编译不过去,忽略掉 # ./otp_build boot -a # ./otp_build release -a /tmp/otp %%安装到/tmp/otp目录去 %%如果一切顺利,到这时候就编译完毕了。 %%我们开始收获成果。 # cd /tmp/otp # ./Install `pwd` # tile-monitor --pci --here -- bin/erl %%没出错的话,就说明我们成功了。 %%当然我们可以把otp系统上载到板卡去,方便日后使用 # $TILERA_ROOT/bin/tile-monitor --pci --upload /tmp/otp /tmp/otp --quit %% 放在板卡的/tmp/otp目录下 %%我们还可以定义个命令别名,方便我们执行命令 # tile_erl="$TILERA_ROOT/bin/tile-monitor --pci --resume --tunnel 2023 23 --env HOME=/tmp --tiles - all ^0 - -- /tmp/otp/bin/erl" # $tile_erl +sct L10-18,1-9,19-55,57,58,61c1-55,57,58,61 +sbt db -noshell +S 58 -s init stop
好吧到此为止,我们在目标机器上/tmp/otp目录下有个完整的erlang系统。
我们开个console连接到板载的linux系统去:
[root@client otp_src_R13B03]# /root/TileraMDE-2.1.2.112814/tilepro/bin/tile-console tile-console: Assuming '--pci'. Connecting to /dev/ttyS0, speed 115200 Escape character: Ctrl-\ (ASCII 28, FS): enabled Type the escape character followed by C to get back, or followed by ? to see other options. ---------------------------------------------------- # uname -a Linux localhost 2.6.26.7-MDE-2.1.2.112814 #1 SMP Wed Sep 1 00:05:06 EDT 2010 tile GNU/Linux # cd /tmp/otp %%我们跑个erlang程序<em>64核心并行</em>进行数学计算 %% 代码在这里下载 http://shootout.alioth.debian.org/u32/program.php?test=spectralnorm&lang=hipe&id=2 #cat > spectralnorm.erl % The Computer Language Benchmarks Game % http://shootout.alioth.debian.org/ % contributed by Fredrik Svahn -module(spectralnorm). -export([main/1]). -compile( [ inline, { inline_size, 1000 } ] ). main([Arg]) -> register(server, self()), N = list_to_integer(Arg), {U, V} = power_method(N, 10, erlang:make_tuple(N, 1), []), io:format("~.9f\n", [ eigen(N, U, V, 0, 0) ]), erlang:halt(0). % eigenvalue of V eigen(0, _, _, VBV, VV) when VV /= 0 -> math:sqrt(VBV / VV); eigen(I, U, V, VBV, VV) when I /= 0 -> VI = element(I, V), eigen(I-1, U, V, VBV + element(I, U)*VI, VV + VI*VI). % 2I steps of the power method power_method(_, 0, A, B) -> {A, B}; power_method(N, I, A, _B) -> V = atav(N, A), U = atav(N, V), power_method(N, I-1, U, V). % return element i,j of infinite matrix A a(II,JJ) -> 1/((II+JJ-2)*(II-1+JJ)/2+II). % multiply vector v by matrix A av(N, V) -> pmap(N, fun(Begin, End) -> av(N, Begin, End, V) end). av(N, Begin, End, V) -> server ! { self(), [ avloop(N, I, V, 0.0) || I <- lists:seq(Begin, End) ]}. avloop(0, _, _, X) -> X; avloop(J, I, V, X) -> avloop(J-1, I, V, X + a(I, J)*element(J, V) ). % multiply vector v by matrix A transposed atv(N, V) -> pmap(N, fun(Begin, End)-> atv(N, Begin, End, V) end). atv(N, Begin, End, V) -> server ! { self(), [ atvloop(N, I, V, 0.0) || I <- lists:seq(Begin, End) ]}. atvloop(0, _, _, X) -> X; atvloop(J, I, V, X) -> atvloop(J-1, I, V, X + a(J, I)*element(J, V) ). % multiply vector v by matrix A and then by matrix A transposed atav(N, V) -> atv(N, av(N, V)). %Helper function for multicore pmap(N, F) -> Chunks = chunks(0, erlang:system_info(logical_processors), N, []), Pids = [spawn(fun()-> F(Begin, End) end) || {Begin, End} <- Chunks], Res = [ receive {Pid, X} -> X end || Pid <- Pids], list_to_tuple(lists:flatten(Res)). chunks(I, P, N, A) when I == P-1 -> lists:reverse([{I*(N div P)+1, N} | A ]); chunks(I, P, N, A) -> chunks(I+1, P, N, [{ I*(N div P)+1, (I+1)*(N div P)} | A ]). CTRL+D # bin/erlc spectralnorm.erl # time bin/erl -noshell -run spectralnorm main 500 -s init stop 1.274224116 real 0m 16.90s user 1m 16.07s sys 0m 0.79s # bin/erl +sct L10-18,1-9,19-55,57,58,61c1-55,57,58,61 +sbt db -noshell +S 58 -eval 'io:format("schedulers: ~p~n"[erlang:system_info(schedulers)])' -s init stop schedulers: 58
Bingo! 我们顺利的跑了数学计算,同时绑定调度器到CPU core上去了。接下来就可以按照平常那样进行Erlang并发编程了。
祝玩的开心!
Post Footer automatically generated by wp-posturl plugin for wordpress.
求性能数据…
Yu Feng Reply:
November 2nd, 2010 at 10:46 am
稍后我会做性能方面的评估!
# cat /proc/cpuinfo
cpu MHz : 862.500000
bogomips : 1725.00
64个核心
# time bin/erl -noshell -run spectralnorm main 9500 && cat /proc/loadavg
1.274224153
real 13m 36.45s
user 7h 29m 16s
sys 0m 46.52s
29.71 30.75 22.41 1/426 1295
Intel(R) Xeon(R) CPU E5520 @ 2.27GHz
bogomips : 4522.07
16个核心
[admin@my174 ~]$ time erl -noshell -run spectralnorm main 9500 && cat /proc/loadavg
1.274224153
real 0m58.707s
user 15m1.341s
sys 0m3.297s
10.34 3.30 1.16 1/172 4445
计算用的时间13:1, CPU核心数目64:16, 这样算起来性能是很弱的。
这个多核产品的主打用途是什么?像CDN这种IO密集的应用么
对的,IO密集型,但是低功耗。
JoshFeng Reply:
November 6th, 2010 at 12:09 am
跑网络流量采集不知道是否顶得住
Yu Feng Reply:
November 6th, 2010 at 2:45 pm
CPU的计算力不是很强,但是如果只是收集数据应该是足够的.
这块板子和它的配套开发环境好像要10K刀左右?
Yu Feng Reply:
November 2nd, 2010 at 6:22 pm
不用这么多钱的吧,一个服务器都没多少钱,肯定要比服务器便宜好多才有市场!
顶!
有基于这种CPU的服务器么?我问过很多人都不知道
Yu Feng Reply:
November 4th, 2010 at 9:00 pm
出来2-3年应该有了,国内知道的人比较少。。。 不过最近有国内的公司在推。。。
并行运算进入Tilera时代:
http://wenku.baidu.com/view/45f454868762caaedd33d478.html
在DELL 一台AMD 48核心的机器上运行的结果
[root@localhost tmp]# time erl -noshell -run spectralnorm main 9500
1.274224153
real 0m22.666s
user 13m24.083s
sys 0m3.453s
哈囉~請問一下 我在編譯erlang時 依照您的步驟做時 除了在更改erl_misc_utils.c這個patch時 那行指令有問題 所以我就直接進入到erl_misc_utils.c這個檔內去更動那兩行~之後都很順利執行完沒有問題~但是放到tilera機上去跑時 就會發生segment fault~我有檢查過好多次erl_misc_utils.c這個檔案中是否有更改那兩行 但還是發生一樣的問題~不知道您是否願意指導一下該怎麼去做呢?謝謝
smallma Reply:
December 22nd, 2010 at 3:51 pm
補充一下錯誤訊息
[shepherd] WARNING: Process 772#69 terminated: Segmentation fault (11).
感謝~
Yu Feng Reply:
December 22nd, 2010 at 3:53 pm
要不你在目标机器上gdb下看下core dump发生在什么地方?
smallma Reply:
December 22nd, 2010 at 4:07 pm
哈囉~我直接在tilera上執行 erl 出現segment fault後 我下
gdb -c core 就出現
/tmp/otp/bin/core: No such file or directory
請問這是怎樣的問題呢?謝謝~
你是否打开了os coredump?
smallma Reply:
December 22nd, 2010 at 6:20 pm
哈囉~請問一下那個core dump要怎麼用呢? 我剛下了指令後 就只出現No stack. 麻煩您指導一下~謝謝
有想开发tilera方面的人吗?我这提供一个不错的机会