[Erlang] замеры времени при smp timer:tc или statistics?
От: Аноним  
Дата: 10.06.08 12:16
Оценка:
Есть код:
-module(testSMP3).
-export([main/2,sum/3,wait_n/2]).

sum(X,X,S) -> S+1/X;
sum(X,Y,S) ->sum(X,Y-1,S+1/Y).

wait_n(0,S) -> {TotalRunTime,TimeSinceLastCall} = statistics(runtime),
io:format("Сумма равна ~p~n ", [S]),
io:format("Time: ~w~n", [TimeSinceLastCall]),
done;

wait_n(N,S) ->
receive {i_am_ready,S1}->
io:format("Сумма равна ~p~n ", [S]),
wait_n(N-1,S+S1) end.

main(N,F) ->
statistics(runtime),
S = self(),
[spawn(fun () -> io:format("Х=~p Y=~p~n ", [1+F*(Z-1),F*Z]),S ! {i_am_ready,sum(1+F*(Z-1),F*Z,0)} end)||
Z <- lists:seq(1, N)],
wait_n(N,0).
При smp 2
testSMP3:main(2, 50000000).
выдает Time: 61937 то есть получаем что время вычислений около 62 сек.
timer:tc(testSMP3, main, [2,50000000]).
выдает 31338 то есть время вычислений 31 сек. исходя из таймера виндоус устанавливаем что при smp врет statistics!!!
Замеры
timer:tc(testSMP3, main, [2,50000000]).

Без и smp timer:tc и statistics выдают одинаковый результат 45 сек.
Таким образом получаем
1) что доверять statistics при smp нельзя.
2) при включаном smp таки наблюдается ускорение на 35% даже на гипертрендинге.

SMP 2 — 33835 ускорение 36%.
SMP 0 — 45911
На четырех процесорном результаты такие
SMP 4 6641 ускорение 121%.
SMP 3 7468 ускорение 97%.
SMP 2 9776 ускорение 51%.
SMP 0 14716
testSMP3- это тотже пример tut18.
Извеняюсь за свою предыдущую тему !!!

Если кто потвердит или опровергет то что я написал буду благодарен.
Re: [Erlang] замеры времени при smp timer:tc или statistics?
От: Mikl Kurkov Россия  
Дата: 10.06.08 13:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть код:

А>...
А>Без и smp timer:tc и statistics выдают одинаковый результат 45 сек.
А>Таким образом получаем
А>1) что доверять statistics при smp нельзя.
А>2) при включаном smp таки наблюдается ускорение на 35% даже на гипертрендинге.
А>...
А>Если кто потвердит или опровергет то что я написал буду благодарен.

Тут нет ничего удивительного. statistics(runtime) замеряет процессное время, а timer:tc реальное.
Соответсвенно при увеличении числа процессоров процессное время может увеличиваться, а реальное уменьшаться.
Проблема была в том что statistics(runtime) использовалась для сравнения запуска с разным числом процессоров,
доверять ей при запуске на одной конфигурации вполне можно.

Кроме того есть statistics(wall_clock), которая также измеряет реальное время.

--
Mikl
Re: [Erlang] замеры времени при smp timer:tc или statistics?
От: Gaperton http://gaperton.livejournal.com
Дата: 11.06.08 15:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Таким образом получаем

А>1) что доверять statistics при smp нельзя.
А>2) при включаном smp таки наблюдается ускорение на 35% даже на гипертрендинге.

Ну слава тебе хосподи! . Аж от сердца отлегло. Спасибо, что написал, а то я б и дальше думал, что все плохо — своей SMP-машины у меня нет чтобы протестить .
Re: [Erlang] замеры времени при smp timer:tc или statistics?
От: DoubleSlash  
Дата: 20.06.08 08:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>SMP 2 — 33835 ускорение 36%.

