A few small changes to try to make generation faster.

This commit is contained in:
2020-03-02 15:20:33 -08:00
parent 9c76d7e0b4
commit f93aa7ffc3
4 changed files with 25 additions and 18 deletions

View File

@@ -9,7 +9,7 @@ import Control.Exception(assert)
import Data.Map.Strict(Map) import Data.Map.Strict(Map)
import qualified Data.Map.Strict as Map import qualified Data.Map.Strict as Map
import Generators import Generators
import GHC.Integer.GMP.Internals(recipModInteger) import GHC.Integer.GMP.Internals(powModInteger, recipModInteger)
import Language.Rust.Data.Ident import Language.Rust.Data.Ident
import Language.Rust.Data.Position import Language.Rust.Data.Position
import Language.Rust.Quote import Language.Rust.Quote
@@ -232,9 +232,10 @@ generateModInvTest size g = go g
in if z == 0 in if z == 0
then go g2 then go g2
else assert (z < y) $ else assert (z < y) $
assert ((x * z) `mod` y == 1) $ assert (powModInteger x z y == 1) $
assert (((a * x) + (b * y)) == v) $ -- assert ((x * z) `mod` y == 1) $
assert (v == gcd x y) $ -- assert (((a * x) + (b * y)) == v) $
-- assert (v == gcd x y) $
(tcase, g2) (tcase, g2)
extendedGCD :: Integer -> Integer -> (Integer, Integer, Integer) extendedGCD :: Integer -> Integer -> (Integer, Integer, Integer)

View File

@@ -118,7 +118,7 @@ generateModulusTest size g = go g
("m", showX m), ("m", showX m),
("r", showX (x `mod` m)), ("r", showX (x `mod` m)),
("t", showX ((x * y) `mod` m)), ("t", showX ((x * y) `mod` m)),
("s", showX ((x * x) `mod` m)), ("s", showX (powModInteger x 2 m)),
("e", showX (powModInteger x y m)) ("e", showX (powModInteger x y m))
] ]
in if y < 2 in if y < 2

View File

@@ -1,14 +1,16 @@
{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE QuasiQuotes #-}
module Multiply( module Multiply
safeMultiplyOps -- (
, unsafeMultiplyOps -- safeMultiplyOps
) -- , unsafeMultiplyOps
-- )
where where
import Data.Bits((.&.)) import Data.Bits((.&.))
import Data.List(union) import Data.List(foldl')
import Data.Map.Strict(Map) import Data.Map.Strict(Map)
import qualified Data.Map.Strict as Map import qualified Data.Map.Strict as Map
import qualified Data.Set as Set
import Gen(toLit) import Gen(toLit)
import Generators import Generators
import Karatsuba import Karatsuba
@@ -25,7 +27,7 @@ safeMultiplyOps = RustModule {
outputName = "safe_mul", outputName = "safe_mul",
isUnsigned = True, isUnsigned = True,
generator = declareSafeMulOperators, generator = declareSafeMulOperators,
testCase = Just generateSafeTest testCase = Nothing -- Just generateSafeTest
} }
unsafeMultiplyOps :: RustModule unsafeMultiplyOps :: RustModule
@@ -34,7 +36,7 @@ unsafeMultiplyOps = RustModule {
outputName = "unsafe_mul", outputName = "unsafe_mul",
isUnsigned = True, isUnsigned = True,
generator = declareUnsafeMulOperators, generator = declareUnsafeMulOperators,
testCase = Just generateUnsafeTest testCase = Nothing -- Just generateUnsafeTest
} }
declareSafeMulOperators :: Word -> [Word] -> SourceFile Span declareSafeMulOperators :: Word -> [Word] -> SourceFile Span
@@ -202,7 +204,6 @@ generateMultiplier fullmul size inName outName =
var = mkIdent (vname ++ show i) var = mkIdent (vname ++ show i)
in [stmt| $$vec.value[$$(liti)] = $$var; |] in [stmt| $$vec.value[$$(liti)] = $$var; |]
translateInstruction :: Instruction -> Stmt Span translateInstruction :: Instruction -> Stmt Span
translateInstruction instr = translateInstruction instr =
case instr of case instr of
@@ -252,11 +253,16 @@ translateInstruction instr =
in [stmt| let $$outid: u128 = $$inid >> $$(val); |] in [stmt| let $$outid: u128 = $$inid >> $$(val); |]
releaseUnnecessary :: [String] -> [Instruction] -> [Instruction] releaseUnnecessary :: [String] -> [Instruction] -> [Instruction]
releaseUnnecessary outkeys instrs = snd (foldl check (outkeys, []) (reverse instrs)) releaseUnnecessary outkeys instrs = go (Set.fromList outkeys) [] rInstrs
where where
check acc@(required, rest) cur rInstrs = reverse instrs
| outVar cur `elem` required = (union (inVars cur) required, cur : rest) --
| otherwise = acc go _ acc [] = acc
go required acc (cur:rest)
| outVar cur `Set.member` required =
go (foldl' (flip Set.insert) required (inVars cur)) (cur:acc) rest
| otherwise =
go required acc rest
outVar :: Instruction -> String outVar :: Instruction -> String
outVar instr = outVar instr =

View File

@@ -30,7 +30,7 @@ maximumTestCases :: Int
maximumTestCases = 5000 maximumTestCases = 5000
targetTestGenerationTime :: Float targetTestGenerationTime :: Float
targetTestGenerationTime = 5.0 -- in seconds targetTestGenerationTime = 2.0 -- in seconds
targetTestGenerationPicos :: Integer targetTestGenerationPicos :: Integer
targetTestGenerationPicos = targetTestGenerationPicos =