Я провел много исследований Data Parallel Haskell и обнаружил два отдельных типа параллельных массивов. . Тип [::]
, кажется, чаще встречается в исследовательских работах и кажется идеальным типом, но PArray
кажется застрявшим повсюду. Вики-страница по этому вопросу ясно дает понять, что массивы типа [::]
не могут быть переданы в невекторизованный код. Почему? Почему существует этот промежуточный тип PArray
? Мне это кажется совершенно лишним. Вики называет это «плоским массивом», но весь смысл векторизации в том, чтобы сделать параллельные массивы плоскими.
Обновление: прочитав больше статей, документации и исходного кода, я еще больше запутался. [::]
или его синоним PArr
похоже, реализованы в GHC.PArrкак плоский массив, тогда как PARrray
, промежуточный тип, который во многих местах называется «плоским», реализован в Data.Array.Parallel.PArray.Baseи других модулях, импортированных оттуда как семейство данных, с использованием выравнивающего преобразования, описанного во многих газеты, которые я читал.Почему плоские массивы не плоские, а вложенные плоские?
Обновление 2: Проведя дополнительные исследования, я обнаружил, что документация — это полный беспорядок. Вики-страница не обновляла содержимоепочти год, что противоречит документации по взлому (см. Data.Array.Parallel.Prelude, где прямо сказано не импортировать специальные prelude) и просто в целом устарел. Страница GHC Tracтакже устарела, включая, например, руководство по пакетам DPH, в котором упоминаются пакеты, совершенно негде искать в других местах), не существует и не упоминает такие пакеты, как dph-lifted-vseg.
Более того, я думаю, что теперь я понимаю ответ на первое обновление, на которое намекает эта часть комментариев в GHC.PArr:
-- BIG UGLY HACK: The desugarer special cases this module. Despite the uses of '-XParallelArrays',
-- the desugarer does not load 'Data.Array.Parallel' into its global state. (Hence,
-- the present module may not use any other piece of '-XParallelArray' syntax.)
--
-- This will be cleaned up when we change the internal represention of '[::]' to not
-- rely on a wired-in type constructor.
Я предполагаю, что при векторизации включен, этот модуль автоматически заменяется другим представлением, использующим преобразование выравнивания. Это может быть даже что-то вроде
type [::] = PArray
, решая мою первоначальную проблему. Однако последний пункт не только не имеет особого смысла (зачем ограничивать [::]
типом плоского массива, когда векторизация отключена?), но я не нашел никаких доказательств в поддержку любой теории, кроме комментария упомянутый выше. Кажется, что единственный надежный способ узнать что-либо — это взглянуть на исходный код GHC, что, учитывая его размер и сложность, — это то, что я очень хочу сделать, даже если я был уверен, что у меня все получится.