uvector-0.1: examples/simple/SegSum.hs
module SegSum
where
import Data.Array.Parallel.Unlifted
test :: SUArr Int -> UArr Int
test = sndS
. loopArr
. loopSU (\a x -> ((a + x::Int) :*: (Nothing::Maybe ())))
(\a i -> (a :*: Just a)) 0
{- Inner loop:
$wtrans_s19S :: GHC.Prim.Int#
-> GHC.Prim.Int#
-> GHC.Prim.Int#
-> GHC.Prim.Int#
-> GHC.Prim.Int#
-> GHC.Prim.State# s_aLn
-> (# GHC.Prim.State# s_aLn, (GHC.Base.Int, GHC.Base.Int) #)
[Arity 6
Str: DmdType LLLLLL]
$wtrans_s19S =
\ (ww_s18Y :: GHC.Prim.Int#)
(ww1_s192 :: GHC.Prim.Int#)
(ww2_s196 :: GHC.Prim.Int#)
(ww3_s19a :: GHC.Prim.Int#)
(ww4_s19e :: GHC.Prim.Int#)
(w_s19g :: GHC.Prim.State# s_aLn) ->
case ww1_s192 of wild2_X1p {
__DEFAULT ->
$wtrans_s19S
(GHC.Prim.+# ww_s18Y 1)
(GHC.Prim.-# wild2_X1p 1)
ww2_s196
ww3_s19a
(GHC.Prim.+#
ww4_s19e (GHC.Prim.indexIntArray# rb21_aO7 (GHC.Prim.+# rb11_aO4 ww_s18Y)))
w_s19g;
0 ->
let {
$w$j_s19W :: GHC.Prim.State# s_aLn
-> GHC.Prim.Int#
-> GHC.Prim.Int#
-> (# GHC.Prim.State# s_aLn, (GHC.Base.Int, GHC.Base.Int) #)
[Arity 3
Str: DmdType LLL]
$w$j_s19W =
\ (w1_s18H :: GHC.Prim.State# s_aLn)
(ww5_s18M :: GHC.Prim.Int#)
(ww6_s18Q :: GHC.Prim.Int#) ->
let {
a_s104 [Just L] :: GHC.Prim.Int#
[Str: DmdType]
a_s104 = GHC.Prim.+# ww2_s196 1
} in
case GHC.Prim.==# a_s104 rb1_aJe of wild3_aLq {
GHC.Base.False ->
case a_s104 of wild31_X2J {
__DEFAULT ->
case GHC.Prim.readIntArray#
@ s_aLn marr#1_XPR (GHC.Prim.-# wild31_X2J 1) w1_s18H
of wild21_aXE { (# s2#3_aXG, r#_aXH #) ->
case GHC.Prim.readIntArray#
@ s_aLn marr#_aOP (GHC.Prim.-# wild31_X2J 1) s2#3_aXG
of wild22_XZY { (# s2#4_X101, r#1_X103 #) ->
case GHC.Prim.writeIntArray#
@ s_aLn marr#1_XPR wild31_X2J (GHC.Prim.+# r#_aXH r#1_X103) s2#4_X101
of s2#5_aVX { __DEFAULT ->
case GHC.Prim.writeIntArray# @ s_aLn marr#_aOP wild31_X2J 0 s2#5_aVX
of s2#6_XYb { __DEFAULT ->
$wtrans_s19S
ww_s18Y
(GHC.Prim.indexIntArray# rb2_aJf (GHC.Prim.+# rb_aIC wild31_X2J))
wild31_X2J
ww5_s18M
ww6_s18Q
s2#6_XYb
}
}
}
};
0 ->
case GHC.Prim.writeIntArray# @ s_aLn marr#1_XPR 0 0 w1_s18H
of s2#3_aVX { __DEFAULT ->
case GHC.Prim.writeIntArray# @ s_aLn marr#_aOP 0 0 s2#3_aVX
of s2#4_XYb { __DEFAULT ->
$wtrans_s19S
ww_s18Y
(GHC.Prim.indexIntArray# rb2_aJf rb_aIC)
0
ww5_s18M
ww6_s18Q
s2#4_XYb
}
}
};
GHC.Base.True -> (# w1_s18H, ((GHC.Base.I# ww5_s18M), (GHC.Base.I# ww6_s18Q)) #)
}
} in
case ww2_s196 of wild3_X1P {
__DEFAULT ->
case GHC.Prim.writeIntArray# @ s_aLn marr#2_XQ3 ww3_s19a ww4_s19e w_s19g
of s2#3_aVX { __DEFAULT ->
$w$j_s19W s2#3_aVX (GHC.Prim.+# ww3_s19a 1) ww4_s19e
};
(-1) -> $w$j_s19W w_s19g ww3_s19a ww4_s19e
}
};
The matching C routine:
void test (int arr[], int segd[], int n, int m, int out[], int *len)
{
int acc = 0;
int arr_i, segd_i, seg_cnt;
arr_i = 0;
for (segd_i = 0; segd_i < m; segd_i++) {
acc = 0;
for (seg_cnt = segd[segd_i]; seg_cnt == 0; seg_cnt--)
acc += arr[arr_i++];
out[segd_i] = acc;
}
*len = m;
}
-}