Parallel_arrays.Vecof_vec and to_vec are the identity operation under the hood. This is memory safe because no other domain can get a Vec.t @ uncontended, so it cannot be resized in the middle of a parallel operation. It would be unsafe for Vec to implement concurrent incremental resizing in general, without updating existing code that manipulates it at uncontended. It would be similarly unsafe for any user of Vec to even Obj.magic_uncontended it and then resize it. Thus we are not introducing any additional memory unsafety in this library.
To read a value from a parallel array, we must prove that it does not escape its capsule. This is the case if its type crosses contention, or if it is manipulated within a portable function.
get t i reads the element at index i. Raises Invalid_arg if i is not in the range [0..length t).
val extract :
'a t ->
Base.int ->
('a -> 'b @ portable contended) @ local once portable ->
'b @ portable contendedextract t i f applies f with the element read from index i. Raises Invalid_arg if i is not in the range [0..length t).
val unsafe_extract :
'a t ->
Base.int ->
('a -> 'b @ portable contended) @ local once portable ->
'b @ portable contendedunsafe_extract t i f applies f with the element unsafely read from index i.
To store a value in a parallel array, we must prove that it does not share unsynchronized state with any other elements. This is the case if its type crosses contention or it lives in a fresh capsule.
set t i a stores the element a at index i. Raises Invalid_arg if i is not in the range [0..length t).
unsafe_set t i a unsafely stores the element a at index i.
insert t i f stores f () at index i. Raises Invalid_arg if i is not in the range [0..length t).
val unsafe_insert :
'a t ->
Base.int ->
(Base.unit -> 'a) @ local once portable ->
Base.unit @@ portableunsafe_insert t i f unsafely stores f () at index i.
type 'a init = Base.intval init :
Parallel_kernel.t @ local ->
('a init ->
(f:(Parallel_kernel.t @ local -> (Base.int -> 'a) @ local) @ shareable ->
'a t) @ local) @ local @@ portableinit parallel n ~f initializes an array with the result of f applied to the integers 0..n-1.
Mapping functions do not need to be templated over the mode of their output type. To work with a contended or shared 'b, return a 'b Modes.Contended.t or 'b Modes.Shared.t.
val map :
Parallel_kernel.t @ local ->
('a t ->
(f:(Parallel_kernel.t @ local -> ('a -> 'b) @ local) @ shareable ->
'b t) @ local) @ localmap parallel t ~f initializes an array with the result of f applied to each element of t.
val mapi :
Parallel_kernel.t @ local ->
('a t ->
(f:
(Parallel_kernel.t @ local -> (Base.int -> ('a -> 'b) @ local) @ local) @ shareable ->
'b t) @ local) @ localmapi parallel t ~f initializes an array with the result of f applied to each element of t and its index.
val map2_exn :
Parallel_kernel.t @ local ->
('a t ->
('b t ->
(f:
(Parallel_kernel.t @ local -> ('a -> ('b -> 'c) @ local) @ local) @ shareable ->
'c t) @ local) @ local) @ localmap2_exn parallel t0 t1 ~f initializes an array with the result of f applied to each pair of elements of t0, t1. Raises if t0 and t1 do not have equal lengths.
val mapi2_exn :
Parallel_kernel.t @ local ->
('a t ->
('b t ->
(f:
(Parallel_kernel.t @ local ->
(Base.int ->
('a ->
('b ->
'c) @ local) @ local) @ local) @ shareable ->
'c t) @ local) @ local) @ localmapi2_exn parallel t0 t1 ~f initializes an array with the result of f applied to each pair of element of t0, t1 and their index. Raises if t0 and t1 do not have equal lengths.
val iter :
Parallel_kernel.t @ local ->
('a t ->
(f:(Parallel_kernel.t @ local -> ('a -> Base.unit) @ local) @ shareable ->
Base.unit) @ local) @ localiter parallel t ~f applies f to each element of t.
val iteri :
Parallel_kernel.t @ local ->
('a t ->
(f:
(Parallel_kernel.t @ local ->
(Base.int ->
('a ->
Base.unit) @ local) @ local) @ shareable ->
Base.unit) @ local) @ localiteri parallel t ~f applies f to each element of t and its index.
val find :
Parallel_kernel.t @ local ->
('a t ->
(f:(Parallel_kernel.t @ local -> ('a -> Base.bool) @ local) @ shareable ->
'a Base.option) @ local) @ localfind parallel t ~f returns the first element of t for which f returns true, if it exists. f will always be applied to every element of t.
val findi :
Parallel_kernel.t @ local ->
('a t ->
(f:
(Parallel_kernel.t @ local ->
(Base.int ->
('a ->
Base.bool) @ local) @ local) @ shareable ->
'a Base.option) @ local) @ localfindi parallel t ~f returns the first element of t for which f returns true, if it exists. f will always be applied to every element of t and its index.
val reduce :
Parallel_kernel.t @ local ->
('a t ->
(f:
(Parallel_kernel.t @ local ->
('a @ shared ->
('a @ shared ->
'a) @ local) @ local) @ shareable ->
'a Base.option) @ local) @ localreduce parallel t ~f folds f over the elements of t. f must be associative. If t is empty, reduce returns None.
val min_elt :
Parallel_kernel.t @ local ->
('a t ->
(compare:
(Parallel_kernel.t @ local ->
('a @ local shared ->
('a @ local shared ->
Base.int) @ local) @ local) @ shareable ->
'a Base.option) @ local) @ localmin_elt parallel t ~compare is the minimum element of t according to compare. If t is empty, returns None.
val max_elt :
Parallel_kernel.t @ local ->
('a t ->
(compare:
(Parallel_kernel.t @ local ->
('a @ local shared ->
('a @ local shared ->
Base.int) @ local) @ local) @ shareable ->
'a Base.option) @ local) @ localmax_elt parallel t ~compare is the maximum element of t according to compare. If t is empty, returns None.
val fold :
Parallel_kernel.t @ local ->
('a t @ shared ->
(init:(Base.unit -> 'acc) @ portable ->
(f:
(Parallel_kernel.t @ local ->
('acc ->
('a @ shared ->
'acc) @ local) @ local) @ shareable ->
(combine:
(Parallel_kernel.t @ local -> ('acc -> ('acc -> 'acc) @ local) @ local) @ shareable ->
'acc) @ local) @ local) @ local) @ local @@ portablefold parallel t ~init ~f ~combine folds combine over the result of map parallel t ~f. combine must be associative and combine init x must equal x.
val foldi :
Parallel_kernel.t @ local ->
('a t @ shared ->
(init:(Base.unit -> 'acc) @ portable ->
(f:
(Parallel_kernel.t @ local ->
(Base.int ->
('acc ->
('a @ shared ->
'acc) @ local) @ local) @ local) @ shareable ->
(combine:
(Parallel_kernel.t @ local -> ('acc -> ('acc -> 'acc) @ local) @ local) @ shareable ->
'acc) @ local) @ local) @ local) @ local @@ portablefoldi parallel t ~init ~f ~combine folds combine over the result of mapi parallel t ~f. combine must be associative and combine init x must equal x.
val sort :
Parallel_kernel.t @ local ->
('a t ->
(compare:
(Parallel_kernel.t @ local ->
('a @ local shared ->
('a @ local shared ->
Base.int) @ local) @ local) @ shareable ->
'a t) @ local) @ localsort parallel t ~compare initializes an array with the contents of t unstably sorted with respect to compare.
val stable_sort :
Parallel_kernel.t @ local ->
('a t ->
(compare:
(Parallel_kernel.t @ local ->
('a @ local shared ->
('a @ local shared ->
Base.int) @ local) @ local) @ shareable ->
'a t) @ local) @ localstable_sort parallel t ~compare initializes an array with the contents of t stably sorted with respect to compare.
val scan :
Parallel_kernel.t @ local ->
('a t ->
(init:'a ->
(f:
(Parallel_kernel.t @ local ->
('a @ shared ->
('a @ shared ->
'a) @ local) @ local) @ shareable ->
'a t * 'a) @ local) @ local) @ localscan parallel t ~init ~f initialises an array containing the exclusive prefix sums of t with respect to f. The first element is init and the full reduction of t is returned separately. f must be associative and f init x must equal x.
val scan_inclusive :
Parallel_kernel.t @ local ->
('a t ->
(init:'a ->
(f:
(Parallel_kernel.t @ local ->
('a @ shared ->
('a @ shared ->
'a) @ local) @ local) @ shareable ->
'a t) @ local) @ local) @ localscan_inclusive parallel t ~init ~f initialises an array containing the inclusive prefix sums of t with respect to f. The first element is the first element of t. f must be associative and f init x must equal x.
val filter :
Parallel_kernel.t @ local ->
('a t ->
(f:(Parallel_kernel.t @ local -> ('a -> Base.bool) @ local) @ shareable ->
'a t) @ local) @ localfilter parallel t ~f initialises an array containing the elements of t that satisfy the predicate f.
val filteri :
Parallel_kernel.t @ local ->
('a t ->
(f:
(Parallel_kernel.t @ local ->
(Base.int ->
('a ->
Base.bool) @ local) @ local) @ shareable ->
'a t) @ local) @ localfilteri parallel t ~f initialises an array containing the elements of t that, alongside their index, satisfy the predicate f.
val map_inplace :
Parallel_kernel.t @ local ->
('a t ->
(f:(Parallel_kernel.t @ local -> ('a -> 'a) @ local) @ shareable ->
Base.unit) @ local) @ local @@ portablemap_inplace parallel t ~f overwrites an array with the result of f applied to each of its elements.
val mapi_inplace :
Parallel_kernel.t @ local ->
('a t ->
(f:
(Parallel_kernel.t @ local -> (Base.int -> ('a -> 'a) @ local) @ local) @ shareable ->
Base.unit) @ local) @ local @@ portablemapi_inplace parallel t ~f overwrites an array with the result of f applied to each of its elements and their indices.
val init_inplace :
Parallel_kernel.t @ local ->
('a t ->
(f:(Parallel_kernel.t @ local -> (Base.int -> 'a) @ local) @ shareable ->
Base.unit) @ local) @ local @@ portableinit_inplace parallel t ~f overwrites an array with the result of f applied to each array index. This can be much faster than using mapi_inplace since it does not need to read the array.
val sort_inplace :
Parallel_kernel.t @ local ->
('a t ->
(compare:
(Parallel_kernel.t @ local ->
('a @ local shared ->
('a @ local shared ->
Base.int) @ local) @ local) @ shareable ->
Base.unit) @ local) @ local @@ portablesort_inplace parallel t ~compare unstably sorts t with respect to compare.
val stable_sort_inplace :
Parallel_kernel.t @ local ->
('a t ->
(compare:
(Parallel_kernel.t @ local ->
('a @ local shared ->
('a @ local shared ->
Base.int) @ local) @ local) @ shareable ->
Base.unit) @ local) @ local @@ portablestable_sort_inplace parallel t ~compare stably sorts t with respect to compare.
val scan_inplace :
Parallel_kernel.t @ local ->
('a t ->
(init:'a ->
(f:
(Parallel_kernel.t @ local ->
('a @ shared ->
('a @ shared ->
'a) @ local) @ local) @ shareable ->
'a) @ local) @ local) @ local @@ portablescan_inplace parallel t ~init ~f overwrites t to contain the its exclusive prefix sums with respect to f. The first element becomes init and the full reduction of t is returned. f must be associative and f init x must equal x.
val scan_inclusive_inplace :
Parallel_kernel.t @ local ->
('a t ->
(init:'a ->
(f:
(Parallel_kernel.t @ local ->
('a @ shared ->
('a @ shared ->
'a) @ local) @ local) @ shareable ->
Base.unit) @ local) @ local) @ local @@ portablescan_inclusive_inplace parallel t ~init ~f overwrites t to contain its inclusive prefix sums with respect to f. The first element is unchanged. f must be associative and f init x must equal x.