Merge pull request #236

PR#6263: Add size_in_bytes and kind_size_in_bytes to Bigarray
master
Damien Doligez 2016-01-27 16:00:44 +01:00
commit 192ccd0902
5 changed files with 113 additions and 0 deletions

View File

@ -285,6 +285,9 @@ Other libraries:
Before, a handled signal could cause Unix.sleep to return early. Before, a handled signal could cause Unix.sleep to return early.
Now, the sleep is restarted until the given time is elapsed. Now, the sleep is restarted until the given time is elapsed.
(Xavier Leroy) (Xavier Leroy)
- PR#6263: add kind_size_in_bytes and size_in_bytes functions
to Bigarray module.
(Runhang Li, review by Mark Shinwell)
- PR#6289: Unix.utimes uses the current time only if both arguments - PR#6289: Unix.utimes uses the current time only if both arguments
are exactly 0.0. Also, use sub-second resolution if available. are exactly 0.0. Also, use sub-second resolution if available.
(Xavier Leroy, report by Christophe Troestler) (Xavier Leroy, report by Christophe Troestler)

View File

@ -62,6 +62,21 @@ let complex32 = Complex32
let complex64 = Complex64 let complex64 = Complex64
let char = Char let char = Char
let kind_size_in_bytes : type a b. (a, b) kind -> int = function
| Float32 -> 4
| Float64 -> 8
| Int8_signed -> 1
| Int8_unsigned -> 1
| Int16_signed -> 2
| Int16_unsigned -> 2
| Int32 -> 4
| Int64 -> 8
| Int -> Sys.word_size / 8
| Nativeint -> Sys.word_size / 8
| Complex32 -> 8
| Complex64 -> 16
| Char -> 1
type c_layout = C_layout_typ type c_layout = C_layout_typ
type fortran_layout = Fortran_layout_typ type fortran_layout = Fortran_layout_typ
@ -90,9 +105,13 @@ module Genarray = struct
let d = Array.make n 0 in let d = Array.make n 0 in
for i = 0 to n-1 do d.(i) <- nth_dim a i done; for i = 0 to n-1 do d.(i) <- nth_dim a i done;
d d
external kind: ('a, 'b, 'c) t -> ('a, 'b) kind = "caml_ba_kind" external kind: ('a, 'b, 'c) t -> ('a, 'b) kind = "caml_ba_kind"
external layout: ('a, 'b, 'c) t -> 'c layout = "caml_ba_layout" external layout: ('a, 'b, 'c) t -> 'c layout = "caml_ba_layout"
let size_in_bytes arr =
(kind_size_in_bytes (kind arr)) * (Array.fold_left ( * ) 1 (dims arr))
external sub_left: ('a, 'b, c_layout) t -> int -> int -> ('a, 'b, c_layout) t external sub_left: ('a, 'b, c_layout) t -> int -> int -> ('a, 'b, c_layout) t
= "caml_ba_sub" = "caml_ba_sub"
external sub_right: ('a, 'b, fortran_layout) t -> int -> int -> external sub_right: ('a, 'b, fortran_layout) t -> int -> int ->
@ -126,6 +145,10 @@ module Array1 = struct
external dim: ('a, 'b, 'c) t -> int = "%caml_ba_dim_1" external dim: ('a, 'b, 'c) t -> int = "%caml_ba_dim_1"
external kind: ('a, 'b, 'c) t -> ('a, 'b) kind = "caml_ba_kind" external kind: ('a, 'b, 'c) t -> ('a, 'b) kind = "caml_ba_kind"
external layout: ('a, 'b, 'c) t -> 'c layout = "caml_ba_layout" external layout: ('a, 'b, 'c) t -> 'c layout = "caml_ba_layout"
let size_in_bytes arr =
(kind_size_in_bytes (kind arr)) * (dim arr)
external sub: ('a, 'b, 'c) t -> int -> int -> ('a, 'b, 'c) t = "caml_ba_sub" external sub: ('a, 'b, 'c) t -> int -> int -> ('a, 'b, 'c) t = "caml_ba_sub"
external blit: ('a, 'b, 'c) t -> ('a, 'b, 'c) t -> unit = "caml_ba_blit" external blit: ('a, 'b, 'c) t -> ('a, 'b, 'c) t -> unit = "caml_ba_blit"
external fill: ('a, 'b, 'c) t -> 'a -> unit = "caml_ba_fill" external fill: ('a, 'b, 'c) t -> 'a -> unit = "caml_ba_fill"
@ -156,6 +179,10 @@ module Array2 = struct
external dim2: ('a, 'b, 'c) t -> int = "%caml_ba_dim_2" external dim2: ('a, 'b, 'c) t -> int = "%caml_ba_dim_2"
external kind: ('a, 'b, 'c) t -> ('a, 'b) kind = "caml_ba_kind" external kind: ('a, 'b, 'c) t -> ('a, 'b) kind = "caml_ba_kind"
external layout: ('a, 'b, 'c) t -> 'c layout = "caml_ba_layout" external layout: ('a, 'b, 'c) t -> 'c layout = "caml_ba_layout"
let size_in_bytes arr =
(kind_size_in_bytes (kind arr)) * (dim1 arr) * (dim2 arr)
external sub_left: ('a, 'b, c_layout) t -> int -> int -> ('a, 'b, c_layout) t external sub_left: ('a, 'b, c_layout) t -> int -> int -> ('a, 'b, c_layout) t
= "caml_ba_sub" = "caml_ba_sub"
external sub_right: external sub_right:
@ -203,6 +230,10 @@ module Array3 = struct
external dim3: ('a, 'b, 'c) t -> int = "%caml_ba_dim_3" external dim3: ('a, 'b, 'c) t -> int = "%caml_ba_dim_3"
external kind: ('a, 'b, 'c) t -> ('a, 'b) kind = "caml_ba_kind" external kind: ('a, 'b, 'c) t -> ('a, 'b) kind = "caml_ba_kind"
external layout: ('a, 'b, 'c) t -> 'c layout = "caml_ba_layout" external layout: ('a, 'b, 'c) t -> 'c layout = "caml_ba_layout"
let size_in_bytes arr =
(kind_size_in_bytes (kind arr)) * (dim1 arr) * (dim2 arr) * (dim3 arr)
external sub_left: ('a, 'b, c_layout) t -> int -> int -> ('a, 'b, c_layout) t external sub_left: ('a, 'b, c_layout) t -> int -> int -> ('a, 'b, c_layout) t
= "caml_ba_sub" = "caml_ba_sub"
external sub_right: external sub_right:

View File

@ -168,6 +168,10 @@ val char : (char, int8_unsigned_elt) kind
characters instead of arrays of small integers, by using characters instead of arrays of small integers, by using
the kind value [char] instead of [int8_unsigned]. *) the kind value [char] instead of [int8_unsigned]. *)
val kind_size_in_bytes : ('a, 'b) kind -> int
(** [kind_size_in_bytes k] is the number of bytes used to store
an element of type [k]. *)
(** {6 Array layouts} *) (** {6 Array layouts} *)
type c_layout = C_layout_typ (**) type c_layout = C_layout_typ (**)
@ -280,6 +284,10 @@ module Genarray :
external layout: ('a, 'b, 'c) t -> 'c layout = "caml_ba_layout" external layout: ('a, 'b, 'c) t -> 'c layout = "caml_ba_layout"
(** Return the layout of the given big array. *) (** Return the layout of the given big array. *)
val size_in_bytes : ('a, 'b, 'c) t -> int
(** [size_in_bytes a] is the number of elements in [a] multiplied
by [a]'s {!kind_size_in_bytes}.*)
external get: ('a, 'b, 'c) t -> int array -> 'a = "caml_ba_get_generic" external get: ('a, 'b, 'c) t -> int array -> 'a = "caml_ba_get_generic"
(** Read an element of a generic big array. (** Read an element of a generic big array.
[Genarray.get a [|i1; ...; iN|]] returns the element of [a] [Genarray.get a [|i1; ...; iN|]] returns the element of [a]
@ -490,6 +498,10 @@ module Array1 : sig
external layout: ('a, 'b, 'c) t -> 'c layout = "caml_ba_layout" external layout: ('a, 'b, 'c) t -> 'c layout = "caml_ba_layout"
(** Return the layout of the given big array. *) (** Return the layout of the given big array. *)
val size_in_bytes : ('a, 'b, 'c) t -> int
(** [size_in_bytes a] is the number of elements in [a]
multiplied by [a]'s {!kind_size_in_bytes}. *)
external get: ('a, 'b, 'c) t -> int -> 'a = "%caml_ba_ref_1" external get: ('a, 'b, 'c) t -> int -> 'a = "%caml_ba_ref_1"
(** [Array1.get a x], or alternatively [a.{x}], (** [Array1.get a x], or alternatively [a.{x}],
returns the element of [a] at index [x]. returns the element of [a] at index [x].
@ -572,6 +584,10 @@ module Array2 :
external layout: ('a, 'b, 'c) t -> 'c layout = "caml_ba_layout" external layout: ('a, 'b, 'c) t -> 'c layout = "caml_ba_layout"
(** Return the layout of the given big array. *) (** Return the layout of the given big array. *)
val size_in_bytes : ('a, 'b, 'c) t -> int
(** [[size_in_bytes a] is the number of elements in [a]
multiplied by [a]'s {!kind_size_in_bytes}. *)
external get: ('a, 'b, 'c) t -> int -> int -> 'a = "%caml_ba_ref_2" external get: ('a, 'b, 'c) t -> int -> int -> 'a = "%caml_ba_ref_2"
(** [Array2.get a x y], also written [a.{x,y}], (** [Array2.get a x y], also written [a.{x,y}],
returns the element of [a] at coordinates ([x], [y]). returns the element of [a] at coordinates ([x], [y]).
@ -678,6 +694,10 @@ module Array3 :
external layout: ('a, 'b, 'c) t -> 'c layout = "caml_ba_layout" external layout: ('a, 'b, 'c) t -> 'c layout = "caml_ba_layout"
(** Return the layout of the given big array. *) (** Return the layout of the given big array. *)
val size_in_bytes : ('a, 'b, 'c) t -> int
(** [size_in_bytes a] is the number of elements in [a]
multiplied by [a]'s {!kind_size_in_bytes}. *)
external get: ('a, 'b, 'c) t -> int -> int -> int -> 'a = "%caml_ba_ref_3" external get: ('a, 'b, 'c) t -> int -> int -> int -> 'a = "%caml_ba_ref_3"
(** [Array3.get a x y z], also written [a.{x,y,z}], (** [Array3.get a x y z], also written [a.{x,y,z}],
returns the element of [a] at coordinates ([x], [y], [z]). returns the element of [a] at coordinates ([x], [y], [z]).

View File

@ -411,6 +411,14 @@ let _ =
test 1 (Array1.dim (from_list int [1;2;3;4;5])) 5; test 1 (Array1.dim (from_list int [1;2;3;4;5])) 5;
test 2 (Array1.dim (from_list_fortran int [1;2;3])) 3; test 2 (Array1.dim (from_list_fortran int [1;2;3])) 3;
testing_function "size_in_bytes_one";
test 1 (Array1.size_in_bytes (from_list int [1;2;3;4;5]))
(5 * (kind_size_in_bytes int));
test 2 (Array1.size_in_bytes (from_list int [])) 0;
let int64list = (from_list int64 (List.map Int64.of_int [1;2;3;4;5])) in
test 3 (Array1.size_in_bytes int64list) (5 * (kind_size_in_bytes int64));
test 4 (Array1.size_in_bytes (from_list int64 (List.map Int64.of_int []))) 0;
testing_function "kind & layout"; testing_function "kind & layout";
let a = from_list int [1;2;3] in let a = from_list int [1;2;3] in
test 1 (Array1.kind a) int; test 1 (Array1.kind a) int;
@ -595,6 +603,10 @@ let _ =
test 3 (Array2.dim1 b) 4; test 3 (Array2.dim1 b) 4;
test 4 (Array2.dim2 b) 6; test 4 (Array2.dim2 b) 6;
testing_function "size_in_bytes_two";
let a = Array2.create int c_layout 4 6 in
test 1 (Array2.size_in_bytes a) (24 * (kind_size_in_bytes int));
testing_function "sub"; testing_function "sub";
let a = make_array2 int c_layout 0 5 3 id in let a = make_array2 int c_layout 0 5 3 id in
let b = Array2.sub_left a 2 2 in let b = Array2.sub_left a 2 2 in
@ -746,6 +758,10 @@ let _ =
test 5 (Array3.dim2 b) 5; test 5 (Array3.dim2 b) 5;
test 6 (Array3.dim3 b) 6; test 6 (Array3.dim3 b) 6;
testing_function "size_in_bytes_three";
let a = Array3.create int c_layout 4 5 6 in
test 1 (Array3.size_in_bytes a) (120 * (kind_size_in_bytes int));
testing_function "slice1"; testing_function "slice1";
let a = make_array3 int c_layout 0 3 3 3 id in let a = make_array3 int c_layout 0 3 3 3 id in
test 1 (Array3.slice_left_1 a 0 0) (from_list int [0;1;2]); test 1 (Array3.slice_left_1 a 0 0) (from_list int [0;1;2]);
@ -757,6 +773,39 @@ let _ =
test 6 (Array3.slice_right_1 a 1 2) (from_list_fortran int [112;212;312]); test 6 (Array3.slice_right_1 a 1 2) (from_list_fortran int [112;212;312]);
test 7 (Array3.slice_right_1 a 3 1) (from_list_fortran int [131;231;331]); test 7 (Array3.slice_right_1 a 3 1) (from_list_fortran int [131;231;331]);
testing_function "size_in_bytes_general";
let a = Genarray.create int c_layout [|2;2;2;2;2|] in
test 1 (Genarray.size_in_bytes a) (32 * (kind_size_in_bytes int));
(* Kind size *)
testing_function "kind_size_in_bytes";
let arr1 = Array1.create Float32 c_layout 1 in
test 1 (kind_size_in_bytes Float32) (Array1.size_in_bytes arr1);
let arr1 = Array1.create Float64 c_layout 1 in
test 2 (kind_size_in_bytes Float64) (Array1.size_in_bytes arr1);
let arr1 = Array1.create Int8_signed c_layout 1 in
test 3 (kind_size_in_bytes Int8_signed) (Array1.size_in_bytes arr1);
let arr1 = Array1.create Int8_unsigned c_layout 1 in
test 4 (kind_size_in_bytes Int8_unsigned) (Array1.size_in_bytes arr1);
let arr1 = Array1.create Int16_signed c_layout 1 in
test 5 (kind_size_in_bytes Int16_signed) (Array1.size_in_bytes arr1);
let arr1 = Array1.create Int16_unsigned c_layout 1 in
test 6 (kind_size_in_bytes Int16_unsigned) (Array1.size_in_bytes arr1);
let arr1 = Array1.create Int32 c_layout 1 in
test 7 (kind_size_in_bytes Int32) (Array1.size_in_bytes arr1);
let arr1 = Array1.create Int64 c_layout 1 in
test 8 (kind_size_in_bytes Int64) (Array1.size_in_bytes arr1);
let arr1 = Array1.create Int c_layout 1 in
test 9 (kind_size_in_bytes Int) (Array1.size_in_bytes arr1);
let arr1 = Array1.create Nativeint c_layout 1 in
test 10 (kind_size_in_bytes Nativeint) (Array1.size_in_bytes arr1);
let arr1 = Array1.create Complex32 c_layout 1 in
test 11 (kind_size_in_bytes Complex32) (Array1.size_in_bytes arr1);
let arr1 = Array1.create Complex64 c_layout 1 in
test 12 (kind_size_in_bytes Complex64) (Array1.size_in_bytes arr1);
let arr1 = Array1.create Char c_layout 1 in
test 13 (kind_size_in_bytes Char) (Array1.size_in_bytes arr1);
(* Reshaping *) (* Reshaping *)
print_newline(); print_newline();
testing_function "------ Reshaping --------"; testing_function "------ Reshaping --------";

View File

@ -11,6 +11,8 @@ comparisons
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... 44... 45... 46... 47... 48... 49... 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... 44... 45... 46... 47... 48... 49...
dim dim
1... 2... 1... 2...
size_in_bytes_one
1... 2... 3... 4...
kind & layout kind & layout
1... 2... 1... 2... 1... 2... 1... 2...
sub sub
@ -28,6 +30,8 @@ set/get (unsafe, specialized)
1... 2... 1... 2...
dim dim
1... 2... 3... 4... 1... 2... 3... 4...
size_in_bytes_two
1...
sub sub
1... 2... 1... 2...
slice slice
@ -43,8 +47,14 @@ set/get (unsafe, specialized)
1... 1...
dim dim
1... 2... 3... 4... 5... 6... 1... 2... 3... 4... 5... 6...
size_in_bytes_three
1...
slice1 slice1
1... 2... 3... 4... 5... 6... 7... 1... 2... 3... 4... 5... 6... 7...
size_in_bytes_general
1...
kind_size_in_bytes
1... 2... 3... 4... 5... 6... 7... 8... 9... 10... 11... 12... 13...
------ Reshaping -------- ------ Reshaping --------