1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
external sizeofbool : unit -> int = "custom_getsizeofbool"
external boolget : Vector.customarray -> int -> bool = "custom_boolget"
external boolset : Vector.customarray -> int -> bool -> unit = "custom_boolset"
let print s =
Printf.printf "%s\n" (string_of_int s) ;
flush stdout
let iter f vect =
( match Vector.dev vect with
| Vector.No_dev -> ()
| Vector.Dev d | Vector.Transferring d ->
Devices.flush d ~queue_id:0 () ;
Devices.flush d ~queue_id:1 () ;
Mem.to_cpu vect () ;
Devices.flush d ~queue_id:0 () ) ;
for idx = 0 to Vector.length vect - 1 do
f (Mem.unsafe_get vect idx)
done
let iteri f vect =
( match Vector.dev vect with
| Vector.No_dev -> ()
| Vector.Dev d | Vector.Transferring d ->
Devices.flush d ~queue_id:0 () ;
Devices.flush d ~queue_id:1 () ;
Mem.to_cpu vect () ;
Devices.flush d ~queue_id:0 () ) ;
for idx = 0 to Vector.length vect - 1 do
f (Mem.unsafe_get vect idx) idx
done
let map f kind vect =
( match Vector.dev vect with
| Vector.No_dev -> ()
| Vector.Dev d | Vector.Transferring d ->
Devices.flush d ~queue_id:0 () ;
Devices.flush d ~queue_id:1 () ;
Mem.to_cpu vect () ;
Devices.flush d ~queue_id:0 () ) ;
let newvect = Vector.create kind (Vector.length vect) in
for i = 0 to Vector.length vect - 1 do
Mem.unsafe_set newvect i (f (Mem.unsafe_get vect i))
done ;
newvect
let trueCustom =
{Vector.size= sizeofbool () ; Vector.get= boolget ; Vector.set= boolset}
let falseCustom =
{Vector.size= sizeofbool () ; Vector.get= boolget ; Vector.set= boolset}
let fold_left f seed vect =
( match Vector.dev vect with
| Vector.No_dev -> ()
| Vector.Dev d | Vector.Transferring d ->
Devices.flush d ~queue_id:0 () ;
Devices.flush d ~queue_id:1 () ;
Mem.to_cpu vect () ;
Devices.flush d ~queue_id:0 () ) ;
let s = ref seed in
for i = 0 to Vector.length vect - 1 do
s := f !s (Mem.unsafe_get vect i)
done ;
!s
let fold_right f vect seed =
( match Vector.dev vect with
| Vector.No_dev -> ()
| Vector.Dev d | Vector.Transferring d ->
Devices.flush d ~queue_id:0 () ;
Devices.flush d ~queue_id:1 () ;
Mem.to_cpu vect () ;
Devices.flush d ~queue_id:0 () ) ;
let s = ref seed in
for i = Vector.length vect - 1 downto 0 do
s := f (Mem.unsafe_get vect i) !s
done ;
!s
let vfalse = Vector.Custom trueCustom
let vtrue = Vector.Custom falseCustom
let spoc_bool = vfalse