Skip to content

Commit 196b3c1

Browse files
authored
Merge pull request #17 from haskell-works/expose-flags
Expose flags
2 parents d1be6dd + 20a0c7a commit 196b3c1

File tree

10 files changed

+110
-5
lines changed

10 files changed

+110
-5
lines changed

app/App/Commands.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
module App.Commands where
22

3+
import App.Commands.Capabilities
34
import App.Commands.CreateIndex
4-
import Data.Semigroup ((<>))
5+
import Data.Semigroup ((<>))
56
import Options.Applicative
67

78
commands :: Parser (IO ())
@@ -10,4 +11,5 @@ commands = commandsGeneral
1011
commandsGeneral :: Parser (IO ())
1112
commandsGeneral = subparser $ mempty
1213
<> commandGroup "Commands:"
14+
<> cmdCapabilities
1315
<> cmdCreateIndex

app/App/Commands/Capabilities.hs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{-# LANGUAGE ScopedTypeVariables #-}
2+
3+
module App.Commands.Capabilities
4+
( cmdCapabilities
5+
) where
6+
7+
import Data.Semigroup ((<>))
8+
import Options.Applicative hiding (columns)
9+
10+
import qualified HaskellWorks.Data.Json.Simd.Index.Simple as SIMPLE
11+
import qualified HaskellWorks.Data.Json.Simd.Index.Standard as STANDARD
12+
import qualified System.IO as IO
13+
14+
{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}
15+
{-# ANN module ("HLint: ignore Redundant do" :: String) #-}
16+
17+
runCapabilities :: () -> IO ()
18+
runCapabilities opts = do
19+
IO.putStrLn "Capabalities:"
20+
IO.putStrLn $ " standard indexing: " <> show STANDARD.enabled
21+
IO.putStrLn $ " simple indexing: " <> show SIMPLE.enabled
22+
23+
optsCapabilities :: Parser ()
24+
optsCapabilities = pure ()
25+
26+
cmdCapabilities :: Mod CommandFields (IO ())
27+
cmdCapabilities = command "capabilities" $ flip info idm $ runCapabilities <$> optsCapabilities

cbits/simd-state.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@
88

99
#include "simd.h"
1010

11-
extern uint32_t hw_json_simd_transition_table_32[256];
12-
extern uint32_t hw_json_simd_phi_table_32 [256];
13-
1411
void
1512
hw_json_simd_sm_process_chunk(
1613
uint8_t *in_buffer,

cbits/simd.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#include "simd.h"
2+
3+
int hw_json_simd_avx2_enabled() {
4+
#ifdef __AVX2__
5+
return 1;
6+
#else
7+
return 0;
8+
#endif
9+
}
10+
11+
int hw_json_simd_bmi2_enabled() {
12+
#ifdef __BMI2__
13+
return 1;
14+
#else
15+
return 0;
16+
#endif
17+
}
18+
19+
int hw_json_simd_sse4_2_enabled() {
20+
#ifdef __BMI2__
21+
return 1;
22+
#else
23+
return 0;
24+
#endif
25+
}

cbits/simd.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@
99

1010
typedef struct hw_json_simd_bp_state hw_json_simd_bp_state_t;
1111

12+
int hw_json_simd_avx2_enabled();
13+
14+
int hw_json_simd_bmi2_enabled();
15+
16+
int hw_json_simd_sse4_2_enabled();
17+
18+
extern uint32_t hw_json_simd_transition_table_32[256];
19+
extern uint32_t hw_json_simd_phi_table_32 [256];
20+
1221
int hw_json_simd_main_spliced(
1322
int argc,
1423
char **argv);

hw-json-simd.cabal

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ tested-with: GHC == 8.6.1, GHC == 8.4.3, GHC == 8.2.2
1717
extra-source-files:
1818
cbits/debug.h
1919
cbits/simd.h
20+
cbits/simd.c
2021
cbits/simd-spliced.c
2122
cbits/simd-state.c
2223
cbits/simd-phi-table-32.c
@@ -60,6 +61,7 @@ library
6061
, lens
6162
, vector
6263
exposed-modules:
64+
HaskellWorks.Data.Json.Simd.Capabilities
6365
HaskellWorks.Data.Json.Simd.Index.Simple
6466
HaskellWorks.Data.Json.Simd.Index.Standard
6567
HaskellWorks.Data.Json.Simd.Internal.Foreign
@@ -76,6 +78,7 @@ library
7678
cbits
7779
c-sources:
7880
cbits/debug.c
81+
cbits/simd.c
7982
cbits/simd-spliced.c
8083
cbits/simd-state.c
8184
cbits/simd-phi-table-32.c
@@ -109,6 +112,7 @@ executable hw-json-simd
109112
autogen-modules: Paths_hw_json_simd
110113
other-modules:
111114
App.Commands
115+
App.Commands.Capabilities
112116
App.Commands.CreateIndex
113117
App.Commands.Types
114118
App.Lens
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
module HaskellWorks.Data.Json.Simd.Capabilities where
2+
3+
import qualified HaskellWorks.Data.Json.Simd.Internal.Foreign as F
4+
import qualified System.IO.Unsafe as U
5+
6+
avx_2 :: Bool
7+
avx_2 = U.unsafePerformIO F.enabled_avx_2 /= 0
8+
{-# NOINLINE avx_2 #-}
9+
10+
sse_4_2 :: Bool
11+
sse_4_2 = U.unsafePerformIO F.enabled_sse_4_2 /= 0
12+
{-# NOINLINE sse_4_2 #-}
13+
14+
bmi_2 :: Bool
15+
bmi_2 = U.unsafePerformIO F.enabled_bmi_2 /= 0
16+
{-# NOINLINE bmi_2 #-}

src/HaskellWorks/Data/Json/Simd/Index/Simple.hs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
module HaskellWorks.Data.Json.Simd.Index.Simple
55
( makeIbBps
6+
, enabled
67
) where
78

89
import Control.Monad.ST
@@ -18,6 +19,7 @@ import qualified Foreign.ForeignPtr as F
1819
import qualified Foreign.ForeignPtr.Unsafe as F
1920
import qualified Foreign.Marshal.Unsafe as F
2021
import qualified Foreign.Ptr as F
22+
import qualified HaskellWorks.Data.Json.Simd.Capabilities as C
2123
import qualified HaskellWorks.Data.Json.Simd.Internal.Foreign as F
2224
import qualified HaskellWorks.Data.Json.Simd.Internal.List as L
2325
import qualified System.IO.Unsafe as IO
@@ -135,3 +137,6 @@ stepToByteString state (Step step size) = F.unsafeLocalState $ do
135137
let bpVm = DVSM.unsafeFromForeignPtr (F.castForeignPtr bpFptr) 0 size
136138
w64Size <- stToIO $ step state bpVm
137139
return (BSI.PS bpFptr 0 (w64Size * 8))
140+
141+
enabled :: Bool
142+
enabled = C.avx_2 && C.sse_4_2 && C.bmi_2

src/HaskellWorks/Data/Json/Simd/Index/Standard.hs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
module HaskellWorks.Data.Json.Simd.Index.Standard
77
( makeIbBps
8+
, enabled
89
) where
910

1011
import Control.Monad
@@ -19,6 +20,7 @@ import qualified Foreign.ForeignPtr.Unsafe as F
1920
import qualified Foreign.Marshal.Unsafe as F
2021
import qualified Foreign.Ptr as F
2122
import qualified Foreign.Storable as F
23+
import qualified HaskellWorks.Data.Json.Simd.Capabilities as C
2224
import qualified HaskellWorks.Data.Json.Simd.Internal.Foreign as F
2325
import qualified System.IO.Unsafe as IO
2426

@@ -99,3 +101,6 @@ makeIbBps lbs = F.unsafeLocalState $ do
99101
)
100102
rs <- IO.unsafeInterleaveIO $ go wb ws fptrState fptrRemBits fptrRemBitsLen bss
101103
return (r:rs)
104+
105+
enabled :: Bool
106+
enabled = C.avx_2 && C.sse_4_2 && C.bmi_2

src/HaskellWorks/Data/Json/Simd/Internal/Foreign.chs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
module HaskellWorks.Data.Json.Simd.Internal.Foreign where
55

66
import Foreign
7-
import Foreign.C.Types (CChar(..), CSize(..))
7+
import System.IO.Unsafe
88

99
#include "../cbits/simd.h"
1010

@@ -13,6 +13,21 @@ type UInt32 = {#type uint32_t#}
1313
type UInt64 = {#type uint64_t#}
1414
type Size = {#type size_t #}
1515

16+
enabled_avx_2 :: IO Int
17+
enabled_avx_2 = fromIntegral <$> do
18+
{#call unsafe hw_json_simd_avx2_enabled as c_hw_json_simd_avx2_enabled#}
19+
{-# NOINLINE enabled_avx_2 #-}
20+
21+
enabled_sse_4_2 :: IO Int
22+
enabled_sse_4_2 = fromIntegral <$> do
23+
{#call unsafe hw_json_simd_sse4_2_enabled as c_hw_json_simd_sse4_2_enabled#}
24+
{-# NOINLINE enabled_sse_4_2 #-}
25+
26+
enabled_bmi_2 :: IO Int
27+
enabled_bmi_2 = fromIntegral <$> do
28+
{#call unsafe hw_json_simd_bmi2_enabled as c_hw_json_simd_bmi2_enabled#}
29+
{-# NOINLINE enabled_bmi_2 #-}
30+
1631
processChunk :: ()
1732
=> Ptr UInt8 -- in_buffer
1833
-> Size -- in_length

0 commit comments

Comments
 (0)