Мы использовали PARLANSE , язык параллельного программирования с явной частичной спецификацией параллелизма за последнее десятилетие, для реализации масштабируемой системы анализа и преобразования программ ( DMS Software Reengineering Toolkit ), который в основном выполняет символические, а не числовые вычисления. PARLANSE - это скомпилированный C-подобный язык с традиционными скалярными типами данных символьные, целочисленные, с плавающей запятой, динамические типы данных строка и массив, составные типы данных структуры и объединения, а также функции с лексической областью. В то время как большая часть языка - ваниль (арифметические выражения над операндами, операторы if-then-else, циклы do, вызовы функций), параллелизм - нет. Параллельность выражается путем определения отношения «предшествует» для блоков кода (например, a перед b, a перед c, d перед c)
записано как
(|; a (... a's computation)
(<< a) b ( ... b's computation ... )
(<< a) c ( ....c's computation ...)
(>> c) d ( ... d's computation...)
)|;
где операторы << и >> ссылаются на «заказ во времени». Компилятор PARLANSE может видеть эти параллельные вычисления и предварительно распределять все структуры, необходимые для вычисления
зерна a, b, c, d и генерируют пользовательский код для запуска / остановки каждого из них, тем самым сводя к минимуму накладные расходы на запуск и остановку этих параллельных зерен.
См. Эту ссылку для параллельного итеративного углубления поиска оптимальных решений для 15-головоломки , которая является старшим братом 4-х 4-головоломки. Он использует только потенциал параллель в качестве конструкции параллелизма (|| abcd) , которая говорит, что в вычислениях нет ограничений частичного порядка a b c d , но он также использует спекуляции и асинхронно прерывает задачи, которые не могут найти решения. В коде немало идей.
PARLANSE работает на многоядерных ПК. Большая программа PARLANSE (мы построили много с 1 миллионом + строк или более) будет иметь тысячи этих частичных порядков, некоторые из которых вызывают функции, которые содержат другие.
До сих пор у нас были хорошие результаты с использованием до 8 процессоров и скромные выплаты до 16, и мы все еще настраиваем систему. (Мы думаем, что реальная проблема с большим количеством ядер на современных ПК - пропускная способность памяти: 16 ядер, подсистема памяти которых создает огромную пропускную способность).
В большинстве других языков параллелизм не раскрывается, поэтому его трудно найти, и системы времени исполнения платят высокую цену за планирование вычислений, используя примитивы планирования общего назначения. Мы думаем, что это может привести к катастрофе или, по крайней мере, к низкой производительности из-за закона Амхдаля: если количество машинных инструкций для составления графика гранулирования велико по сравнению с работой, вы не можете быть эффективными. OTOH, если вы настаиваете на том, что детали вычислений со многими машинными инструкциями сохраняют затраты на планирование относительно низкими, вы не можете найти детали вычислений, которые являются независимыми, и поэтому у вас нет никакого полезного параллелизма для планирования. Таким образом, основная идея PARLANSE состоит в том, чтобы минимизировать стоимость планирования зерен, чтобы зерна могли быть маленькими, чтобы их можно было найти в реальном коде. Понимание этого компромисса пришло из полного отказа парадигмы чистого потока данных, которая делала все параллельно с крошечными параллельными порциями (например, оператор добавления).
Мы работали над этим в течение десятилетия. Трудно понять это правильно. Я не понимаю, как люди, которые не строили параллельные языки и не использовали / не настраивали их для этого периода времени, имеют серьезные шансы на создание эффективных параллельных систем.