add pass REMOVE_DIST_ARRAYS_FROM_IO, make copyArray fuction from resolve_par_regions public #53
Reference in New Issue
Block a user
Delete Branch "replace_dist_arrays_in_io"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Новый проход для подмены обращений к распределённым массивам на ввод/вывод.
Как написано в документации, распределённые массивы можно вводить-выводить только если 1) форматная строка = * 2) вводится/выводится массив целиком и только он один, поэтому создание массивов-копий триггерят только операторы, не удовлетворяющие 1) или 2).
Алгоритм написан так, чтобы:
Для копирования массивов использовал функцию из RESOLVE_PAR_REGIONS
Для вставки копирования массивов это сделать не получилось, потому что она не работает в случае если между операциями копирования всего оператор
Добавил проверку на то, есть ли между операциями копирования между оригинальными массивами и копиями операторы записи/чтения. На основе этого ненужные операции копирования не вставляются
Добавил вставку PROCESS_PRIVATE директив
еще потестирую это на тестах.
@@ -0,0 +18,4 @@{if (exp){if (isSgArrayRefExp(exp))какие массивы мы тут ищем? есть функция, которая проверяет на правильные массивы, а не на все подряд.
Что значит правильные? Возможно, фикс сообщения ниже фиксит и это
есть функция bool isArrayRef(SgExpression* ex); из SgUtils, которая проверяет нужные массивы, по всему проекту это уже распространилось.
@@ -0,0 +52,4 @@if (!arg)return;if (arg->variant() != ARRAY_REF)что если это будет массив строк? то есть не распределенный и вообще массив, который никогда не будет распределнным?
Добавил проверку на распределённость в конце функции:
@@ -0,0 +65,4 @@if (!need_replace){switch (var)возможно тут можно использовать производные классы Sg для принтов и write/read
Можно, но зачем делать if else, если switch подходит? Или каст к Sg классам чем-то принципиально лучше?
имелось в виду в самом свиче, так как там явно не все случаи учтены, может быть стоит посмотреть разбор этих операторов в IR, так как там могут быть "циклы" в этих операторах вывода. А остальные операторы, которые ввод вывод формируют или участвую в нем, не нужно обрабатывать?
Я думаю стоит сначала слить, а потом обработать другие варианты
В целом здесь и не нужно парсить все случаи - достаточно распарсить тривиальный случай fmt = *, args = <один массив>, во всех остальных - консервативно помечать все массивы для подстановки
@@ -0,0 +326,4 @@}void replaceDistributedArraysInIO(std::vector<ParallelRegion*>& regions,const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo,std:: можно стереть, ниже без std:: уже есть описания.
@Alexander_KS мои ответы или коммит уведомления пришли? Или на это упоминание хотя бы?
Нужно сделать или rebase или merge, так как не самая актуальная версия
dc18a17e5ato4a06430139[WIP] add pass REMOVE_DIST_ARRAYS_FROM_IO, make copyArray fuction from resolve_par_regions publicto add pass REMOVE_DIST_ARRAYS_FROM_IO, make copyArray fuction from resolve_par_regions public