123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- /*
- Copyright (c) 2014 Intel Corporation. All Rights Reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- * Neither the name of Intel Corporation nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- #include "offload_common.h"
- bool __dv_is_contiguous(const ArrDesc *dvp)
- {
- if (dvp->Flags & ArrDescFlagsContiguous) {
- return true;
- }
- if (dvp->Rank != 0) {
- if (dvp->Dim[0].Mult != dvp->Len) {
- return false;
- }
- for (int i = 1; i < dvp->Rank; i++) {
- if (dvp->Dim[i].Mult !=
- dvp->Dim[i-1].Extent * dvp->Dim[i-1].Mult) {
- return false;
- }
- }
- }
- return true;
- }
- bool __dv_is_allocated(const ArrDesc *dvp)
- {
- return (dvp->Flags & ArrDescFlagsDefined);
- }
- uint64_t __dv_data_length(const ArrDesc *dvp)
- {
- uint64_t size;
- if (dvp->Rank == 0) {
- size = dvp->Len;
- return size;
- }
- size = dvp->Len;
- for (int i = 0; i < dvp->Rank; ++i) {
- size += (dvp->Dim[i].Extent-1) * dvp->Dim[i].Mult;
- }
- return size;
- }
- uint64_t __dv_data_length(const ArrDesc *dvp, int64_t count)
- {
- if (dvp->Rank == 0) {
- return count;
- }
- return count * dvp->Dim[0].Mult;
- }
- // Create CeanReadRanges data for reading contiguous ranges of
- // noncontiguous array defined by the argument
- CeanReadRanges * init_read_ranges_dv(const ArrDesc *dvp)
- {
- int64_t len;
- int count;
- int rank = dvp->Rank;
- CeanReadRanges *res = NULL;
- if (rank != 0) {
- int i = 0;
- len = dvp->Len;
- if (dvp->Dim[0].Mult == len) {
- for (i = 1; i < rank; i++) {
- len *= dvp->Dim[i-1].Extent;
- if (dvp->Dim[i].Mult != len) {
- break;
- }
- }
- }
- res = (CeanReadRanges *)malloc(
- sizeof(CeanReadRanges) + (rank - i) * sizeof(CeanReadDim));
- if (res == NULL)
- LIBOFFLOAD_ERROR(c_malloc);
- res -> last_noncont_ind = rank - i - 1;
- count = 1;
- for (; i < rank; i++) {
- res->Dim[rank - i - 1].count = count;
- res->Dim[rank - i - 1].size = dvp->Dim[i].Mult;
- count *= dvp->Dim[i].Extent;
- }
- res -> range_max_number = count;
- res -> range_size = len;
- res -> ptr = (void*)dvp->Base;
- res -> current_number = 0;
- res -> init_offset = 0;
- }
- return res;
- }
- #if OFFLOAD_DEBUG > 0
- void __dv_desc_dump(const char *name, const ArrDesc *dvp)
- {
- OFFLOAD_TRACE(3, "%s DV %p\n", name, dvp);
- if (dvp != 0) {
- OFFLOAD_TRACE(3,
- " dv->Base = 0x%lx\n"
- " dv->Len = 0x%lx\n"
- " dv->Offset = 0x%lx\n"
- " dv->Flags = 0x%lx\n"
- " dv->Rank = 0x%lx\n"
- " dv->Resrvd = 0x%lx\n",
- dvp->Base,
- dvp->Len,
- dvp->Offset,
- dvp->Flags,
- dvp->Rank,
- dvp->Reserved);
- for (int i = 0 ; i < dvp->Rank; i++) {
- OFFLOAD_TRACE(3,
- " (%d) Extent=%ld, Multiplier=%ld, LowerBound=%ld\n",
- i,
- dvp->Dim[i].Extent,
- dvp->Dim[i].Mult,
- dvp->Dim[i].LowerBound);
- }
- }
- }
- #endif // OFFLOAD_DEBUG > 0
|