au> Понятно, пусть так. Ну и дерзнул бы: выделил бы машинку под этот код, и пусть себе считает. В чём же проблема? Так вы же запросили примеры нераспараллеливаемых задач.
>Как уже надцать раз повторил, параллелить ничего и не надо в такой архитектуре: ядро и его память целиком в распоряжении этого кода, в отличие от компов с осями и т.п. переключаемой многозадачностью. Ну, так оно и происходит в компах с осями и т.п. Т.е. берем комп, и даем ему это дело считать. Мой I5 на задаче типа 2й тупо грызет её в одно ядро. Потому что остальные 3 ядра ему ничем помочь не могут. И толк от них только тогда, когда мне надо порешать эту же задачу для нескольких начальных условий.
А в задаче о многих взаимодействующих телах у ядра может своей памяти не хватить, там на каждом шаге вычислений для последующего положения одной частицы
необходимо иметь конкретные текущие значения величин взаимодействия со всей оравой остальных частиц. Орава может исчисляться десятками-сотнями миллионов. Каждому по 6 величин типа extended/long double - это 60 байт (в лучшем случае) только на кинематику. И вот уже гигабайты нужны.
Решение этой задачи распараллелить можно, но только при условии, что все ядра лезут в общую память и могут читать везде. И все выполняют свои вычисления максимально одновременно, чтобы потом они смогли в нее параллельно писать (не везде, а каждое в свою выделенную область) в уверенности, что все ядра сейчас именно пишут промежуточные результаты, и никто не пытается прочесть.
Уверенность в последнем может дать только ОС, с помощью которой одно супервайзорное ядро следит за остальными, вычислительными ядрами. Раздает каждому адреса для записи, дает всем прочесть данные отовсюду, и обязательно командует парадом.
По пунктам, ОС на ЦЯ.
0. Раздаст постоянные адреса для записи в общей памяти, загрузит начальные данные и код ядрам, ожидая ото всех запрос на чтение.
1. Ждет, когда все закончат чтение данных (стало быть, начали считать), после чего
2. Запретит читать и ждет, пока от всех ядер не придет запрос на запись (все досчитали), после чего
3. Разрешит писать и ждет, пока ото всех не придет запрос на чтение(все дописали). Проверит, не закончено ли вычисление. Если закончено, то выход, а если нет, то запретит писать, разрешит читать и сделает переход к п.1.
Под такие игрища всегда выделяли суперкомпы, из-за их многопроцессорности, из-за дурных объемов требуемой памяти и из-за того, что ядра/процессоры сами по себе были самыми быстрыми на данный момент и были оснащены параллельным доступом к памяти (управляемым) - оч. дорогое удовольствие.
upd: А когда тел, скажем, всего 10, а ядер 100, то задача на 100 ядер уже не распараллеливается, а вся необходимость общего управления счетом и доступом к общей памяти для 10 вычислительных остается. Совсем как у меня на 4хядернике. Работать будут 11 ядер под одной осью, 89 будут курить бамбук.
Солипсизм не пройдёт! :fal:
Это сообщение редактировалось 01.07.2011 в 18:48