私は Data Parallel Haskell について多くの調査を行ってきましたが、2 つの別個の並列配列タイプを見つけました。この[::]
タイプは研究論文でより多く見られるようで、理想的なタイプのPArray
ようですが、どこにでも行き詰まっているようです. [::]
この件に関する wiki ページでは、型の配列をベクトル化されていないコードに渡すことができないことが非常に明確になっています。なんで?なぜこの中間PArray
タイプがあるのですか?それは私には完全に不必要に思えます。ウィキではこれを「フラット配列」と呼んでいますが、ベクトル化の要点は、並列配列をフラットにすることです。
更新: より多くの論文、ドキュメント、およびソース コードを読んだ後、私はさらに混乱しました。[::]
またはその同義語はフラット配列としてGHC.PArrPArr
に実装されているようですが、複数の場所で「フラット」と呼ばれる中間型である は、Data.Array.Parallel.PArray.Baseおよびそこからインポートされた他のモジュールに実装されています。私が読んだ非常に多くの論文で説明されている平坦化変換を使用したデータファミリ。フラット配列がフラットではなく、ネストされた配列がフラットなのはなぜですか?PArray
更新 2: さらに調査した結果、ドキュメンテーションが完全に混乱していることがわかりました。この wiki ページには、ほぼ 1 年間コンテンツの更新がなく、ハックのドキュメントと矛盾しており ( Data.Array.Parallel.Preludeを参照してください。特別なプレリュードをインポートしないことが明示されています)、一般的に古くなっています。GHC Tracのページも古くなっています。たとえば、少なくとも Hackage に関する限り、パッケージについて言及している 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 のソースを見ることだと思われます。そのサイズと複雑さを考えると、たとえ成功すると確信していたとしても、それは私が熱望しているものです。