2015-12-28 14:25:15 +03:00
|
|
|
|
//Демонстрация использования параллельных секций на примере задачи о ханойских башнях
|
|
|
|
|
|
// Вывод решения закомментирован, так как он занимает большую часть времени
|
2015-05-14 22:35:07 +03:00
|
|
|
|
|
2015-12-28 14:25:15 +03:00
|
|
|
|
//параллельная процедура
|
2015-05-14 22:35:07 +03:00
|
|
|
|
procedure MovePiramidParallel(n: integer; f, t, w: integer);
|
|
|
|
|
|
begin
|
|
|
|
|
|
if n = 0 then
|
|
|
|
|
|
exit;
|
|
|
|
|
|
{$omp parallel sections}
|
|
|
|
|
|
begin
|
|
|
|
|
|
MovePiramidParallel(n - 1, f, w, t);
|
2015-12-28 14:25:15 +03:00
|
|
|
|
//writelnFormat('Переложить диск с {0} на {1}', f, t);
|
2015-05-14 22:35:07 +03:00
|
|
|
|
MovePiramidParallel(n - 1, w, t, f);
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
2015-12-28 14:25:15 +03:00
|
|
|
|
//последовательная процедура
|
2015-05-14 22:35:07 +03:00
|
|
|
|
procedure MovePiramid(n: integer; f, t, w: integer);
|
|
|
|
|
|
begin
|
|
|
|
|
|
if n = 0 then
|
|
|
|
|
|
exit;
|
|
|
|
|
|
MovePiramid(n - 1, f, w, t);
|
2015-12-28 14:25:15 +03:00
|
|
|
|
//writelnFormat('Переложить диск с {0} на {1}', f, t);
|
2015-05-14 22:35:07 +03:00
|
|
|
|
MovePiramid(n - 1, w, t, f);
|
|
|
|
|
|
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
|
var m0 := Milliseconds;
|
|
|
|
|
|
MovePiramid(27, 1, 2, 3);
|
2015-12-28 14:25:15 +03:00
|
|
|
|
writeln('Последовательное выполнение: ', Milliseconds - m0, 'ms');
|
2015-05-14 22:35:07 +03:00
|
|
|
|
|
|
|
|
|
|
var m1 := Milliseconds;
|
|
|
|
|
|
MovePiramidParallel(27, 1, 2, 3);
|
2015-12-28 14:25:15 +03:00
|
|
|
|
writeln('Параллельное выполнение: ', Milliseconds - m1, 'ms');
|
2015-05-14 22:35:07 +03:00
|
|
|
|
end.
|