Skip to content

parBuffer doesn't use all cores when told to. #67

@noahmartinwilliams

Description

@noahmartinwilliams

I tried compiling the following code with ghc-9.2.8:

module Main (main) where

import Control.Parallel.Strategies
import GHC.Conc
import System.IO
import Text.Printf

sigmoid :: Double -> Double
sigmoid x = 1.0 / (1.0 + (exp (-x)))

genStuff :: [String]
genStuff = do
    let ints = [0..]
        doubles = map (\x -> fromIntegral x :: Double) ints
        sigmoids = map (\x -> sigmoid x) doubles
        strs = map (\x -> (printf "%.5F" x) ++ "\n") sigmoids
    strs

main :: IO ()
main = do
    hSetBuffering stdout LineBuffering
    let stuff = genStuff `using` parBuffer numCapabilities rdeepseq
    putStr (foldr (++) "" (take 100000 stuff))

And I compiled it with -threaded -rtsopts -eventlog and used threadscope to look at the results, and got this:

threadscope-parbuffer-test

I'm pretty sure that it should be using all of the cores consistently, shouldn't it?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions