Size: a a a

2021 April 02

K

Kir in Haskell
Kirill Valyavin
Пробовал, пробовал
Есть ещё безумный вариант попробовать написать свой noInline на STG
источник

AA

A64m AL256m qn<co... in Haskell
ну че-то анлифтнутого типа-то ему нельзя будет наверх уносить!
источник

IO

I O in Haskell
Вообще noSharing :: a -> a звучит как что-то что можно сделать на кор плагине, надо будет попробовать
источник

O

Ortofax in Haskell
foo a = [1.. seq a 1000] - так не заработает?
источник

IO

I O in Haskell
Не, гхц слишком умный, такой фигней его не обмануть.

foo1 :: [Int]
foo1 = eftInt 1# 1000#

foo :: forall a. a -> [Int]
foo
 = \ (@ a_aPX) (a1_aPO :: a_aPX) ->
     case a1_aPO of { __DEFAULT -> foo1 }
источник
2021 April 03

IO

I O in Haskell
Вот так сработает

foo :: a -> [Int]
foo a = noinline enumFromTo 1 (seq a 1000)


Не зная ничего об enumFromTo (из-за noinline) гхц ничего сделать не сможет, seq не вынесет
источник

K

Kir in Haskell
I O
Вот так сработает

foo :: a -> [Int]
foo a = noinline enumFromTo 1 (seq a 1000)


Не зная ничего об enumFromTo (из-за noinline) гхц ничего сделать не сможет, seq не вынесет
В ghc-8.8.2 в GHC.Exts никакого noinline нету. А вот в пакете base-4.15.0.0 - есть. Это под какую версию компилятора-то?
источник

KV

Kirill Valyavin in Haskell
Kir
В ghc-8.8.2 в GHC.Exts никакого noinline нету. А вот в пакете base-4.15.0.0 - есть. Это под какую версию компилятора-то?
GHC.Magic
источник

K

Kir in Haskell
Спасибо
источник

K

Kir in Haskell
I O
Вот так сработает

foo :: a -> [Int]
foo a = noinline enumFromTo 1 (seq a 1000)


Не зная ничего об enumFromTo (из-за noinline) гхц ничего сделать не сможет, seq не вынесет
Что я делаю не так?

import Debug.Trace

import GHC.Magic (noinline)

ping :: Show a => a -> Int
ping x = traceShow ("ping", x) 42

bar :: () -> Int
bar () = noinline ping ()

main = do
 print $ bar ()
 print $ bar ()
источник

K

Kir in Haskell
ghc -O1 выводит "ping" 1 раз, ghc -O0 - 2 раза
источник

AA

A64m AL256m qn<co... in Haskell
Kir
Что я делаю не так?

import Debug.Trace

import GHC.Magic (noinline)

ping :: Show a => a -> Int
ping x = traceShow ("ping", x) 42

bar :: () -> Int
bar () = noinline ping ()

main = do
 print $ bar ()
 print $ bar ()
предыдущий пример работает из-за того что ноинлайн для enumFromTo
источник

K

Kir in Haskell
A64m AL256m qn I0
предыдущий пример работает из-за того что ноинлайн для enumFromTo
А мой почему не работает-то?
источник

K

Kir in Haskell
Я тоже хочу так уметь
источник

AA

A64m AL256m qn<co... in Haskell
а если написать ф-ю которая применит пинг к () и ноинлайн для этой функции написать
источник

K

Kir in Haskell
A64m AL256m qn I0
а если написать ф-ю которая применит пинг к () и ноинлайн для этой функции написать
Не помогает. noinline f x  действует только в этом виде?
источник

AA

A64m AL256m qn<co... in Haskell
нет
источник

K

Kir in Haskell
A64m AL256m qn I0
а если написать ф-ю которая применит пинг к () и ноинлайн для этой функции написать
Всё ещё не-а (
foo :: () -> Int
foo = ping

bar = noinline foo
источник

AA

A64m AL256m qn<co... in Haskell
так чтоб вынести фуу не надо знать че внутри
источник

IO

I O in Haskell
Во-первых, на main обязательно нужен -fno-cse, или разные аргументы для bar, иначе ghc сделает

let x = bar (); y = print x in y >> y

Во-вторых, нужно что-то типа такого:

ping :: forall a. Show a => a -> Int
ping x = traceShow ("ping", x) 42

{-# NOINLINE bar #-}
bar :: a -> Int
bar a = noinline ping (a `seq` ())

Само по себе noinline здесь не помогает, суть в том, что из-за него ghc не знает, будет ли вычислен аргумент ping, поэтому не может вынести seq a вперед и убрать зависимось ping от аргумента, поэтому и не выносит
источник