Ticket #4276 (closed bug: duplicate)

Opened 3 years ago

Last modified 2 years 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 3 years ago.

Change History

Changed 3 years ago by guest

Changed 3 years ago by igloo

  • milestone set to 7.2.1

Great testcase, thanks!

Changed 3 years ago by daniel.is.fischer

  • cc daniel.is.fischer@… added

Changed 3 years ago by simonpj

  • owner set to igloo

Ian, might you investigate a bit, pls?

Changed 2 years 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.