From f93aa7ffc3228cd6311d813245abc7d6efac07c8 Mon Sep 17 00:00:00 2001 From: Adam Wick Date: Mon, 2 Mar 2020 15:20:33 -0800 Subject: [PATCH] A few small changes to try to make generation faster. --- generation/src/ModInv.hs | 9 +++++---- generation/src/ModOps.hs | 2 +- generation/src/Multiply.hs | 30 ++++++++++++++++++------------ generation/src/RustModule.hs | 2 +- 4 files changed, 25 insertions(+), 18 deletions(-) diff --git a/generation/src/ModInv.hs b/generation/src/ModInv.hs index be68bdd..44fe60a 100644 --- a/generation/src/ModInv.hs +++ b/generation/src/ModInv.hs @@ -9,7 +9,7 @@ import Control.Exception(assert) import Data.Map.Strict(Map) import qualified Data.Map.Strict as Map import Generators -import GHC.Integer.GMP.Internals(recipModInteger) +import GHC.Integer.GMP.Internals(powModInteger, recipModInteger) import Language.Rust.Data.Ident import Language.Rust.Data.Position import Language.Rust.Quote @@ -232,9 +232,10 @@ generateModInvTest size g = go g in if z == 0 then go g2 else assert (z < y) $ - assert ((x * z) `mod` y == 1) $ - assert (((a * x) + (b * y)) == v) $ - assert (v == gcd x y) $ + assert (powModInteger x z y == 1) $ +-- assert ((x * z) `mod` y == 1) $ +-- assert (((a * x) + (b * y)) == v) $ +-- assert (v == gcd x y) $ (tcase, g2) extendedGCD :: Integer -> Integer -> (Integer, Integer, Integer) diff --git a/generation/src/ModOps.hs b/generation/src/ModOps.hs index e50a23d..a13aae1 100644 --- a/generation/src/ModOps.hs +++ b/generation/src/ModOps.hs @@ -118,7 +118,7 @@ generateModulusTest size g = go g ("m", showX m), ("r", showX (x `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)) ] in if y < 2 diff --git a/generation/src/Multiply.hs b/generation/src/Multiply.hs index 854d800..ea1104b 100644 --- a/generation/src/Multiply.hs +++ b/generation/src/Multiply.hs @@ -1,14 +1,16 @@ {-# LANGUAGE QuasiQuotes #-} -module Multiply( - safeMultiplyOps - , unsafeMultiplyOps - ) +module Multiply +-- ( +-- safeMultiplyOps +-- , unsafeMultiplyOps +-- ) where import Data.Bits((.&.)) -import Data.List(union) +import Data.List(foldl') import Data.Map.Strict(Map) import qualified Data.Map.Strict as Map +import qualified Data.Set as Set import Gen(toLit) import Generators import Karatsuba @@ -25,7 +27,7 @@ safeMultiplyOps = RustModule { outputName = "safe_mul", isUnsigned = True, generator = declareSafeMulOperators, - testCase = Just generateSafeTest + testCase = Nothing -- Just generateSafeTest } unsafeMultiplyOps :: RustModule @@ -34,7 +36,7 @@ unsafeMultiplyOps = RustModule { outputName = "unsafe_mul", isUnsigned = True, generator = declareUnsafeMulOperators, - testCase = Just generateUnsafeTest + testCase = Nothing -- Just generateUnsafeTest } declareSafeMulOperators :: Word -> [Word] -> SourceFile Span @@ -202,7 +204,6 @@ generateMultiplier fullmul size inName outName = var = mkIdent (vname ++ show i) in [stmt| $$vec.value[$$(liti)] = $$var; |] - translateInstruction :: Instruction -> Stmt Span translateInstruction instr = case instr of @@ -252,11 +253,16 @@ translateInstruction instr = in [stmt| let $$outid: u128 = $$inid >> $$(val); |] releaseUnnecessary :: [String] -> [Instruction] -> [Instruction] -releaseUnnecessary outkeys instrs = snd (foldl check (outkeys, []) (reverse instrs)) +releaseUnnecessary outkeys instrs = go (Set.fromList outkeys) [] rInstrs where - check acc@(required, rest) cur - | outVar cur `elem` required = (union (inVars cur) required, cur : rest) - | otherwise = acc + rInstrs = reverse instrs + -- + 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 instr = diff --git a/generation/src/RustModule.hs b/generation/src/RustModule.hs index 33b2895..47f2ba9 100644 --- a/generation/src/RustModule.hs +++ b/generation/src/RustModule.hs @@ -30,7 +30,7 @@ maximumTestCases :: Int maximumTestCases = 5000 targetTestGenerationTime :: Float -targetTestGenerationTime = 5.0 -- in seconds +targetTestGenerationTime = 2.0 -- in seconds targetTestGenerationPicos :: Integer targetTestGenerationPicos =