А>SMP 0 — 45911
А>На четырех процесорном результаты такие
А>SMP 4 6641 ускорение 121%.
А>SMP 3 7468 ускорение 97%.
А>SMP 2 9776 ускорение 51%.
А>SMP 0 14716

Это все хорошо, но как насчет SMP vs N nodes?
Re[2]: [Erlang] замеры времени при smp timer:tc или statisti
От: Аноним  
Дата: 25.06.08 17:21
Оценка:
Здравствуйте, Mikl Kurkov, Вы писали:

MK>Здравствуйте, Аноним, Вы писали:


А>>Есть код:

А>>...
А>>Без и smp timer:tc и statistics выдают одинаковый результат 45 сек.
А>>Таким образом получаем
А>>1) что доверять statistics при smp нельзя.
А>>2) при включаном smp таки наблюдается ускорение на 35% даже на гипертрендинге.
А>>...
А>>Если кто потвердит или опровергет то что я написал буду благодарен.

MK>Тут нет ничего удивительного. statistics(runtime) замеряет процессное время, а timer:tc реальное.

MK>Соответсвенно при увеличении числа процессоров процессное время может увеличиваться, а реальное уменьшаться.
MK>Проблема была в том что statistics(runtime) использовалась для сравнения запуска с разным числом процессоров,
MK>доверять ей при запуске на одной конфигурации вполне можно.

MK>Кроме того есть statistics(wall_clock), которая также измеряет реальное время.

MK>--
MK>Mikl
Почемуто у меня statistics(wall_clock)
выдает то же что и что и statistics(runtime)
Если скажете почему буду благадарен.

Кто нибуть сравнивал statistics(wall_clock) с statistics(runtime)
на smp 2?


Здравствуйте, DoubleSlash, Вы писали:

DS>Здравствуйте, Аноним, Вы писали:

А>>SMP 2 — 33835 ускорение 36%.
А>>SMP 0 — 45911
А>>На четырех процесорном результаты такие
А>>SMP 4 6641 ускорение 121%.
А>>SMP 3 7468 ускорение 97%.
А>>SMP 2 9776 ускорение 51%.
А>>SMP 0 14716

DS>Это все хорошо, но как насчет SMP vs N nodes?


smp 0 smp 2 smp 2 с двумя нодами
13,979 11,657 9,328
14,076 11,797 9,344
Средние
14,0275 11,727 9,336
smp 2 по сравнению с smp 0 выигрыш 20%
smp 2 с двумя нодами по сравнению с smp 2 выигрыш 25%
smp 2 с двумя нодами по сравнению с smp 0 выигрыш 50%

Завтра попробую сравнить тоже для 4 процессоров (2 проца с хипертренинг).
Re[3]: [Erlang] замеры времени при smp timer:tc или statisti
От: Mikl Kurkov Россия  
Дата: 26.06.08 10:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>...

А>Почемуто у меня statistics(wall_clock)
А>выдает то же что и что и statistics(runtime)
А>Если скажете почему буду благадарен.

А оба процесса грузятся? Если да, то странно. У меня они разные и именно так как я описывал.
При одном процессоре runtime немного меньше wall_clock, а при двух существенно больше.

А>Кто нибуть сравнивал statistics(wall_clock) с statistics(runtime)

А>на smp 2?

При запуске кода ниже (10000 вычислений 20-го числа Фибоначчи) с выключенным и включенным smp имеем:
mk$ erl -noshell -smp disable -run stat_test start 10000 20 -s init stop
 CPU time: 8060 msec
Real time: 8651 msec
 Timer tc: 8653 msec

mk$ erl -noshell -smp enable +S 2 -run stat_test start 10000 20 -s init stop
 CPU time: 8440 msec
Real time: 4974 msec
 Timer tc: 4976 msec


Система: macbook на Core 2 Duo (2.2, 4GB), Mac OS X 10.5.3, Erlang R12B-1

А вот код. Запускает вычисление чисел Фибоначчи в параллель.
-module(stat_test).

-export([start/1, start/2, test/2, fib/1]).

