Почему невозможно выполнить файл компиляции параллельно? - PullRequest
0 голосов
/ 25 октября 2018

У меня есть проект, в котором много файлов, которые не управляются ASDF и скомпилированы вручную.Эти файлы полностью независимы, и возможность их параллельной компиляции казалась мне способом сокращения времени компиляции.Мой план состоял в том, чтобы скомпилировать эти файлы параллельно, а затем последовательно загрузить созданные файлы FASL.Но после того, как я распараллелил компиляцию, я увидел, что улучшение производительности было практически нулевым.Затем я пошел к источникам SBCL и обнаружил, что compile-file принимает блокировку мира , которая по существу секвенирует компиляцию.

Мой вопрос: в чем причина того, что compile-file берет эту блокировку?Хотя параллельная загрузка FASL действительно может привести к некоторым условиям гонки, мне показалось, что компиляция файлов Lisp должна быть независимой и распараллеливаемой.

1 Ответ

0 голосов
/ 25 октября 2018

Компилятор доступен с языка.Вы можете выполнять программирование во время компиляции, иметь макросы компилятора и т. Д. Так же, как иллюстрация, есть (eval-when (:compile) …).Вы не можете исключить эффекты времени компиляции в целом, и это должно было бы быть потокобезопасным везде.Я полагаю, что усилия по созданию этого робота намного больше, чем кто-либо желал инвестировать.

Вы можете запустить несколько изображений Lisp для параллельной компиляции.Вам просто нужно обработать граф зависимостей при организации этого.

ОБНОВЛЕНИЕ: Я только что наткнулся на разговор, который, кажется, подразумевает, что SBCL ближе к избавлению от этой блокировки, чем я думал: https://sourceforge.net/p/sbcl/mailman/message/36473674/

...