В чем разница между PARray и [::] в Параллельные данные на Haskell?

Я провел много исследований 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, что, учитывая его размер и сложность, — это то, что я очень хочу сделать, даже если я был уверен, что у меня все получится.

33
задан gereeter 3 September 2012 в 01:21
поделиться