start([N,K]) when is_list(N), is_list(K) ->
    start(list_to_integer(N), list_to_integer(K)).

start(N, K) ->
    {Time, ok} = timer:tc(?MODULE, test, [N,K]),
    io:format(" Timer tc: ~p msec~n", [Time div 1000]),
    ok.

test(N,K) ->
    statistics(wall_clock),
    statistics(runtime),

    rpc:pmap({?MODULE, fib}, [], lists:duplicate(N,K)),

    {_, RealTime} = statistics(wall_clock),
    {_, RunTime} = statistics(runtime),

    io:format(" CPU time: ~p msec~n"
              "Real time: ~p msec~n", [RunTime, RealTime]),
    ok.

fib(0) -> 0;
fib(1) -> 1;
fib(N) when N > 1 -> fib(N-1) + fib(N-2).


--
Mikl
Re[4]: [Erlang] замеры времени при smp timer:tc или statisti
От: Аноним  
Дата: 27.06.08 09:36
Оценка:
Здравствуйте, Mikl Kurkov, Вы писали:
MK>При запуске кода ниже (10000 вычислений 20-го числа Фибоначчи) с выключенным и включенным smp имеем:
MK>
MK>mk$ erl -noshell -smp disable -run stat_test start 10000 20 -s init stop
MK> CPU time: 8060 msec
MK>Real time: 8651 msec
MK> Timer tc: 8653 msec

MK>mk$ erl -noshell -smp enable +S 2 -run stat_test start 10000 20 -s init stop
MK> CPU time: 8440 msec
MK>Real time: 4974 msec
MK> Timer tc: 4976 msec
MK>


MK>Система: macbook на Core 2 Duo (2.2, 4GB), Mac OS X 10.5.3, Erlang R12B-1


MK>А вот код. Запускает вычисление чисел Фибоначчи в параллель.

MK>
MK>-module(stat_test).

MK>-export([start/1, start/2, test/2, fib/1]).

MK>start([N,K]) when is_list(N), is_list(K) ->
MK>    start(list_to_integer(N), list_to_integer(K)).

MK>start(N, K) ->
MK>    {Time, ok} = timer:tc(?MODULE, test, [N,K]),
MK>    io:format(" Timer tc: ~p msec~n", [Time div 1000]),
MK>    ok.

MK>test(N,K) ->
MK>    statistics(wall_clock),
MK>    statistics(runtime),

MK>    rpc:pmap({?MODULE, fib}, [], lists:duplicate(N,K)),

MK>    {_, RealTime} = statistics(wall_clock),
MK>    {_, RunTime} = statistics(runtime),

MK>    io:format(" CPU time: ~p msec~n"
MK>              "Real time: ~p msec~n", [RunTime, RealTime]),
MK>    ok.

MK>fib(0) -> 0;
MK>fib(1) -> 1;
MK>fib(N) when N > 1 -> fib(N-1) + fib(N-2).
MK>


MK>--

MK>Mikl
Спасибо получилось.
Проблема была в том что я изменил только в одном месте
statistics(wall_clock),
а во втором не изменил:
{_, RunTime} = statistics(runtime).


Замеры smp — vs Nod для 4 процессорного РС(2 проц. с гипертренингом).
smp 0 smp 2 smp 3 smp 4
14,61 9,375 7,794 7,297
14,954 9,156 7,5 7,266
среднее 14,782 9,2655 7,647 7,2815
выигр с пред 1,595380713 1,211651628 1,050195701
выигр срав с нач 1,933045639 2,030076221


smp 0 smp 1 нодов 2 smp 1 нодов 3 smp 1 нодов 4
14,61 8,031 6,188 5,844
14,954 8,141 6,297 5,547
среднее 14,782 8,086 6,2425 5,6955
выигр с пред 1,828097947 1,295314377 1,096040734
выигр срав с нач 2,367961554 2,595382319
выигр срав с smp1,145869404 1,224989988 1,278465455
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.