belsen85
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Итак, даю подробное объяснение начальных условий и проблем своей задачи, так сказать: - Проблема первая - я не программист, а инженер, что кодил до этого только инженерные проблемы.
- Есть программа - пакет для расчета методом конечных элементов Abaqus, которая имеет, естественно закрытый код. Но у нее есть полезная возможность - к ней можно писать сабрутины на Фортране, что компилируются с основным кодом перед запуском расчета.
- Естественно, что при написании этих сабрутин надо следовать строгим правилам, чтобы они могли скомпилиться с основным кодом (названия и тип переменных), а так же они выполняются по определенным основным кодом (то есть разработчиками Абакуса, годах этак в 1980-х) принципам.
- Два главных правила:
- Параллизация расчета - модель делится на "куски", в зависимости от количества задействованных ядер. И каждый кусок считается в отдельно запущенном отдельном процессе explicit.exe.
- Векторизция расчета - все действия на user defined variables производятся только с циклом не больше nblock. Сам nblock определяется основным кодом и зависит от типа процессора (скорее всего связан с кэшем процессора). Просто этот цикл повтиряется, пока не пройдет все элементы в модели.
То есть, мне надо посчитать среднее значение (Sred) какой-то определенной мной переменной (X) по всем элементам в модели (N=650) и nblock для моего процессора = 136. Так вот, если я напишу Код: do k=1, N Sred = X(k)/sum(X(1:N)) end do | Программа на самом деле автоматически выполнит 5 циклов: Код: do k=1, nblock Sred = X(k)/sum(X(1:nblock)) end do do k=nblock+1, nblock*2 Sred = X(k)/sum(X(nblock+1:nblock*2)) end do и так далее | И в результате Sred, что я получу, будет только значение за последние 106 элементов. Можно конечно задавать ее как array изоначально, но если у меня 1,5 млн //элементов? Это ж сколько вложенных подциклов будет? При этом если я использую больше 1 процессора, описать как доставать данные с других explicit.exe я не знаю, кроме как писать все это дело в txt файлы, что тоже нелегко, так как процессы конфликтуют между собой (если файл уже открыт одним, то другие выдают ошибку доступа к файлу и расчет выходит обрывается). Я пока нашел некрасивое решение - это обращение к данным, что программа создает в конце рассчета автоматически (то есть это было накодино создателями), и обрабатывается Питоном (есть спец аддон для работы с этими данными для Питона), но потом опять проблема - как посчитаное значение Sred в Питоне передать назад в сабрутину, если больше одного процессора задействовано + такой подход явно сказывается на производительности (запись данных, зактырие расчета, обработка питоном, рестарт расчета и чтение данных, созданных Питоном) Собственно, высказался. У кого какие идеи? | Всего записей: 26 | Зарегистр. 11-07-2012 | Отправлено: 13:10 23-07-2012 | Исправлено: belsen85, 13:13 23-07-2012 |
|