Ticket #4276 (closed bug: duplicate)

Opened 18 months ago

Last modified 14 months ago

-O0 runs in constant space, -O1 and -O2 don't

Reported by: guest Owned by: igloo
Priority: normal Milestone: 7.4.1
Component: Compiler Version: 6.12.1
Keywords: optimization space leak Cc: omarab@…, daniel.is.fischer@…
Operating System: Windows Architecture: x86
Type of failure: Runtime performance bug Difficulty:
Test Case: Blocked By:
Blocking: Related Tickets:

Description

Enabling optimization changes the space complexity of this small program, which seems like a bug. Run the attached program with command line argument equal to 22 or greater.

Description of the program: given a real valued function f, compute the sum f(x_i) over an increasingly finer and finer mesh of sample points. If the new mesh shares points with the old mesh this can be computed somewhat more efficiently by reusing the previous sum.

Looking at the Time and Allocation report, it seems like the optimized versions of the program are actually computing the sum 2 ** n times instead of n times. This is probably related to what is causing the space behavior.

Attachments

test.hs Download (0.5 KB) - added by guest 18 months ago.

Change History

Changed 18 months ago by guest

Changed 17 months ago by igloo

  • milestone set to 7.2.1

Great testcase, thanks!

Changed 16 months ago by daniel.is.fischer

  • cc daniel.is.fischer@… added

Changed 15 months ago by simonpj

  • owner set to igloo

Ian, might you investigate a bit, pls?

Changed 14 months ago by igloo

  • status changed from new to closed
  • resolution set to duplicate

This looks like another full-laziness issue, with [0..] being shared. If you compile with -O1 -fno-full-laziness then space usage matches -O0.

Here's a smaller program:

module Main (main) where

import Data.List

sum' :: [Double] -> Double
sum' xs = foldl' (+) 0 xs

go :: Double -> [Double]
go w = sum' xs : go (w / 2) 
    where xs = takeWhile (<= 23) [k*w | k <- [0..]]

main :: IO ()
main = mapM_ print $ take 20 $ go 22

Closing as a duplicate of #917.

Note: See TracTickets for help on using tickets.