FuzzyLogic
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору belsen85 Почитал про ваш абакус, больше времени не могу потратить, может что-то и недопонял. Но в вашей постановке задачи только так как вы сделали. Софтины нет, попробовать не могу, а искать, ставить итд - нет времени. Но сутя по документации для 6.10 там есть два способа параллелизации - loop parallelization и domain decomposition. Вы похоже делаете второе, и у меня создалось ощущение что сделав первое вы возможно получите nblock=колво эл-тов. Хотя возможно что скорость расчёта от этого пострадает. Можно пытаться начать городить руками всякие семафоры и синхронизацию нитей, но есть подозрение что это будет мартышкин труд, потому как по идее либо философия софта такая что это вообще не надо (и тогда вы пытаетесь взлететь на самокате) либо это уже есть но вы просто недочитали (и тогда это будет изобретание велосипеда). akaGM эксплисит.учу это скомпилированная модель - основную часть которой составляет тот самый абакакус (CFD код), который позволяет менять встроенные методы расчёта разных сил, взаимодействий итд на то что хочет юзер. И похоже что при распараллеливании (возможно только для domain decomposition, я не понял, а долго искать не стал) он просто делит всю сетку на куски и каждый кусок считает отдельным thread'ом (тот самый .учу), а вот как между ними делается синхронизация (и делается ли) я так и не понял. В результате пишущий код юзер "видит" переменную ограниченную куском сетки выделенной данному процессу. Потому как менять можно (опять же как я понял) только некоторые методы и интерфейсы прописаны так что передаётся только соотв. кусок. Не имея софтины на руках не стал пытаться и угадать как там синхронизируются нити и делается ли это вообще. Потому что читая мануал у меня создалось впечатление что процессы вообще независимы - там есть dynamic balancer который в случае если какие-то треды убегают далеко вперёд делает передекомпозицию сетки чтоб считалось всё равномерно. А пример кода прост: subroutine calculate_some_force(nblock, invar, invar2,...) где nblock - кол-во элементов в куске сетки отданной на расчёт данному процессу invar1,2 - какая-нить переменная размером в nblock вопрос как получить invar(1:N) где N-размер всей сетки, если дают только invar(1:nblock) Ну или как получить invar у соседних процессов, которые считают свои куски сетки В общем RTFM в помощь |