2012-06-19 6 views
33

Ho fatto molte ricerche su Data Parallel Haskell e ho trovato due tipi di array paralleli separati. Il tipo [::] sembra presentarsi di più nei documenti di ricerca e sembra essere il tipo ideale, ma il PArray sembra essere bloccato ovunque. La pagina wiki sull'argomento rende molto chiaro che gli array di tipo [::] non possono essere passati a codice non autorizzato. Perché? Perché è presente questo tipo intermedio PArray? Mi sembra del tutto superfluo. Il wiki lo chiama "array piatto", ma l'intero punto della vettorizzazione è rendere flat gli array paralleli.Qual è la differenza tra PArray e [::] in Data Parallel Haskell?

Aggiornamento: Dopo aver letto più documenti e documentazione e codice sorgente sono ancora più confuso. sembra essere implementato in GHC.PArr come un array flat, mentre PArray, il tipo intermedio che viene chiamato "flat" in più posizioni, è implementato in Data.Array.Parallel.PArray.Base e altri moduli importati da lì come famiglia di dati, utilizzando l'appiattimento trasformazione descritta in così tanti articoli che ho letto. Perché gli array piatti non sono piatti e quelli nidi sono piatti?

Aggiornamento 2: dopo ulteriori ricerche, ho trovato che la documentazione è un disastro completo. La pagina wiki hasn't had any content updates in quasi un anno, contraddice la documentazione di hacking (vedi Data.Array.Parallel.Prelude, dove dice esplicitamente di non importare il preludio speciale), ed è generalmente obsoleta. Anche lo GHC Trac page non è aggiornato, inclusa, ad esempio, una guida ai pacchetti DPH che menziona pacchetti che, almeno per quanto riguarda Hackage, non li ho, e non ho abbastanza dove cercare in altri posti), non esistono e non menzionano pacchetti come dph-lifted-vseg.

In compenso, credo ora capisco la risposta al primo aggiornamento, accennato da questa parte dei commenti in 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. 

E 'la mia ipotesi che, quando vettorializzazione è abilitato, quel modulo viene automaticamente sostituito con un'altra rappresentazione che utilizza la trasformazione di appiattimento. Questo potrebbe anche essere qualcosa come

type [::] = PArray 

, risolvere il mio problema originale. Tuttavia, non solo quest'ultimo punto non ha molto senso (perché limitare [::] a un tipo di matrice piatta quando la vettorizzazione è disattivata?), Ma non ho trovato alcuna prova a supporto di entrambe le teorie oltre al commento menzionato sopra. Sembra che l'unico modo affidabile per imparare qualsiasi cosa è guardare la fonte GHC, che, data la sua dimensione e complessità, è qualcosa che sono desideroso di fare, anche se ero sicuro che avrei avuto successo.

risposta