Ticket #4831 (new bug)

Opened 3 years ago

Last modified 9 months ago

Too many specialisations in SpecConstr

Reported by: simonpj Owned by: rl
Priority: low Milestone: 7.6.2
Component: Data Parallel Haskell Version: 7.0.1
Keywords: Cc:
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: None/Unknown Difficulty:
Test Case: Blocked By:
Blocking: Related Tickets:

Description

Ben reports that SpecConstr can loop:

{-# LANGUAGE PArr #-}
{-# OPTIONS -fvectorise #-}

module Loop where
import Data.Array.Parallel.Prelude
import Data.Array.Parallel.Prelude.Double
import qualified Prelude

loop :: [:Double:] -> [:Double:]
loop xs 
    | 0 == 0    = xs
    | otherwise     = ([::] !: 0) +:+ [::] +:+ ([::] !: 0)

Compile with

~/devel/ghc/ghc-head-incoming/inplace/bin/ghc-stage2 -c -Odph -fdph-seq -package dph-seq -package dph-prim-seq -c Loop.hs

(You need to build the DPH libraries first, of course.) This causes SpecConstr to loop for at least 5 mins on my machine. Removing the middle [::] in the last line gets it though SpecConstr, but the result size is 1501143 and it then runs out of memory in the simplifier.

Building with -dph-par runs fine.

This is probably also why the dph-words benchmark in the testsuite is failing due to using too much memory during compilation.

Change History

Changed 2 years ago by igloo

  • milestone set to 7.0.3

Changed 2 years ago by simonmar

  • owner set to simonpj

Changed 2 years ago by rl

Don't be so impatient! It does terminate eventually after generating 6162 specialisations.

For the lifted version of the function, we produce a loop with this type:

                $wa_s5Ep [Occ=LoopBreaker]
                  :: Data.Vector.Fusion.Stream.Monadic.SPEC
                     -> GHC.Prim.Int#
                     -> Data.Maybe.Maybe Data.Array.Parallel.Base.Util.Tag
                     -> GHC.Prim.Int#
                     -> Data.Maybe.Maybe Data.Array.Parallel.Base.Util.Tag
                     -> (GHC.Types.Int, GHC.Types.Int, Data.Maybe.Maybe GHC.Types.Int)
                     -> (GHC.Types.Bool,
                         Data.Maybe.Maybe GHC.Types.Int,
                         GHC.Types.Int,
                         ((GHC.Types.Int, Data.Maybe.Maybe GHC.Types.Int, GHC.Types.Int),
                          (GHC.Types.Int,
                           Data.Maybe.Maybe GHC.Types.Int,
                           (GHC.Types.Int, GHC.Types.Int, Data.Maybe.Maybe GHC.Types.Int)),
                          Data.Maybe.Maybe GHC.Types.Int),
                         GHC.Types.Int,
                         (GHC.Types.Bool,
                          Data.Maybe.Maybe GHC.Types.Int,
                          GHC.Types.Int,
                          (GHC.Types.Int, GHC.Types.Int),
                          GHC.Types.Int,
                          ((GHC.Types.Int, Data.Maybe.Maybe GHC.Types.Int, GHC.Types.Int),
                           (GHC.Types.Int,
                            Data.Maybe.Maybe GHC.Types.Int,
                            (GHC.Types.Int, GHC.Types.Int, Data.Maybe.Maybe GHC.Types.Int)),
                           Data.Maybe.Maybe GHC.Types.Int)))
                     -> (GHC.Types.Int,
                         (GHC.Types.Int,
                          Data.Maybe.Maybe Data.Array.Parallel.Base.Util.Tag,
                          (GHC.Types.Int, GHC.Types.Int, Data.Maybe.Maybe GHC.Types.Int)),
                         Data.Maybe.Maybe GHC.Types.Double)
                     -> GHC.Prim.State# s_X3Gj
                     -> (# GHC.Prim.State# s_X3Gj, GHC.Types.Int #)

We basically expect SpecConstr to specialise on every Maybe and Bool which is what it does for all combinations that can actually occur when the program runs.

The real problem is that we simply fuse too much in this example. I suppose we'll just have to give up on fusing lifted concatenation when generating sequential code. We don't do it in the parallel case, anyway, which explains why the examples only fail to compile with -fdph-seq. I'm going to rebrand this as a DPH bug.

Changed 2 years ago by rl

  • owner changed from simonpj to rl
  • component changed from Compiler to Data Parallel Haskell
  • summary changed from Infinite loop in SpecConstr to Too many specialisations in SpecConstr

Changed 21 months ago by igloo

  • milestone changed from 7.2.1 to 7.4.1

Changed 16 months ago by igloo

  • priority changed from normal to low
  • milestone changed from 7.4.1 to 7.6.1

Changed 9 months ago by igloo

  • milestone changed from 7.6.1 to 7.6.2
Note: See TracTickets for help on using tickets.