Не стал создавать новую тему, поскольку название для нее было бы идентичным названию этой темы
тоже вопрос по предмету СРВ и тоже лабораторная работа 3
Напомню:
Преамбула
В системах реального времени применяются разнообразные планировшики задач. Одним из первых был использован планировщих round robin, достоинством которого является детерминированность, а недостатком - небходимость специальной подготовки каждой задачи для выполнения работы с использованием данного планировщика. Для СРВ подготовка задачи заключается в возможности прерывания ее работы через четко определенные промежутки времени, возврат управления планировщику и возможность возобновления прерванной работы при последующем обращении.
Задание
1. Создать класс, предназначенный для сортировки массива детерминированным методом пузырька (см. пред. л.р.) и возможностью применения в СРВ при использовании планировщика round robin:
type
PArray=array[1..10000] of integer;
TSort=class
private
{внутренние поля}
public
constructor Create(PA:PArray; Count:integer); // PA - массив, который будет отсортирован Count - количество элементов в массиве
function Sort(time:longint):boolean;
// функция сортировки. Начинает или продолжает сортировку массива. Возвр. значение - true, если сортировка завершена, false - если время вышло
// time - максимальное время работы функции.
end;
Проверить работоспособность экземпляров класса.
Есть некоторое непонимание происходящего. Непонятно то что на компьютерах с процессором AMD время выполнения программы, с прерыванием сортировки в определенные промежутки времени, в 2 раза больше чем без прерывания сортировки. А на компьютерах Intel время выполнения программы с прерыванием абсолютно такое же как и без прерывания.
Входные данные: 10 массивов (10 потоков), 10 000 элементов в каждом массиве, время прерывания сортировки: каждые 100 мс.
Массивы заполнены вещественными числами от 10 000 до 1 последовательно, сортируем методом пузырька. Фактически так мы должны получить максимальное время выполнения программы Tmax.
- Код: Выделить всё
на компьютере с процессором AMD (ОС Windows XP):
Время выполнения задачи с прерываем:
Tmax = 6127 мс
Результат задачи без прерывания:
Tmax = 3258 мс
на компьютере с процессором Intel (ОС Windows XP):
Время выполнения задачи с прерываем:
Tmax = 2289 мс
Результат задачи без прерывания:
Tmax = 2292 мс
---------------------------------------------------------------------------
код функции сортировки:
...
function Tsrv.Sortirovka(ctime:double):boolean;
var i,j: integer;
buf: real;
tml: double;
begin
Result:=False; i:=ic; j:=jc; tml:=time;
for i:=ic to n-1 do
for j:=jc to n do
begin
if A[i]>A[j] then
begin
buf:=A[i];
A[i]:=A[j];
A[j]:=buf;
end;
{начало проблемного кусочка кода}
if (j mod 1000)=0 then //каждые 1000 итераций внутреннего цикла проверяем
if millisecondsbetween(tml,time)>=ctime then //пора ли завершать работу
begin
ic:=i; jc:=j; exit; //если пора то запоминаем где остановились и выходим из сортировки
end;
{конец проблемного кусочка кода}
jc:=i+2;
end;
ic:=i; jc:=j;
if (ic=n)and(jc=n+1) then //проверяем закончилась сортировка или нет.
begin
Result:=true; exit;
end;
...
В итоге, что мы имеем.
В первом случае, с процессором AMD, эффективность сортировки упала на 100%. Во втором - с процессором Intel, все прекрасно.
Чем обусловлено такое поведение программы? И как же нам быть с такой бедой?
Прикрепил весь проект, на всякий случай. Тестировал первоначально у себя дома на Windows 7, процессор Intel и все оказалось замечательно. Протестировал в институте на Windows XP, процессор Intel - все прекрасно, пришел в 219 где стоят компьютеры с AMD и Windows XP - и снова увидел разницу во времени.
Для тестирование использовались два скомпилированный .exe файла.
1. с проблемным кусочком кода.
2. без такового (не закомментированным, при компиляции, а полностью удаленным из кода).
P.S.: Решение далеко не оптимальное, но все же почему такая разница во времени выполнения на AMD и почему ее нет на Intel?