hw-simd 0.0.0.2 → 0.0.0.3
raw patch · 2 files changed
+85/−74 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- hw-simd.cabal +44/−49
- src/HaskellWorks/Data/Simd/Comparison/Stock.hs +41/−25
hw-simd.cabal view
@@ -1,11 +1,9 @@--- This file has been generated from package.yaml by hpack version 0.20.0.+-- This file has been generated from package.yaml by hpack version 0.18.1. -- -- see: https://github.com/sol/hpack------ hash: d4e6b647bff1de25a793f93a5adb597bbbc16d00285948adf0c1aa4f8e3c542f name: hw-simd-version: 0.0.0.2+version: 0.0.0.3 synopsis: SIMD library description: Please see the README on Github at <https://github.com/haskell-works/hw-simd#readme> category: Text, Web, CSV@@ -53,15 +51,15 @@ c-sources: cbits/simd.c build-depends:- base >=4.7 && <5- , bits-extra >=0.0.1.2 && <0.1- , bytestring >=0.10 && <0.11- , deepseq >=1.4 && <1.5- , hw-bits >=0.7.0.2 && <0.8- , hw-prim >=0.6.2.0 && <0.7- , hw-rankselect >=0.12.0.2 && <0.13- , hw-rankselect-base >=0.3.2.0 && <0.4- , vector >=0.12.0.1 && <0.13+ base >= 4.7 && < 5+ , bits-extra >= 0.0.1.2 && < 0.1+ , bytestring >= 0.10 && < 0.11+ , deepseq >= 1.4 && < 1.5+ , hw-bits >= 0.7.0.2 && < 0.8+ , hw-rankselect >= 0.12.0.2 && < 0.13+ , hw-rankselect-base >= 0.3.2.0 && < 0.4+ , hw-prim >= 0.6.2.0 && < 0.7+ , vector >= 0.12.0.1 && < 0.13 build-tools: c2hs if flag(sse42)@@ -80,8 +78,8 @@ ghc-options: -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints if (!impl(ghc >=8.0.1)) build-depends:- semigroups >=0.8.4 && <0.19- , transformers >=0.4 && <0.6+ transformers >= 0.4 && < 0.6+ , semigroups >= 0.8.4 && < 0.19 exposed-modules: HaskellWorks.Data.Simd.Capabilities HaskellWorks.Data.Simd.Comparison@@ -103,21 +101,21 @@ test ghc-options: -O2 -Wall -threaded -rtsopts -with-rtsopts=-N build-depends:- base >=4.7 && <5- , bits-extra >=0.0.1.2 && <0.1- , bytestring >=0.10 && <0.11- , deepseq >=1.4 && <1.5- , directory >=1.2.2 && <1.4- , hedgehog >=0.5 && <0.7- , hspec >=2.4 && <3- , hw-bits >=0.7.0.2 && <0.8- , hw-hspec-hedgehog >=0.1.0.4 && <0.2- , hw-prim >=0.6.2.0 && <0.7- , hw-rankselect >=0.12.0.2 && <0.13- , hw-rankselect-base >=0.3.2.0 && <0.4+ base >= 4.7 && < 5+ , bits-extra >= 0.0.1.2 && < 0.1+ , bytestring >= 0.10 && < 0.11+ , deepseq >= 1.4 && < 1.5+ , hw-bits >= 0.7.0.2 && < 0.8+ , hw-rankselect >= 0.12.0.2 && < 0.13+ , hw-rankselect-base >= 0.3.2.0 && < 0.4+ , hw-prim >= 0.6.2.0 && < 0.7+ , vector >= 0.12.0.1 && < 0.13+ , directory >= 1.2.2 && < 1.4 , hw-simd- , text >=1.2.2 && <2.0- , vector >=0.12.0.1 && <0.13+ , hedgehog >= 0.5 && < 0.7+ , hspec >= 2.4 && < 3+ , hw-hspec-hedgehog >= 0.1.0.4 && < 0.2+ , text >= 1.2.2 && < 2.0 if flag(sse42) ghc-options: -msse4.2 cc-options: -msse4.2@@ -134,11 +132,10 @@ ghc-options: -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints if (!impl(ghc >=8.0.1)) build-depends:- semigroups >=0.8.4 && <0.19- , transformers >=0.4 && <0.6+ transformers >= 0.4 && < 0.6+ , semigroups >= 0.8.4 && < 0.19 other-modules: HaskellWorks.Data.Simd.BroadwordSpec- Paths_hw_simd default-language: Haskell2010 benchmark bench@@ -148,21 +145,21 @@ bench ghc-options: -O2 -Wall -msse4.2 build-depends:- base >=4.7 && <5- , bits-extra >=0.0.1.2 && <0.1- , bytestring >=0.10 && <0.11- , cassava >=0.5.1.0 && <0.6+ base >= 4.7 && < 5+ , bits-extra >= 0.0.1.2 && < 0.1+ , bytestring >= 0.10 && < 0.11+ , deepseq >= 1.4 && < 1.5+ , hw-bits >= 0.7.0.2 && < 0.8+ , hw-rankselect >= 0.12.0.2 && < 0.13+ , hw-rankselect-base >= 0.3.2.0 && < 0.4+ , hw-prim >= 0.6.2.0 && < 0.7+ , vector >= 0.12.0.1 && < 0.13+ , cassava >= 0.5.1.0 && < 0.6 , containers- , criterion >=1.4.1.0 && <1.5- , deepseq >=1.4 && <1.5- , directory >=1.3.1.5 && <1.4- , hw-bits >=0.7.0.2 && <0.8- , hw-prim >=0.6.2.0 && <0.7- , hw-rankselect >=0.12.0.2 && <0.13- , hw-rankselect-base >=0.3.2.0 && <0.4+ , criterion >= 1.4.1.0 && < 1.5+ , directory >= 1.3.1.5 && < 1.4 , hw-simd- , mmap >=0.5.9 && <0.6- , vector >=0.12.0.1 && <0.13+ , mmap >= 0.5.9 && < 0.6 if flag(sse42) ghc-options: -msse4.2 cc-options: -msse4.2@@ -179,8 +176,6 @@ ghc-options: -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints if (!impl(ghc >=8.0.1)) build-depends:- semigroups >=0.8.4 && <0.19- , transformers >=0.4 && <0.6- other-modules:- Paths_hw_simd+ transformers >= 0.4 && < 0.6+ , semigroups >= 0.8.4 && < 0.19 default-language: Haskell2010
src/HaskellWorks/Data/Simd/Comparison/Stock.hs view
@@ -2,38 +2,54 @@ ( cmpeq8s ) where -import Data.Monoid ((<>)) import Data.Word import HaskellWorks.Data.AtIndex import HaskellWorks.Data.Bits.BitWise import HaskellWorks.Data.Simd.Internal.Bits+import HaskellWorks.Data.Simd.Internal.Broadword import qualified Data.Vector.Storable as DVS cmpeq8s :: Word8 -> DVS.Vector Word64 -> DVS.Vector Word64-cmpeq8s w8 v = if disalignment == 0- then DVS.constructN (DVS.length v) go- else error $ "Unaligned byte string: " <> show disalignment <> ", vLen: " <> show vLen- where vLen = DVS.length v- disalignment = vLen - (vLen `div` 8) * 8- w64 = fromIntegral w8 * 0x0101010101010101 :: Word64+cmpeq8s w8 v = DVS.constructN ((DVS.length v + 7) `div` 8) go+ where iw = fillWord64 w8 go :: DVS.Vector Word64 -> Word64- go u = comp w- where ui = fromIntegral $ DVS.length u- w0 = testWord8s ((u !!! (ui + 0)) .^. w64)- w1 = testWord8s ((u !!! (ui + 1)) .^. w64)- w2 = testWord8s ((u !!! (ui + 2)) .^. w64)- w3 = testWord8s ((u !!! (ui + 3)) .^. w64)- w4 = testWord8s ((u !!! (ui + 4)) .^. w64)- w5 = testWord8s ((u !!! (ui + 5)) .^. w64)- w6 = testWord8s ((u !!! (ui + 6)) .^. w64)- w7 = testWord8s ((u !!! (ui + 7)) .^. w64)- w = (w7 .<. 56) .|.- (w6 .<. 48) .|.- (w5 .<. 40) .|.- (w4 .<. 32) .|.- (w3 .<. 24) .|.- (w2 .<. 16) .|.- (w1 .<. 8) .|.- w0+ go u = let ui = end u in+ if ui * 8 + 8 < end v+ then let vi = ui * 8+ w0 = testWord8s ((v !!! (vi + 0)) .^. iw)+ w1 = testWord8s ((v !!! (vi + 1)) .^. iw)+ w2 = testWord8s ((v !!! (vi + 2)) .^. iw)+ w3 = testWord8s ((v !!! (vi + 3)) .^. iw)+ w4 = testWord8s ((v !!! (vi + 4)) .^. iw)+ w5 = testWord8s ((v !!! (vi + 5)) .^. iw)+ w6 = testWord8s ((v !!! (vi + 6)) .^. iw)+ w7 = testWord8s ((v !!! (vi + 7)) .^. iw)+ w = (w7 .<. 56) .|.+ (w6 .<. 48) .|.+ (w5 .<. 40) .|.+ (w4 .<. 32) .|.+ (w3 .<. 24) .|.+ (w2 .<. 16) .|.+ (w1 .<. 8) .|.+ w0+ in comp w+ else let vi = ui * 8+ w0 = testWord8s (atIndexOr 0 v (vi + 0) .^. iw)+ w1 = testWord8s (atIndexOr 0 v (vi + 1) .^. iw)+ w2 = testWord8s (atIndexOr 0 v (vi + 2) .^. iw)+ w3 = testWord8s (atIndexOr 0 v (vi + 3) .^. iw)+ w4 = testWord8s (atIndexOr 0 v (vi + 4) .^. iw)+ w5 = testWord8s (atIndexOr 0 v (vi + 5) .^. iw)+ w6 = testWord8s (atIndexOr 0 v (vi + 6) .^. iw)+ w7 = testWord8s (atIndexOr 0 v (vi + 7) .^. iw)+ w = (w7 .<. 56) .|.+ (w6 .<. 48) .|.+ (w5 .<. 40) .|.+ (w4 .<. 32) .|.+ (w3 .<. 24) .|.+ (w2 .<. 16) .|.+ (w1 .<. 8) .|.+ w0+ in comp w {-# INLINE cmpeq8s #-}