hw-simd-cli-0.0.0.1: app/App/Commands/CmpEq8s.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeApplications #-}
module App.Commands.CmpEq8s
( cmdCmpEq8s
) where
import App.Char
import Control.Lens
import Data.Generics.Product.Any
import HaskellWorks.Data.Vector.AsVector64s
import Options.Applicative hiding (columns)
import qualified App.Commands.Options.Type as Z
import qualified App.IO as IO
import qualified HaskellWorks.Data.ByteString.Lazy as LBS
import qualified HaskellWorks.Data.Simd.ChunkString as CS
import qualified HaskellWorks.Data.Simd.Comparison.Avx2 as AVX2
import qualified HaskellWorks.Data.Simd.Comparison.Stock as STOCK
import qualified HaskellWorks.Simd.Cli.Comparison as SERIAL
import qualified System.Exit as IO
import qualified System.IO as IO
{- HLINT ignore "Redundant do" -}
runCmpEq8s :: Z.CmpEq8sOptions -> IO ()
runCmpEq8s opts = do
let !delimiter = opts ^. the @"delimiter"
case opts ^. the @"cmpMethod" of
"new-stock" -> do
cs <- IO.openInputFile (opts ^. the @"inputFile") >>= CS.hGetContents
IO.writeOutputFile (opts ^. the @"outputFile")
$ LBS.toLazyByteString
$ STOCK.cmpEqWord8s delimiter cs
"new-avx2" -> do
cs <- IO.openInputFile (opts ^. the @"inputFile") >>= CS.hGetContents
IO.writeOutputFile (opts ^. the @"outputFile")
$ LBS.toLazyByteString
$ AVX2.cmpEqWord8s delimiter cs
"stock" -> do
bs <- IO.readInputFile (opts ^. the @"inputFile")
let v = asVector64s 64 bs
IO.writeOutputFile (opts ^. the @"outputFile")
$ LBS.toLazyByteString
$ STOCK.cmpEqWord8s delimiter v
"avx2" -> do
bs <- IO.readInputFile (opts ^. the @"inputFile")
let v = asVector64s 64 bs
IO.writeOutputFile (opts ^. the @"outputFile")
$ LBS.toLazyByteString
$ AVX2.cmpEqWord8s delimiter v
"serial" -> do
bs <- IO.readInputFile (opts ^. the @"inputFile")
IO.writeOutputFile (opts ^. the @"outputFile")
$ SERIAL.cmpEqWord8s delimiter bs
m -> do
IO.hPutStrLn IO.stderr $ "Unsupported method: " <> m
IO.exitFailure
optsCmpEq8s :: Parser Z.CmpEq8sOptions
optsCmpEq8s = Z.CmpEq8sOptions
<$> strOption
( long "input"
<> short 'i'
<> help "Input Text file"
<> metavar "STRING"
)
<*> option readWord8
( long "input-delimiter"
<> short 'd'
<> help "Text delimiter"
<> metavar "CHAR"
)
<*> strOption
( long "output"
<> short 'o'
<> help "Output Text file"
<> metavar "STRING"
)
<*> strOption
( long "cmp-method"
<> short 'm'
<> help "Comparison method"
<> metavar "STRING"
)
cmdCmpEq8s :: Mod CommandFields (IO ())
cmdCmpEq8s = command "cmpeqword8s" $ flip info idm $ runCmpEq8s <$> optsCmpEq8s