]>
Commit | Line | Data |
---|---|---|
d3a7dd32 | 1 | /* |
8aafcf7e | 2 | Copyright (c) 2014-2016 Intel Corporation. All Rights Reserved. |
d3a7dd32 | 3 | |
4 | Redistribution and use in source and binary forms, with or without | |
5 | modification, are permitted provided that the following conditions | |
6 | are met: | |
7 | ||
8 | * Redistributions of source code must retain the above copyright | |
9 | notice, this list of conditions and the following disclaimer. | |
10 | * Redistributions in binary form must reproduce the above copyright | |
11 | notice, this list of conditions and the following disclaimer in the | |
12 | documentation and/or other materials provided with the distribution. | |
13 | * Neither the name of Intel Corporation nor the names of its | |
14 | contributors may be used to endorse or promote products derived | |
15 | from this software without specific prior written permission. | |
16 | ||
17 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
18 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
19 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
20 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
21 | HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
22 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
23 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
24 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
25 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
26 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
27 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
28 | */ | |
29 | ||
30 | ||
31 | #ifndef CEAN_UTIL_H_INCLUDED | |
32 | #define CEAN_UTIL_H_INCLUDED | |
33 | ||
34 | #include <stdint.h> | |
5553d0c3 | 35 | #include "offload_util.h" |
d3a7dd32 | 36 | |
37 | // CEAN expression representation | |
5553d0c3 | 38 | struct Dim_Desc { |
d3a7dd32 | 39 | int64_t size; // Length of data type |
40 | int64_t lindex; // Lower index | |
41 | int64_t lower; // Lower section bound | |
42 | int64_t upper; // Upper section bound | |
43 | int64_t stride; // Stride | |
44 | }; | |
45 | ||
5553d0c3 | 46 | struct Arr_Desc { |
d3a7dd32 | 47 | int64_t base; // Base address |
48 | int64_t rank; // Rank of array | |
5553d0c3 | 49 | Dim_Desc dim[1]; |
d3a7dd32 | 50 | }; |
51 | ||
52 | struct CeanReadDim { | |
53 | int64_t count; // The number of elements in this dimension | |
54 | int64_t size; // The number of bytes between successive | |
55 | // elements in this dimension. | |
56 | }; | |
57 | ||
58 | struct CeanReadRanges { | |
5553d0c3 | 59 | Arr_Desc* arr_desc; |
d3a7dd32 | 60 | void * ptr; |
61 | int64_t current_number; // the number of ranges read | |
62 | int64_t range_max_number; // number of contiguous ranges | |
63 | int64_t range_size; // size of max contiguous range | |
64 | int last_noncont_ind; // size of Dim array | |
65 | int64_t init_offset; // offset of 1-st element from array left bound | |
66 | CeanReadDim Dim[1]; | |
67 | }; | |
68 | ||
8aafcf7e | 69 | struct IntervalDesc { |
70 | int64_t lower; // Lower index | |
71 | int64_t size; // Size of each element at this interval | |
72 | }; | |
73 | ||
74 | struct NonContigDesc { | |
75 | int64_t base; // Base address | |
76 | int64_t interval_cnt; // Number of intervals | |
77 | struct IntervalDesc interval[1]; | |
78 | }; | |
79 | ||
d3a7dd32 | 80 | // array descriptor length |
81 | #define __arr_desc_length(rank) \ | |
5553d0c3 | 82 | (sizeof(int64_t) + sizeof(Dim_Desc) * (rank)) |
d3a7dd32 | 83 | |
84 | // returns offset and length of the data to be transferred | |
5553d0c3 | 85 | DLL_LOCAL void __arr_data_offset_and_length(const Arr_Desc *adp, |
d3a7dd32 | 86 | int64_t &offset, |
87 | int64_t &length); | |
88 | ||
89 | // define if data array described by argument is contiguous one | |
5553d0c3 | 90 | DLL_LOCAL bool is_arr_desc_contiguous(const Arr_Desc *ap); |
d3a7dd32 | 91 | |
92 | // allocate element of CeanReadRanges type initialized | |
93 | // to read consequently contiguous ranges described by "ap" argument | |
5553d0c3 | 94 | DLL_LOCAL CeanReadRanges * init_read_ranges_arr_desc(const Arr_Desc *ap); |
d3a7dd32 | 95 | |
5553d0c3 | 96 | // check if ranges described by 1 argument could be transferred into ranges |
d3a7dd32 | 97 | // described by 2-nd one |
5553d0c3 | 98 | DLL_LOCAL bool cean_ranges_match( |
d3a7dd32 | 99 | CeanReadRanges * read_rng1, |
100 | CeanReadRanges * read_rng2 | |
101 | ); | |
102 | ||
103 | // first argument - returned value by call to init_read_ranges_arr_desc. | |
104 | // returns true if offset and length of next range is set successfuly. | |
105 | // returns false if the ranges is over. | |
5553d0c3 | 106 | DLL_LOCAL bool get_next_range( |
d3a7dd32 | 107 | CeanReadRanges * read_rng, |
108 | int64_t *offset | |
109 | ); | |
110 | ||
5553d0c3 | 111 | // returns number of transferred bytes |
112 | DLL_LOCAL int64_t cean_get_transf_size(CeanReadRanges * read_rng); | |
d3a7dd32 | 113 | |
114 | #if OFFLOAD_DEBUG > 0 | |
115 | // prints array descriptor contents to stderr | |
5553d0c3 | 116 | DLL_LOCAL void __arr_desc_dump( |
d3a7dd32 | 117 | const char *spaces, |
118 | const char *name, | |
5553d0c3 | 119 | const Arr_Desc *adp, |
120 | bool dereference, | |
121 | bool print_values); | |
8aafcf7e | 122 | |
123 | DLL_LOCAL void noncont_struct_dump( | |
124 | const char *spaces, | |
125 | const char *name, | |
126 | struct NonContigDesc *desc_p); | |
127 | ||
128 | DLL_LOCAL int64_t get_noncont_struct_size(struct NonContigDesc *desc_p); | |
129 | ||
5553d0c3 | 130 | #define ARRAY_DESC_DUMP(spaces, name, adp, dereference, print_values) \ |
131 | if (console_enabled >= 2) \ | |
132 | __arr_desc_dump(spaces, name, adp, dereference, print_values); | |
d3a7dd32 | 133 | #else |
5553d0c3 | 134 | #define ARRAY_DESC_DUMP(spaces, name, adp, dereference, print_values) |
d3a7dd32 | 135 | #endif // OFFLOAD_DEBUG |
136 | ||
137 | #endif // CEAN_UTIL_H_INCLUDED |