Di Haskell, saya memiliki daftar yang dapat dievaluasi secara paralel. Setiap evaluasi individu tidak memakan waktu lama, tetapi ada banyak dari mereka (1 juta, misalnya). Saya menggunakan library berikut . Rencananya adalah membagi daftar menjadi beberapa bagian dan menjalankannya secara paralel. Saya memiliki sesuatu seperti berikut ini yang berfungsi:

import Control.Parallel.Strategies
import Control.DeepSeq

-- Imagine this being slightly more expensive
kindaExpensiveComputation :: Int -> [Int]
kindaExpensiveComputation n = replicate n 42

main :: IO ()
main = do
    let n = 1000000
    let args = replicate n 20
    let chunkSize = n `div` 10
    let result = force $ withStrategy (parListChunk chunkSize rseq) . map kindaExpensiveComputation $ args
    -- do stuff with result here
    -- end program

Saya ingin menambahkan bilah kemajuan untuk ini sehingga saya dapat melacak berapa banyak daftar yang telah dilakukan. Naluri saya adalah mencoba sesuatu seperti berikut:

import Control.Parallel.Strategies
import Control.DeepSeq
import System.ProgressBar

-- Imagine this being slightly more expensive
kindaExpensiveComputation :: ProgressBar s -> Int -> IO [Int]
kindaExpensiveComputation pb n = do
    let res = replicate n 42
    incProgress pb 1
    return res

main :: IO ()
main = do
    let n = 1000000
    let args = replicate n 20
    let chunkSize = n `div` 10
    pb <- newProgressBar defStyle 10 (Progress 0 n ())
    let result = force $ withStrategy (parListChunk chunkSize rseq) . map (kindaExpensiveComputation pb) $ args
    -- do stuff with result here
    -- end program

Tapi force sepertinya tidak bisa menangani IO. Saya sudah mencoba beberapa hal lain, tetapi apa pun yang saya coba mengevaluasi daftar IO [Int] secara paralel tetapi bukan konten sebenarnya dari IO. Saya melihat bahwa perpustakaan paralel memiliki beberapa fungsi seperti withStrategyIO, meskipun saya tidak yakin bagaimana menggunakannya atau apakah itu yang saya cari.

Saya pikir pemahaman saya tentang bagaimana Haskell mengevaluasi ekspresi menyebabkan kebingungan saya, jadi petunjuk apa pun tentang itu juga akan membantu.

5
kevinrtai 2 April 2021, 20:35

1 menjawab

Jawaban Terbaik

Sayangnya, saya percaya GHC saat ini tidak mengekspos fungsionalitas apa pun untuk mengamati (dalam IO, tentu saja) kemajuan evaluasi perhitungan paralel. Anda perlu menggunakan konkurensi dalam bentuk forkIO dan teman (atau perpustakaan yang membungkusnya seperti paket async).

0
Daniel Wagner 2 April 2021, 20:39