Home > Erlang探索, Linux, 工具介绍 > 如何在TILEPro64多核心板卡上编译和运行Erlang

如何在TILEPro64多核心板卡上编译和运行Erlang

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: 如何在TILEPro64多核心板卡上编译和运行Erlang

参考文章:
1. https://groups.google.com/group/erlang-programming/msg/2d61b1083a10a7b6

2. http://erlang.2086793.n4.nabble.com/How-to-Cross-compile-Erlang-OTP-R13B04-for-TileraPro64-td2119304.html

美国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.

  1. fcicq
    November 2nd, 2010 at 10:32 | #1

    求性能数据…

    [Reply]

    Yu Feng Reply:

    稍后我会做性能方面的评估!

    [Reply]

  2. November 2nd, 2010 at 16:11 | #2

    # 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, 这样算起来性能是很弱的。

    [Reply]

  3. Arbow
    November 2nd, 2010 at 16:22 | #3

    这个多核产品的主打用途是什么?像CDN这种IO密集的应用么

    [Reply]

  4. November 2nd, 2010 at 16:34 | #4

    对的,IO密集型,但是低功耗。

    [Reply]

    JoshFeng Reply:

    跑网络流量采集不知道是否顶得住

    [Reply]

    Yu Feng Reply:

    CPU的计算力不是很强,但是如果只是收集数据应该是足够的.

    [Reply]

  5. November 2nd, 2010 at 18:20 | #5

    这块板子和它的配套开发环境好像要10K刀左右?

    [Reply]

    Yu Feng Reply:

    不用这么多钱的吧,一个服务器都没多少钱,肯定要比服务器便宜好多才有市场!

    [Reply]

  6. November 3rd, 2010 at 23:42 | #6

    顶!

    [Reply]

  7. November 4th, 2010 at 20:56 | #7

    有基于这种CPU的服务器么?我问过很多人都不知道

    [Reply]

    Yu Feng Reply:

    出来2-3年应该有了,国内知道的人比较少。。。 不过最近有国内的公司在推。。。

    [Reply]

  8. November 14th, 2010 at 19:59 | #8
  9. November 18th, 2010 at 14:06 | #9

    在DELL 一台AMD 48核心的机器上运行的结果
    [root@localhost tmp]# time erl -noshell -run spectralnorm main 9500
    1.274224153

    real 0m22.666s
    user 13m24.083s
    sys 0m3.453s

    [Reply]

  10. smallma
    December 22nd, 2010 at 15:49 | #10

    哈囉~請問一下 我在編譯erlang時 依照您的步驟做時 除了在更改erl_misc_utils.c這個patch時 那行指令有問題 所以我就直接進入到erl_misc_utils.c這個檔內去更動那兩行~之後都很順利執行完沒有問題~但是放到tilera機上去跑時 就會發生segment fault~我有檢查過好多次erl_misc_utils.c這個檔案中是否有更改那兩行 但還是發生一樣的問題~不知道您是否願意指導一下該怎麼去做呢?謝謝

    [Reply]

    smallma Reply:

    補充一下錯誤訊息
    [shepherd] WARNING: Process 772#69 terminated: Segmentation fault (11).
    感謝~

    [Reply]

    Yu Feng Reply:

    要不你在目标机器上gdb下看下core dump发生在什么地方?

    [Reply]

    smallma Reply:

    哈囉~我直接在tilera上執行 erl 出現segment fault後 我下
    gdb -c core 就出現
    /tmp/otp/bin/core: No such file or directory
    請問這是怎樣的問題呢?謝謝~

  11. December 22nd, 2010 at 16:12 | #11

    你是否打开了os coredump?

    [Reply]

    smallma Reply:

    哈囉~請問一下那個core dump要怎麼用呢? 我剛下了指令後 就只出現No stack. 麻煩您指導一下~謝謝

    [Reply]

  12. zhuowater
    October 11th, 2012 at 01:08 | #12

    有想开发tilera方面的人吗?我这提供一个不错的机会

    [Reply]

  1. No trackbacks yet.