1. Решаю задачу взаимодействие многих тел. Объект - система тел. Одна процедура вычисляет все силы в системе (тут больше всего операций), вторая сдвигает тела, после того как все силы вычислены, + разные сервисные операции, вывести во вьюшку, записать в файл, записать картинку на диск, отчитаться в Лог.
Этап вычисления сил отлично распараллеливается (в голове пока
). Раздаем объект разным процессорам (методам работающим на разных процессорах) и говорим, что один считает первую половину тел системы, второй - вторую. Потом они записывают результат назад в объект и запускается следующая процедура (перемещение). И так далее.
Сейчас я почти в реальном времени считаю 200 заряженных шариков, а необходимо больше. Решил записывать bmp и потом собирать их в avi, чтобы смотреть, что получается, но этот процесс хочется ускорить.
2. Обучаю нейросеть. Там примерно то же самое можно сделать. Следующая итерация объекта зависит от состояния объекта на предыдущем шаге, а значит можно разбить на независимые вычисления.
Мне бы помог такой инструмент: клоны методов для разных процессоров. Скажем вот такой абстрактный код:
Код:
MODULE GasDinamic;
IMPORT CpuMaster;
TYPE
Body = RECORD
f, .... : REAL;
END;
System = POINTER TO ARRAY OF Body;
VAR
gas: System;
PROCEDURE (sys: System) Count (a, b: INTEGER), NEW;
VAR i: INTEGER;
BEGIN
FOR i:=a TO b-1 DO
sys[i].body.f := F(sys); (* где F нигде не зависит от sys[*].body.f *)
END
END Count;
PROCEDURE (sys: System) Step(cpu: INTEGER), NEW;
VAR n,i: INTEGER;
BEGIN
n:=CpuMaster.HowMuch; (* Определяем сколько процессоров *)
FOR i:=0 TO n-1 DO
CpuMaster.Exec(sys.Count(LEN(sys)/n*i,LEN(sys)/n*(i+1)), i); (* выполнить процедуру на i процессоре *)
END;
CpuMaster.Wait; (* теперь ждем пока посчитает каждый свою порцию и продолжаем работу. *)
...
END Step;
...
BEGIN
NEW(gas, 100);
...
END GasDinamic.
Как такой CpuMaster написать? Или есть проще решение? Я не специалист в программировании.