CUTLASS 2.9 (#468)
This commit is contained in:
@@ -1,24 +1,30 @@
|
||||
/***************************************************************************************************
|
||||
* Copyright (c) 2017-2021, NVIDIA 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 the NVIDIA 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 NVIDIA CORPORATION 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
|
||||
* Copyright (c) 2017 - 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. 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.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder 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.
|
||||
*
|
||||
**************************************************************************************************/
|
||||
@@ -283,7 +289,7 @@ class PredicatedTileAccessIteratorPredicates {
|
||||
|
||||
/// Returns whether access is valid or not
|
||||
CUTLASS_HOST_DEVICE
|
||||
bool valid() {
|
||||
bool valid() const {
|
||||
|
||||
|
||||
int pred_idx =
|
||||
@@ -305,7 +311,7 @@ class PredicatedTileAccessIteratorPredicates {
|
||||
/// PredicatedTileAccessIterator
|
||||
///
|
||||
template <typename Shape, typename Element, typename Layout, int AdvanceRank,
|
||||
typename ThreadMap, typename AccessType>
|
||||
typename ThreadMap, typename AccessType, bool Gather = false>
|
||||
class PredicatedTileAccessIterator;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -313,9 +319,9 @@ class PredicatedTileAccessIterator;
|
||||
/// Specialization of PredicatedTileAccessIterator for pitch-linear data.
|
||||
///
|
||||
template <typename Shape_, typename Element_, int AdvanceRank,
|
||||
typename ThreadMap_, typename AccessType_>
|
||||
typename ThreadMap_, typename AccessType_, bool Gather>
|
||||
class PredicatedTileAccessIterator<Shape_, Element_, layout::PitchLinear,
|
||||
AdvanceRank, ThreadMap_, AccessType_> {
|
||||
AdvanceRank, ThreadMap_, AccessType_, Gather> {
|
||||
public:
|
||||
static_assert(
|
||||
AdvanceRank == 0 || AdvanceRank == 1,
|
||||
@@ -390,6 +396,17 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::PitchLinear,
|
||||
/// Used for out-of-order visitation
|
||||
bool is_residue_tile_;
|
||||
|
||||
/// Below is used when Gather is turned on. We need to record strided_offset
|
||||
/// and contiguous_offset seperated to compute the offset by using
|
||||
///
|
||||
/// offset = contiguous_offset + indices[strided_offset]
|
||||
///
|
||||
|
||||
/// Gather indices
|
||||
int const *indices_;
|
||||
|
||||
Index gather_offset_strided;
|
||||
|
||||
private:
|
||||
/// Computes predicates based on internally tracked per-thread offset.
|
||||
CUTLASS_DEVICE
|
||||
@@ -416,19 +433,27 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::PitchLinear,
|
||||
/// ID of each participating thread
|
||||
int thread_id,
|
||||
/// Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset)
|
||||
TensorCoord const &threadblock_offset,
|
||||
/// Gather indices
|
||||
int const *indices = nullptr)
|
||||
: params_(params),
|
||||
pointer_(reinterpret_cast<BytePointer>(
|
||||
const_cast<NonConstPointer>(pointer))),
|
||||
the_predicates(extent),
|
||||
is_residue_tile_(true) {
|
||||
is_residue_tile_(true),
|
||||
indices_(indices) {
|
||||
|
||||
the_predicates.set_predicates(thread_id, threadblock_offset);
|
||||
|
||||
// update internal pointers
|
||||
Layout layout(params_.stride_);
|
||||
add_pointer_offset(layout(the_predicates.thread_offset_));
|
||||
|
||||
if (!Gather) {
|
||||
add_pointer_offset(layout(the_predicates.thread_offset_));
|
||||
} else {
|
||||
gather_offset_strided = the_predicates.thread_offset_.strided();
|
||||
add_pointer_offset(layout(make_Coord(the_predicates.thread_offset_.contiguous(), 0)));
|
||||
}
|
||||
}
|
||||
|
||||
/// Construct a PredicatedTileAccessIterator with zero threadblock offset
|
||||
@@ -465,33 +490,68 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::PitchLinear,
|
||||
|
||||
the_predicates.thread_offset_ += the_predicates.residue_offset_;
|
||||
|
||||
Layout layout(params_.stride_);
|
||||
add_pointer_offset(layout(the_predicates.residue_offset_));
|
||||
|
||||
the_predicates.compute_predicates_(the_predicates.extent_, true);
|
||||
|
||||
if (kAdvanceRank) {
|
||||
pointer_ += params_.inc_advance_ * LongIndex(tile_offset.strided() - 1);
|
||||
pointer_ += Shape::kContiguous * tile_offset.contiguous();
|
||||
Layout layout(params_.stride_);
|
||||
|
||||
if (!Gather) {
|
||||
add_pointer_offset(layout(the_predicates.residue_offset_));
|
||||
|
||||
if (kAdvanceRank) {
|
||||
pointer_ += params_.inc_advance_ * LongIndex(tile_offset.strided() - 1);
|
||||
pointer_ += Shape::kContiguous * tile_offset.contiguous();
|
||||
} else {
|
||||
pointer_ += params_.inc_advance_ * LongIndex(tile_offset.contiguous() - 1);
|
||||
pointer_ += Shape::kStrided * tile_offset.strided();
|
||||
}
|
||||
} else {
|
||||
pointer_ += params_.inc_advance_ * LongIndex(tile_offset.contiguous() - 1);
|
||||
pointer_ += Shape::kStrided * tile_offset.strided();
|
||||
gather_offset_strided = the_predicates.thread_offset_.strided();
|
||||
add_pointer_offset(layout(make_Coord(the_predicates.residue_offset_.contiguous(), 0)));
|
||||
|
||||
if (kAdvanceRank) {
|
||||
gather_offset_strided += Shape::kStrided * (tile_offset.strided() - 1);
|
||||
add_pointer_offset(Shape::kContiguous * tile_offset.contiguous());
|
||||
} else {
|
||||
add_pointer_offset(Shape::kContiguous * (tile_offset.contiguous() - 1));
|
||||
gather_offset_strided += Shape::kStrided * tile_offset.strided();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (kAdvanceRank) {
|
||||
pointer_ += params_.inc_advance_ * LongIndex(tile_offset.strided());
|
||||
pointer_ += Shape::kContiguous * tile_offset.contiguous();
|
||||
if (!Gather) {
|
||||
if (kAdvanceRank) {
|
||||
pointer_ += params_.inc_advance_ * LongIndex(tile_offset.strided());
|
||||
pointer_ += Shape::kContiguous * tile_offset.contiguous();
|
||||
} else {
|
||||
pointer_ += params_.inc_advance_ * LongIndex(tile_offset.contiguous());
|
||||
pointer_ += Shape::kStrided * tile_offset.strided();
|
||||
}
|
||||
} else {
|
||||
pointer_ += params_.inc_advance_ * LongIndex(tile_offset.contiguous());
|
||||
pointer_ += Shape::kStrided * tile_offset.strided();
|
||||
add_pointer_offset(Shape::kContiguous * tile_offset.contiguous());
|
||||
gather_offset_strided += Shape::kStrided * tile_offset.strided();
|
||||
}
|
||||
}
|
||||
|
||||
is_residue_tile_ = false;
|
||||
}
|
||||
|
||||
/// Returns a pointer
|
||||
CUTLASS_HOST_DEVICE
|
||||
AccessType *get() const {
|
||||
if (Gather) {
|
||||
assert(indices_);
|
||||
|
||||
if (!valid()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
LongIndex contiguous_offset = the_predicates.iteration_contiguous_ * (ThreadMap::Delta::kContiguous * sizeof_bits<Element>::value / 8) + the_predicates.iteration_vector_;
|
||||
int strided_index = gather_offset_strided + the_predicates.iteration_strided_ * ThreadMap::Delta::kStrided;
|
||||
|
||||
LongIndex strided_offset = indices_[strided_index] * LongIndex(params_.stride_) * sizeof_bits<Element>::value / 8;
|
||||
|
||||
return reinterpret_cast<AccessType *>(pointer_ + contiguous_offset + strided_offset);
|
||||
}
|
||||
|
||||
return reinterpret_cast<AccessType *>(
|
||||
pointer_ +
|
||||
the_predicates.iteration_contiguous_ * (ThreadMap::Delta::kContiguous * sizeof_bits<Element>::value) / 8) + the_predicates.iteration_vector_;
|
||||
@@ -521,7 +581,10 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::PitchLinear,
|
||||
++the_predicates.iteration_strided_;
|
||||
|
||||
if (the_predicates.iteration_strided_ < ThreadMap::Iterations::kStrided) {
|
||||
pointer_ += params_.inc_strided_;
|
||||
if (!Gather) {
|
||||
pointer_ += params_.inc_strided_;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
@@ -529,13 +592,15 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::PitchLinear,
|
||||
// which means we enter the next tile.
|
||||
the_predicates.iteration_strided_ = 0;
|
||||
|
||||
// advance to next tile
|
||||
pointer_ += params_.inc_next_;
|
||||
|
||||
// now return to start tile - if the iterator is subsequently advanced, this
|
||||
// subtraction as well as the subsequent integer addition are both elided by
|
||||
// the compiler.
|
||||
pointer_ -= params_.inc_advance_;
|
||||
if (!Gather) {
|
||||
// advance to next tile
|
||||
pointer_ += params_.inc_next_;
|
||||
|
||||
// now return to start tile - if the iterator is subsequently advanced, this
|
||||
// subtraction as well as the subsequent integer addition are both elided by
|
||||
// the compiler.
|
||||
pointer_ -= params_.inc_advance_;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
@@ -574,10 +639,9 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::PitchLinear,
|
||||
|
||||
/// Returns whether access is valid or not
|
||||
CUTLASS_HOST_DEVICE
|
||||
bool valid() {
|
||||
bool valid() const {
|
||||
return the_predicates.valid();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -590,9 +654,9 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::PitchLinear,
|
||||
/// MaskedTileIteratorConcept
|
||||
///
|
||||
template <typename Shape_, typename Element_, int AdvanceRank,
|
||||
typename ThreadMap_, typename AccessType_>
|
||||
typename ThreadMap_, typename AccessType_, bool Gather>
|
||||
class PredicatedTileAccessIterator<Shape_, Element_, layout::ColumnMajor,
|
||||
AdvanceRank, ThreadMap_, AccessType_> {
|
||||
AdvanceRank, ThreadMap_, AccessType_, Gather> {
|
||||
public:
|
||||
static_assert(
|
||||
AdvanceRank == 0 || AdvanceRank == 1,
|
||||
@@ -618,7 +682,7 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::ColumnMajor,
|
||||
|
||||
using UnderlyingIterator = PredicatedTileAccessIterator<
|
||||
layout::PitchLinearShape<Shape::kRow, Shape::kColumn>, Element,
|
||||
layout::PitchLinear, (kAdvanceRank == 0 ? 0 : 1), ThreadMap, AccessType>;
|
||||
layout::PitchLinear, (kAdvanceRank == 0 ? 0 : 1), ThreadMap, AccessType, Gather>;
|
||||
|
||||
/// Predicate vector stores mask to guard accesses
|
||||
using Mask = typename UnderlyingIterator::Mask;
|
||||
@@ -672,12 +736,15 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::ColumnMajor,
|
||||
///< ID of each participating thread
|
||||
int thread_id,
|
||||
///< Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset)
|
||||
TensorCoord const &threadblock_offset,
|
||||
int const *indices = nullptr ///< gather/scatter indices, note no support for gather/scatter at this specialization
|
||||
)
|
||||
: iterator_(params.params_, pointer,
|
||||
layout::PitchLinearCoord(extent.row(), extent.column()),
|
||||
thread_id,
|
||||
layout::PitchLinearCoord(threadblock_offset.row(),
|
||||
threadblock_offset.column())) {}
|
||||
threadblock_offset.column()),
|
||||
indices) {}
|
||||
|
||||
/// Construct a PredicatedTileAccessIterator with zero threadblock offset
|
||||
CUTLASS_HOST_DEVICE
|
||||
@@ -771,9 +838,9 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::ColumnMajor,
|
||||
/// MaskedTileIteratorConcept
|
||||
///
|
||||
template <typename Shape_, typename Element_, int AdvanceRank,
|
||||
typename ThreadMap_, typename AccessType_>
|
||||
typename ThreadMap_, typename AccessType_, bool Gather>
|
||||
class PredicatedTileAccessIterator<Shape_, Element_, layout::RowMajor,
|
||||
AdvanceRank, ThreadMap_, AccessType_> {
|
||||
AdvanceRank, ThreadMap_, AccessType_, Gather> {
|
||||
public:
|
||||
static_assert(
|
||||
AdvanceRank == 0 || AdvanceRank == 1,
|
||||
@@ -799,7 +866,7 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::RowMajor,
|
||||
|
||||
using UnderlyingIterator = PredicatedTileAccessIterator<
|
||||
layout::PitchLinearShape<Shape::kColumn, Shape::kRow>, Element,
|
||||
layout::PitchLinear, (kAdvanceRank == 0 ? 1 : 0), ThreadMap, AccessType>;
|
||||
layout::PitchLinear, (kAdvanceRank == 0 ? 1 : 0), ThreadMap, AccessType, Gather>;
|
||||
|
||||
static int const kAccessesPerVector = UnderlyingIterator::kAccessesPerVector;
|
||||
|
||||
@@ -853,12 +920,15 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::RowMajor,
|
||||
///< ID of each participating thread
|
||||
int thread_id,
|
||||
///< Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset)
|
||||
TensorCoord const &threadblock_offset,
|
||||
/// Gather indices
|
||||
int const *indices = nullptr)
|
||||
: iterator_(params.params_, pointer,
|
||||
layout::PitchLinearCoord(extent.column(), extent.row()),
|
||||
thread_id,
|
||||
layout::PitchLinearCoord(threadblock_offset.column(),
|
||||
threadblock_offset.row())) {}
|
||||
threadblock_offset.row()),
|
||||
indices) {}
|
||||
|
||||
/// Construct a PredicatedTileAccessIterator with zero threadblock offset
|
||||
CUTLASS_HOST_DEVICE
|
||||
@@ -954,7 +1024,7 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::RowMajor,
|
||||
template <typename Shape_, typename Element_, int AdvanceRank,
|
||||
typename ThreadMap_, typename AccessType_>
|
||||
class PredicatedTileAccessIterator<Shape_, Element_, layout::AffineRankN<2>,
|
||||
AdvanceRank, ThreadMap_, AccessType_> {
|
||||
AdvanceRank, ThreadMap_, AccessType_, false> {
|
||||
public:
|
||||
static_assert(
|
||||
AdvanceRank == 0 || AdvanceRank == 1,
|
||||
@@ -1087,7 +1157,9 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::AffineRankN<2>,
|
||||
///< ID of each participating thread
|
||||
int thread_id,
|
||||
///< Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset)
|
||||
TensorCoord const &threadblock_offset,
|
||||
int const *indices = nullptr ///< gather/scatter indices, note no support for gather/scatter at this specialization
|
||||
)
|
||||
: params_(params),
|
||||
pointer_(reinterpret_cast<BytePointer>(
|
||||
const_cast<NonConstPointer>(pointer))),
|
||||
@@ -1099,7 +1171,6 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::AffineRankN<2>,
|
||||
// update internal pointers
|
||||
Layout layout(params_.stride_);
|
||||
add_pointer_offset(layout(the_predicates.thread_offset_));
|
||||
|
||||
}
|
||||
|
||||
/// Construct a PredicatedTileAccessIterator with zero threadblock offset
|
||||
@@ -1256,7 +1327,7 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::AffineRankN<2>,
|
||||
template <typename Shape_, typename Element_, int AdvanceRank,
|
||||
typename ThreadMap_, typename AccessType_>
|
||||
class PredicatedTileAccessIterator<Shape_, Element_, layout::AffineRank2ColumnMajor,
|
||||
AdvanceRank, ThreadMap_, AccessType_> {
|
||||
AdvanceRank, ThreadMap_, AccessType_, false> {
|
||||
public:
|
||||
static_assert(
|
||||
AdvanceRank == 0 || AdvanceRank == 1,
|
||||
@@ -1332,7 +1403,9 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::AffineRank2ColumnMa
|
||||
///< ID of each participating thread
|
||||
int thread_id,
|
||||
///< Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset)
|
||||
TensorCoord const &threadblock_offset,
|
||||
int const *indices = nullptr ///< gather/scatter indices, note no support for gather/scatter at this specialization
|
||||
)
|
||||
: iterator_(params.params_, pointer,
|
||||
layout::PitchLinearCoord(extent.row(), extent.column()),
|
||||
thread_id,
|
||||
@@ -1433,7 +1506,7 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::AffineRank2ColumnMa
|
||||
template <typename Shape_, typename Element_, int AdvanceRank,
|
||||
typename ThreadMap_, typename AccessType_>
|
||||
class PredicatedTileAccessIterator<Shape_, Element_, layout::AffineRank2RowMajor,
|
||||
AdvanceRank, ThreadMap_, AccessType_> {
|
||||
AdvanceRank, ThreadMap_, AccessType_, false> {
|
||||
public:
|
||||
static_assert(
|
||||
AdvanceRank == 0 || AdvanceRank == 1,
|
||||
@@ -1509,7 +1582,9 @@ class PredicatedTileAccessIterator<Shape_, Element_, layout::AffineRank2RowMajor
|
||||
///< ID of each participating thread
|
||||
int thread_id,
|
||||
///< Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset)
|
||||
TensorCoord const &threadblock_offset,
|
||||
int const *indices = nullptr ///< gather/scatter indices, note no support for gather/scatter at this specialization
|
||||
)
|
||||
: iterator_(params.params_, pointer,
|
||||
layout::PitchLinearCoord(extent.column(), extent.row()),
|
||||
thread_id,
|
||||
@@ -1613,7 +1688,7 @@ template <typename Shape_, typename Element_, int AdvanceRank,
|
||||
typename ThreadMap_, typename AccessType_, int InterleavedK>
|
||||
class PredicatedTileAccessIterator<Shape_, Element_,
|
||||
layout::ColumnMajorInterleaved<InterleavedK>,
|
||||
AdvanceRank, ThreadMap_, AccessType_> {
|
||||
AdvanceRank, ThreadMap_, AccessType_, false> {
|
||||
public:
|
||||
static_assert(
|
||||
AdvanceRank == 0 || AdvanceRank == 1,
|
||||
@@ -1693,7 +1768,9 @@ class PredicatedTileAccessIterator<Shape_, Element_,
|
||||
/// ID of each participating thread
|
||||
int thread_id,
|
||||
/// Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset)
|
||||
TensorCoord const &threadblock_offset,
|
||||
int const *indices = nullptr ///< gather/scatter indices, note no support for gather/scatter at this specialization
|
||||
)
|
||||
: iterator_(params.params_, pointer,
|
||||
layout::PitchLinearCoord(extent.row() * kInterleavedK,
|
||||
extent.column() / kInterleavedK),
|
||||
@@ -1796,7 +1873,7 @@ template <typename Shape_, typename Element_, int AdvanceRank,
|
||||
typename ThreadMap_, typename AccessType_, int InterleavedK>
|
||||
class PredicatedTileAccessIterator<Shape_, Element_,
|
||||
layout::RowMajorInterleaved<InterleavedK>,
|
||||
AdvanceRank, ThreadMap_, AccessType_> {
|
||||
AdvanceRank, ThreadMap_, AccessType_, false> {
|
||||
public:
|
||||
static_assert(
|
||||
AdvanceRank == 0 || AdvanceRank == 1,
|
||||
@@ -1877,7 +1954,9 @@ class PredicatedTileAccessIterator<Shape_, Element_,
|
||||
/// ID of each participating thread
|
||||
int thread_id,
|
||||
/// Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset)
|
||||
TensorCoord const &threadblock_offset,
|
||||
int const *indices = nullptr ///< gather/scatter indices, note no support for gather/scatter at this specialization
|
||||
)
|
||||
: iterator_(params.params_, pointer,
|
||||
layout::PitchLinearCoord(extent.column() * kInterleavedK,
|
||||
extent.row() / kInterleavedK),
|
||||
|
||||
@@ -1,24 +1,30 @@
|
||||
/***************************************************************************************************
|
||||
* Copyright (c) 2017-2021, NVIDIA 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 the NVIDIA 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 NVIDIA CORPORATION 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
|
||||
* Copyright (c) 2017 - 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. 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.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder 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.
|
||||
*
|
||||
**************************************************************************************************/
|
||||
|
||||
@@ -1,24 +1,30 @@
|
||||
/***************************************************************************************************
|
||||
* Copyright (c) 2017-2021, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2017 - 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* 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 the NVIDIA CORPORATION nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 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 NVIDIA CORPORATION 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
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. 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.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder 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.
|
||||
*
|
||||
**************************************************************************************************/
|
||||
@@ -67,7 +73,17 @@ struct PredicatedTileAccessIteratorDesc {
|
||||
advance_rank(advance_rank_),
|
||||
threadblock_shape(threadblock_shape_),
|
||||
threadmap_iterations(threadmap_iterations_),
|
||||
threadmap_delta(threadmap_delta_) { }
|
||||
threadmap_delta(threadmap_delta_)
|
||||
{
|
||||
#if 0
|
||||
printf("PredicatedTileAccessIteratorDesc(%d, %d, {%d, %d}, {%d, %d}, {%d, %d}})\n",
|
||||
element_size_bits,
|
||||
advance_rank,
|
||||
threadblock_shape.contiguous(), threadblock_shape.strided(),
|
||||
threadmap_iterations.contiguous(), threadmap_iterations.strided(),
|
||||
threadmap_delta.contiguous(), threadmap_delta.strided());
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -118,8 +134,7 @@ struct MakePredicatedTileAccessIteratorDesc <
|
||||
PredicatedTileAccessIteratorDesc operator()() {
|
||||
|
||||
return UnderlyingMakeOperator()();
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -141,9 +156,9 @@ struct MakePredicatedTileAccessIteratorDesc <
|
||||
PredicatedTileAccessIteratorDesc operator()() {
|
||||
|
||||
return UnderlyingMakeOperator()();
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// Specialization of PredicatedTileAccessIterator for column-major interleaved data.
|
||||
@@ -164,9 +179,9 @@ struct MakePredicatedTileAccessIteratorDesc <
|
||||
PredicatedTileAccessIteratorDesc operator()() {
|
||||
|
||||
return UnderlyingMakeOperator()();
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// Specialization of PredicatedTileAccessIterator for roww-major interleaved data.
|
||||
@@ -187,9 +202,9 @@ struct MakePredicatedTileAccessIteratorDesc <
|
||||
PredicatedTileAccessIteratorDesc operator()() {
|
||||
|
||||
return UnderlyingMakeOperator()();
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//
|
||||
@@ -242,7 +257,6 @@ struct PredicatedTileAccessIteratorParams {
|
||||
desc.element_size_bits / 8;
|
||||
|
||||
return Status::kSuccess;
|
||||
|
||||
}
|
||||
|
||||
CUTLASS_HOST_DEVICE
|
||||
@@ -266,7 +280,6 @@ struct PredicatedTileAccessIteratorParams {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
} // namespace threadblock
|
||||
|
||||
@@ -0,0 +1,892 @@
|
||||
/***************************************************************************************************
|
||||
* Copyright (c) 2017 - 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. 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.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder 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.
|
||||
*
|
||||
**************************************************************************************************/
|
||||
/*! \file
|
||||
\brief Templates calculating the address and predicates to the load of tiles
|
||||
from pitch-linear rank=2 tensors.
|
||||
|
||||
This iterator uses masks to guard out-of-bounds accesses and visits the last
|
||||
"residue" tile first, with the objective of minimizing predicate mask updates
|
||||
during steady-state operation.
|
||||
|
||||
A precomputed "Params" object minimizes the amount of state that must be
|
||||
stored in registers, and integer addition is used to advance the pointer
|
||||
through memory.
|
||||
|
||||
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cutlass/blas3.h"
|
||||
#include "cutlass/layout/matrix.h"
|
||||
#include "cutlass/layout/pitch_linear.h"
|
||||
#include "cutlass/matrix_shape.h"
|
||||
#include "cutlass/predicate_vector.h"
|
||||
#include "cutlass/tensor_ref.h"
|
||||
#include "cutlass/tensor_view.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace cutlass {
|
||||
namespace transform {
|
||||
namespace threadblock {
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// PredicatedTileAccessIteratorTriangularMatrix
|
||||
///
|
||||
template <typename Shape, typename Element, typename Layout,
|
||||
int AdvanceRank, typename ThreadMap,
|
||||
SideMode kSideMode, FillMode kFillMode, DiagType kDiagType,
|
||||
typename AccessType>
|
||||
class PredicatedTileAccessIteratorTriangularMatrix;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// Specialization of PredicatedTileAccessIteratorTriangularMatrix for pitch-linear data.
|
||||
///
|
||||
template <typename Shape_, typename Element_, int AdvanceRank,
|
||||
typename ThreadMap_, SideMode kSideMode, FillMode kFillMode, DiagType kDiagType, typename AccessType_>
|
||||
class PredicatedTileAccessIteratorTriangularMatrix<Shape_, Element_, layout::PitchLinear,
|
||||
AdvanceRank, ThreadMap_, kSideMode, kFillMode, kDiagType, AccessType_> {
|
||||
public:
|
||||
static_assert(
|
||||
AdvanceRank == 0 || AdvanceRank == 1,
|
||||
"Specialization for pitch-linear iterator may along advance along the "
|
||||
"contiguous(rank=0) or strided(rank=1) dimension.");
|
||||
|
||||
using Shape = Shape_;
|
||||
using Element = Element_;
|
||||
using Layout = layout::PitchLinear;
|
||||
static int const kAdvanceRank = AdvanceRank;
|
||||
using ThreadMap = ThreadMap_;
|
||||
using AccessType = AccessType_;
|
||||
|
||||
using Index = typename Layout::Index;
|
||||
using LongIndex = typename Layout::LongIndex;
|
||||
using StrideIndex = typename Layout::Stride::Index;
|
||||
|
||||
using TensorRef = TensorRef<Element, Layout>;
|
||||
using TensorView = TensorView<Element, Layout>;
|
||||
using TensorCoord = typename Layout::TensorCoord;
|
||||
|
||||
using Pointer = Element *;
|
||||
using NonConstPointer = typename platform::remove_const<Element>::type *;
|
||||
|
||||
static int const kAccessesPerVector = ThreadMap::kElementsPerAccess / AccessType::kElements;
|
||||
|
||||
using CompareOp = typename TrMatrixCompareOp<kFillMode, kDiagType>::Type;
|
||||
|
||||
static_assert( kFillMode == FillMode::kFull ||
|
||||
((kFillMode == FillMode::kLower || kFillMode == FillMode::kUpper) && AccessType::kElements == 1),
|
||||
"BLAS3 iterator for the triangular/symmetric matrix must use AccessType::kElements as 1");
|
||||
|
||||
static_assert(!(ThreadMap::kElementsPerAccess % AccessType::kElements),
|
||||
"Vectors implied by the thread map must be divisible by the access type.");
|
||||
|
||||
static int const kPredicatesPerByte = 4;
|
||||
static int const kPredicatesPerWord = 4 * kPredicatesPerByte;
|
||||
|
||||
static int const kPredicateCount = ThreadMap::Iterations::kCount * kAccessesPerVector;
|
||||
|
||||
/// Number of 32b words containing predicates
|
||||
static int const kPredicateByteCount =
|
||||
(kPredicateCount + kPredicatesPerByte - 1) / kPredicatesPerByte;
|
||||
static int const kPredicateWordCount = (kPredicateByteCount + 3) / 4;
|
||||
|
||||
static unsigned const kPredicateMask = (1u << kPredicatesPerByte) - 1u;
|
||||
|
||||
static_assert(kPredicateWordCount <= 4, "Too many predicates.");
|
||||
|
||||
/// Predicate vector stores mask to guard accesses
|
||||
using Mask = Array<uint32_t, kPredicateWordCount>;
|
||||
|
||||
/// Parameters object is precomputed state and is host-constructible
|
||||
class Params {
|
||||
public:
|
||||
friend PredicatedTileAccessIteratorTriangularMatrix;
|
||||
|
||||
private:
|
||||
/// stride of pitch-linear layout (units of Element)
|
||||
StrideIndex stride_;
|
||||
/// (true) pitch-linear layout is mapped to row-major matrix
|
||||
/// (false) pitch-linear layout is mapped to column-major matrix
|
||||
bool is_row_major_;
|
||||
/// for vectorized access across the diagonal boundary guard condition is
|
||||
/// checked for the element on the boundary
|
||||
int access_diagonal_boundary_;
|
||||
/// amount (in byte) to increment pointer to move to next access along
|
||||
/// strided dimension
|
||||
LongIndex inc_strided_;
|
||||
/// amount (in byte) to increment pointer from last access to first access
|
||||
/// of next tile
|
||||
LongIndex inc_next_;
|
||||
/// amount (in byte) to increment pointer from first access of current tile
|
||||
/// to first access of next tile
|
||||
LongIndex inc_advance_;
|
||||
|
||||
public:
|
||||
|
||||
// Default ctor
|
||||
CUTLASS_HOST_DEVICE
|
||||
Params(): stride_(0), inc_strided_(0), inc_next_(0), inc_advance_(0), is_row_major_(false), access_diagonal_boundary_(0) { }
|
||||
|
||||
/// Construct the Params object given a pitch-linear tensor's layout
|
||||
CUTLASS_HOST_DEVICE
|
||||
Params(Layout const &layout, bool is_row_major, int access_diagonal_boundary) :
|
||||
stride_(layout.stride(0)), is_row_major_(is_row_major), access_diagonal_boundary_(access_diagonal_boundary) {
|
||||
|
||||
inc_strided_ = (LongIndex(stride_) * ThreadMap::Delta::kStrided) *
|
||||
sizeof_bits<Element>::value / 8;
|
||||
|
||||
if (kAdvanceRank) {
|
||||
// advance along strided dimension
|
||||
inc_advance_ =
|
||||
Shape::kStrided * LongIndex(stride_) * sizeof_bits<Element>::value / 8;
|
||||
} else {
|
||||
// advance along contiguous dimension
|
||||
inc_advance_ = Shape::kContiguous * sizeof_bits<Element>::value / 8;
|
||||
}
|
||||
|
||||
inc_next_ = inc_advance_ - LongIndex(ThreadMap::Iterations::kStrided - 1) *
|
||||
ThreadMap::Delta::kStrided * LongIndex(stride_) *
|
||||
sizeof_bits<Element>::value / 8;
|
||||
|
||||
};
|
||||
|
||||
|
||||
};
|
||||
|
||||
private:
|
||||
/// Internal pointer type permits fast address arithmetic
|
||||
using BytePointer = char *;
|
||||
|
||||
private:
|
||||
//
|
||||
// Data members
|
||||
//
|
||||
|
||||
/// Parameters object with precomputed internal state
|
||||
Params const ¶ms_;
|
||||
|
||||
/// Internal pointer to first access of tile
|
||||
BytePointer pointer_;
|
||||
|
||||
/// Guard predicates
|
||||
uint32_t predicates_[kPredicateWordCount];
|
||||
|
||||
/// Track global memory addresses on the diagonal
|
||||
/// To ignore imag part for diagonal elements of hermitian matrices
|
||||
uint32_t predicates_onDiag_[kPredicateWordCount];
|
||||
|
||||
/// Size of tensor
|
||||
TensorCoord extent_;
|
||||
|
||||
/// Initial offset for each thread
|
||||
TensorCoord thread_offset_;
|
||||
|
||||
/// Iteration along vectors implied by the thread map
|
||||
int iteration_vector_;
|
||||
|
||||
/// Iteration in the contiguous dimension
|
||||
int iteration_contiguous_;
|
||||
|
||||
/// Iteration in the strided dimension
|
||||
int iteration_strided_;
|
||||
|
||||
private:
|
||||
/// Computes predicates based on internally tracked per-thread offset.
|
||||
CUTLASS_DEVICE
|
||||
void compute_predicates_(
|
||||
/// Extent of the matrix window
|
||||
TensorCoord extent) {
|
||||
|
||||
CUTLASS_PRAGMA_UNROLL
|
||||
for (int i = 0; i < kPredicateWordCount; ++i) {
|
||||
predicates_[i] = 0u;
|
||||
predicates_onDiag_[i] = 0u;
|
||||
}
|
||||
|
||||
CompareOp compare_op;
|
||||
|
||||
CUTLASS_PRAGMA_UNROLL
|
||||
for (int access_idx = 0; access_idx < ThreadMap::Iterations::kCount * kAccessesPerVector; ++access_idx) {
|
||||
|
||||
int s = access_idx / (ThreadMap::Iterations::kContiguous * kAccessesPerVector);
|
||||
|
||||
int access_residual = access_idx % (ThreadMap::Iterations::kContiguous * kAccessesPerVector);
|
||||
|
||||
int c = access_residual / kAccessesPerVector;
|
||||
int v = access_residual % kAccessesPerVector;
|
||||
|
||||
TensorCoord iteration_coord(c * ThreadMap::Delta::kContiguous + v * AccessType::kElements,
|
||||
s * ThreadMap::Delta::kStrided);
|
||||
|
||||
TensorCoord coord = thread_offset_ + iteration_coord;
|
||||
|
||||
bool guard;
|
||||
bool onDiag = false;
|
||||
|
||||
guard = ((coord.strided() < extent.strided()) &&
|
||||
(coord.contiguous() < extent.contiguous()));
|
||||
|
||||
|
||||
// guard access on the wrong side of the triagular matrix diagonal
|
||||
if (kFillMode == FillMode::kLower || kFillMode == FillMode::kUpper) {
|
||||
coord += TensorCoord{params_.access_diagonal_boundary_, 0};
|
||||
|
||||
bool triagular_guard_row_major = compare_op(coord.strided(), coord.contiguous()) | !params_.is_row_major_;
|
||||
bool triagular_guard_col_major = compare_op(coord.contiguous(), coord.strided()) | params_.is_row_major_;
|
||||
|
||||
guard = guard && triagular_guard_row_major && triagular_guard_col_major;
|
||||
|
||||
if (kDiagType == DiagType::kUnit) {
|
||||
onDiag = (guard && coord.strided() == coord.contiguous()) ? true : false;
|
||||
}
|
||||
}
|
||||
|
||||
int pred_idx_onDiag = v + kAccessesPerVector * (c + ThreadMap::Iterations::kContiguous * s);
|
||||
int word_idx_onDiag = pred_idx_onDiag / kPredicatesPerWord;
|
||||
int residual_onDiag = pred_idx_onDiag % kPredicatesPerWord;
|
||||
int byte_idx_onDiag = residual_onDiag / kPredicatesPerByte;
|
||||
int bit_idx_onDiag = residual_onDiag % kPredicatesPerByte;
|
||||
|
||||
predicates_onDiag_[word_idx_onDiag] |= (unsigned(onDiag) << (byte_idx_onDiag * 8 + bit_idx_onDiag));
|
||||
|
||||
int pred_idx = v + kAccessesPerVector * (c + ThreadMap::Iterations::kContiguous * s);
|
||||
|
||||
int word_idx = pred_idx / kPredicatesPerWord;
|
||||
int residual = pred_idx % kPredicatesPerWord;
|
||||
int byte_idx = residual / kPredicatesPerByte;
|
||||
int bit_idx = residual % kPredicatesPerByte;
|
||||
|
||||
predicates_[word_idx] |= (unsigned(guard) << (byte_idx * 8 + bit_idx));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public:
|
||||
/// Constructs a TileIterator from its precomputed state, threadblock offset,
|
||||
/// and thread ID
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileAccessIteratorTriangularMatrix(
|
||||
/// Precomputed parameters object
|
||||
Params const ¶ms,
|
||||
/// Pointer to start of tensor
|
||||
Pointer pointer,
|
||||
/// Extent of tensor
|
||||
TensorCoord extent,
|
||||
/// ID of each participating thread
|
||||
int thread_id,
|
||||
/// Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset)
|
||||
: params_(params),
|
||||
pointer_(reinterpret_cast<BytePointer>(const_cast<NonConstPointer>(pointer))),
|
||||
extent_(extent) {
|
||||
|
||||
|
||||
// Per-thread offset in logical coordinates of tensor
|
||||
thread_offset_ = threadblock_offset + ThreadMap::initial_offset(thread_id);
|
||||
|
||||
// update internal pointers
|
||||
Layout layout(params_.stride_);
|
||||
add_pointer_offset(layout(thread_offset_));
|
||||
|
||||
compute_predicates_(extent_);
|
||||
|
||||
set_iteration_index(0);
|
||||
}
|
||||
|
||||
/// Construct a PredicatedTileAccessIteratorTriangularMatrix with zero threadblock offset
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileAccessIteratorTriangularMatrix(
|
||||
/// Precomputed parameters object
|
||||
Params const ¶ms,
|
||||
/// Pointer to start of tensor
|
||||
Pointer pointer,
|
||||
/// Extent of tensor
|
||||
TensorCoord extent,
|
||||
///< ID of each participating thread
|
||||
int thread_id)
|
||||
: PredicatedTileAccessIteratorTriangularMatrix(params, pointer, extent, thread_id,
|
||||
make_Coord(0, 0)) {}
|
||||
|
||||
/// Overrides the internal iteration index
|
||||
CUTLASS_HOST_DEVICE
|
||||
void set_iteration_index(int index) {
|
||||
|
||||
iteration_vector_ = index % kAccessesPerVector;
|
||||
int residual_access = index / kAccessesPerVector;
|
||||
|
||||
iteration_contiguous_ = residual_access % ThreadMap::Iterations::kContiguous;
|
||||
iteration_strided_ = residual_access / ThreadMap::Iterations::kContiguous;
|
||||
|
||||
}
|
||||
|
||||
/// Adds a pointer offset in units of Element
|
||||
CUTLASS_HOST_DEVICE
|
||||
void add_pointer_offset(LongIndex pointer_offset) {
|
||||
pointer_ += sizeof_bits<Element>::value * pointer_offset / 8;
|
||||
}
|
||||
|
||||
/// Advances an iterator along logical dimensions of matrix in units of whole tiles
|
||||
CUTLASS_DEVICE
|
||||
void add_tile_offset(TensorCoord const &tile_offset) {
|
||||
|
||||
if (kAdvanceRank) {
|
||||
pointer_ += params_.inc_advance_ * LongIndex(tile_offset.strided());
|
||||
pointer_ += Shape::kContiguous * tile_offset.contiguous();
|
||||
thread_offset_ += TensorCoord{0, Shape::kStrided * tile_offset.strided()};
|
||||
} else {
|
||||
pointer_ += params_.inc_advance_ * LongIndex(tile_offset.contiguous());
|
||||
pointer_ += Shape::kStrided * tile_offset.strided();
|
||||
thread_offset_ += TensorCoord{Shape::kContiguous * tile_offset.contiguous(), 0};
|
||||
}
|
||||
|
||||
compute_predicates_(extent_);
|
||||
}
|
||||
|
||||
/// Returns a pointer
|
||||
CUTLASS_HOST_DEVICE
|
||||
AccessType *get() const {
|
||||
return reinterpret_cast<AccessType *>(
|
||||
pointer_ +
|
||||
iteration_contiguous_ * (ThreadMap::Delta::kContiguous * sizeof_bits<Element>::value) / 8) + iteration_vector_;
|
||||
}
|
||||
|
||||
/// Increment and return an instance to self.
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileAccessIteratorTriangularMatrix &operator++() {
|
||||
|
||||
++iteration_vector_;
|
||||
if (iteration_vector_ < kAccessesPerVector) {
|
||||
return *this;
|
||||
}
|
||||
|
||||
iteration_vector_ = 0;
|
||||
++iteration_contiguous_;
|
||||
|
||||
if (iteration_contiguous_ < ThreadMap::Iterations::kContiguous) {
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Enter here only if (iteration_contiguous_ ==
|
||||
// ThreadMap::Iteration::kContiguous)
|
||||
iteration_contiguous_ = 0;
|
||||
++iteration_strided_;
|
||||
|
||||
if (iteration_strided_ < ThreadMap::Iterations::kStrided) {
|
||||
pointer_ += params_.inc_strided_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Enter here only if (iteration_stride_ == ThreadMap::Iteration::kStrided)
|
||||
// which means we enter the next tile.
|
||||
iteration_strided_ = 0;
|
||||
|
||||
// advance to next tile
|
||||
pointer_ += params_.inc_next_;
|
||||
|
||||
// now return to start tile - if the iterator is subsequently advanced, this
|
||||
// subtraction as well as the subsequent integer addition are both elided by
|
||||
// the compiler.
|
||||
pointer_ -= params_.inc_advance_;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Increment and return an instance to self.
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileAccessIteratorTriangularMatrix operator++(int) {
|
||||
PredicatedTileAccessIteratorTriangularMatrix self(*this);
|
||||
operator++();
|
||||
return self;
|
||||
}
|
||||
|
||||
/// Clears the predicate set efficiently
|
||||
CUTLASS_HOST_DEVICE
|
||||
void clear_mask(bool enable = true) {
|
||||
CUTLASS_PRAGMA_UNROLL
|
||||
for (int i = 0; i < kPredicateWordCount; ++i) {
|
||||
predicates_[i] = enable ? 0u : predicates_[i];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// Clears the predicate set efficiently
|
||||
CUTLASS_HOST_DEVICE
|
||||
void enable_mask() {
|
||||
CUTLASS_PRAGMA_UNROLL
|
||||
for (int i = 0; i < kPredicateWordCount; ++i) {
|
||||
predicates_[i] = 0xffffffff;
|
||||
}
|
||||
}
|
||||
|
||||
/// Sets the predicate mask, overriding value stored in predicate iterator
|
||||
CUTLASS_HOST_DEVICE
|
||||
void set_mask(Mask const &mask) {
|
||||
CUTLASS_PRAGMA_UNROLL
|
||||
for (int i = 0; i < kPredicateWordCount; ++i) {
|
||||
predicates_[i] = mask[i];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// Gets the mask
|
||||
CUTLASS_HOST_DEVICE
|
||||
void get_mask(Mask &mask) {
|
||||
CUTLASS_PRAGMA_UNROLL
|
||||
for (int i = 0; i < kPredicateWordCount; ++i) {
|
||||
mask[i] = predicates_[i];
|
||||
}
|
||||
}
|
||||
|
||||
/// Return if the address in on the diagonal
|
||||
CUTLASS_HOST_DEVICE
|
||||
bool getOnDiag() {
|
||||
int pred_idx =
|
||||
iteration_vector_ + kAccessesPerVector * (iteration_contiguous_ + iteration_strided_ * ThreadMap::Iterations::kContiguous);
|
||||
|
||||
int word_idx = pred_idx / kPredicatesPerWord;
|
||||
int residual = pred_idx % kPredicatesPerWord;
|
||||
int byte_idx = residual / kPredicatesPerByte;
|
||||
int bit_idx = residual % kPredicatesPerByte;
|
||||
|
||||
bool pred = (predicates_onDiag_[word_idx] & (1u << (byte_idx * 8 + bit_idx))) != 0;
|
||||
return pred;
|
||||
}
|
||||
|
||||
/// Returns whether access is valid or not
|
||||
CUTLASS_HOST_DEVICE
|
||||
bool valid() {
|
||||
|
||||
|
||||
int pred_idx =
|
||||
iteration_vector_ + kAccessesPerVector * (iteration_contiguous_ + iteration_strided_ * ThreadMap::Iterations::kContiguous);
|
||||
|
||||
int word_idx = pred_idx / kPredicatesPerWord;
|
||||
int residual = pred_idx % kPredicatesPerWord;
|
||||
int byte_idx = residual / kPredicatesPerByte;
|
||||
int bit_idx = residual % kPredicatesPerByte;
|
||||
|
||||
bool pred = (predicates_[word_idx] & (1u << (byte_idx * 8 + bit_idx))) != 0;
|
||||
return pred;
|
||||
|
||||
|
||||
//return true;
|
||||
}
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// Specialization of PredicatedTileAccessIteratorTriangularMatrix for column-major data.
|
||||
///
|
||||
/// Satisfies: ForwardTileIteratorConcept |
|
||||
/// ReadableContiguousTileIteratorConcept |
|
||||
/// WriteableContiguousTileIteratorConcept |
|
||||
/// MaskedTileIteratorConcept
|
||||
///
|
||||
template <typename Shape_, typename Element_, int AdvanceRank, typename ThreadMap_,
|
||||
SideMode kSideMode, FillMode kFillMode, DiagType kDiagType,
|
||||
typename AccessType_>
|
||||
class PredicatedTileAccessIteratorTriangularMatrix<Shape_, Element_, layout::ColumnMajor,
|
||||
AdvanceRank, ThreadMap_, kSideMode, kFillMode, kDiagType,
|
||||
AccessType_> {
|
||||
public:
|
||||
static_assert(
|
||||
AdvanceRank == 0 || AdvanceRank == 1,
|
||||
"Specialization for pitch-linear iterator may along advance along the "
|
||||
"contiguous(rank=0) or strided(rank=1) dimension.");
|
||||
|
||||
using Shape = Shape_;
|
||||
using Element = Element_;
|
||||
using Layout = layout::ColumnMajor;
|
||||
static int const kAdvanceRank = AdvanceRank;
|
||||
using ThreadMap = ThreadMap_;
|
||||
using AccessType = AccessType_;
|
||||
|
||||
using Index = typename Layout::Index;
|
||||
using LongIndex = typename Layout::LongIndex;
|
||||
|
||||
using TensorRef = TensorRef<Element, Layout>;
|
||||
using TensorView = TensorView<Element, Layout>;
|
||||
using TensorCoord = typename Layout::TensorCoord;
|
||||
|
||||
using Pointer = Element *;
|
||||
using NonConstPointer = typename platform::remove_const<Element>::type *;
|
||||
|
||||
using UnderlyingIterator = PredicatedTileAccessIteratorTriangularMatrix<
|
||||
layout::PitchLinearShape<Shape::kRow, Shape::kColumn>, Element,
|
||||
layout::PitchLinear, (kAdvanceRank == 0 ? 0 : 1), ThreadMap,
|
||||
kSideMode, kFillMode, kDiagType, AccessType>;
|
||||
|
||||
/// Predicate vector stores mask to guard accesses
|
||||
using Mask = typename UnderlyingIterator::Mask;
|
||||
|
||||
static int const kAccessesPerVector = UnderlyingIterator::kAccessesPerVector;
|
||||
|
||||
static int const kAccessDiagonalBoundary =
|
||||
(kFillMode == FillMode::kLower) ? (AccessType::kElements - 1) : 0;
|
||||
|
||||
/// Parameters object is precomputed state and is host-constructible
|
||||
class Params {
|
||||
private:
|
||||
friend PredicatedTileAccessIteratorTriangularMatrix;
|
||||
|
||||
/// Parameters object
|
||||
typename UnderlyingIterator::Params params_;
|
||||
|
||||
public:
|
||||
|
||||
/// Default ctor
|
||||
CUTLASS_HOST_DEVICE
|
||||
Params() { }
|
||||
|
||||
/// Construct the Params object given a pitch-linear tensor's layout
|
||||
CUTLASS_HOST_DEVICE
|
||||
Params(Layout const &layout)
|
||||
: params_(layout::PitchLinear(layout.stride(0)), false, kAccessDiagonalBoundary){};
|
||||
};
|
||||
|
||||
private:
|
||||
//
|
||||
// Data members
|
||||
//
|
||||
|
||||
/// Underlying pitch-linear tile iterator
|
||||
UnderlyingIterator iterator_;
|
||||
|
||||
public:
|
||||
/// Constructs a TileIterator from its precomputed state, threadblock offset,
|
||||
/// and thread ID
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileAccessIteratorTriangularMatrix(
|
||||
///< Precomputed parameters object
|
||||
Params const ¶ms,
|
||||
///< Pointer to start of tensor
|
||||
Pointer pointer,
|
||||
///< Extent of tensor
|
||||
TensorCoord extent,
|
||||
///< ID of each participating thread
|
||||
int thread_id,
|
||||
///< Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset)
|
||||
: iterator_(params.params_, pointer,
|
||||
layout::PitchLinearCoord(extent.row(), extent.column()),
|
||||
thread_id,
|
||||
layout::PitchLinearCoord(threadblock_offset.row(),
|
||||
threadblock_offset.column())) {}
|
||||
|
||||
/// Construct a PredicatedTileAccessIteratorTriangularMatrix with zero threadblock offset
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileAccessIteratorTriangularMatrix(
|
||||
Params const ¶ms, ///< Precomputed parameters object
|
||||
Pointer pointer, ///< Pointer to start of tensor
|
||||
TensorCoord extent, ///< Extent of tensor
|
||||
int thread_id ///< ID of each participating thread
|
||||
)
|
||||
: PredicatedTileAccessIteratorTriangularMatrix(params, pointer, extent, thread_id,
|
||||
make_Coord(0, 0)) {}
|
||||
|
||||
/// Overrides the internal iteration index
|
||||
CUTLASS_HOST_DEVICE
|
||||
void set_iteration_index(int index) { iterator_.set_iteration_index(index); }
|
||||
|
||||
/// Adds a pointer offset in units of Element
|
||||
CUTLASS_HOST_DEVICE
|
||||
void add_pointer_offset(LongIndex pointer_offset) {
|
||||
iterator_.add_pointer_offset(pointer_offset);
|
||||
}
|
||||
|
||||
/// Advances an iterator along logical dimensions of matrix in units of whole
|
||||
/// tiles
|
||||
CUTLASS_HOST_DEVICE
|
||||
void add_tile_offset(TensorCoord const &tile_offset) {
|
||||
iterator_.add_tile_offset({tile_offset.row(), tile_offset.column()});
|
||||
}
|
||||
|
||||
/// Returns a pointer
|
||||
CUTLASS_HOST_DEVICE
|
||||
AccessType *get() const {
|
||||
return reinterpret_cast<AccessType *>(iterator_.get());
|
||||
}
|
||||
|
||||
/// Advances to the next tile in memory.
|
||||
///
|
||||
/// The first time this method is called, predicates are updated, and the
|
||||
/// iterator's internal pointer is reverted to the first "steady state" tile.
|
||||
/// Subsequent calls are lightweight and must only update the internal
|
||||
/// pointer.
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileAccessIteratorTriangularMatrix &operator++() {
|
||||
++iterator_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Advances to the next tile in memory.
|
||||
///
|
||||
/// The first time this method is called, predicates are updated, and the
|
||||
/// iterator's internal pointer is reverted to the first "steady state" tile.
|
||||
/// Subsequent calls are lightweight and must only update the internal
|
||||
/// pointer.
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileAccessIteratorTriangularMatrix operator++(int) {
|
||||
PredicatedTileAccessIteratorTriangularMatrix self(*this);
|
||||
operator++();
|
||||
return self;
|
||||
}
|
||||
|
||||
/// Clears the predicate set efficiently
|
||||
CUTLASS_HOST_DEVICE
|
||||
void clear_mask(bool enable = true) { iterator_.clear_mask(enable); }
|
||||
|
||||
/// Clears the predicate set efficiently
|
||||
CUTLASS_HOST_DEVICE
|
||||
void enable_mask() { iterator_.enable_mask(); }
|
||||
|
||||
/// Sets the predicate mask, overriding value stored in predicate iterator
|
||||
CUTLASS_HOST_DEVICE
|
||||
void set_mask(Mask const &mask) { iterator_.set_mask(mask); }
|
||||
|
||||
/// Gets the mask
|
||||
CUTLASS_HOST_DEVICE
|
||||
void get_mask(Mask &mask) { iterator_.get_mask(mask); }
|
||||
|
||||
/// Return if the address in on the diagonal
|
||||
CUTLASS_HOST_DEVICE
|
||||
bool getOnDiag() {
|
||||
return iterator_.getOnDiag();
|
||||
}
|
||||
|
||||
/// Returns whether access is valid or not
|
||||
CUTLASS_HOST_DEVICE
|
||||
bool valid() {
|
||||
return iterator_.valid();
|
||||
}
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// Specialization of PredicatedTileAccessIteratorTriangularMatrix for row-major data.
|
||||
///
|
||||
/// Satisfies: ForwardTileIteratorConcept |
|
||||
/// ReadableContiguousTileIteratorConcept |
|
||||
/// WriteableContiguousTileIteratorConcept |
|
||||
/// MaskedTileIteratorConcept
|
||||
///
|
||||
template <typename Shape_, typename Element_, int AdvanceRank, typename ThreadMap_,
|
||||
SideMode kSideMode, FillMode kFillMode, DiagType kDiagType,
|
||||
typename AccessType_>
|
||||
class PredicatedTileAccessIteratorTriangularMatrix<Shape_, Element_, layout::RowMajor, AdvanceRank, ThreadMap_,
|
||||
kSideMode, kFillMode, kDiagType, AccessType_> {
|
||||
public:
|
||||
static_assert(
|
||||
AdvanceRank == 0 || AdvanceRank == 1,
|
||||
"Specialization for pitch-linear iterator may along advance along the "
|
||||
"contiguous(rank=0) or strided(rank=1) dimension.");
|
||||
|
||||
using Shape = Shape_;
|
||||
using Element = Element_;
|
||||
using Layout = layout::RowMajor;
|
||||
static int const kAdvanceRank = AdvanceRank;
|
||||
using ThreadMap = ThreadMap_;
|
||||
using AccessType = AccessType_;
|
||||
|
||||
using Index = typename Layout::Index;
|
||||
using LongIndex = typename Layout::LongIndex;
|
||||
|
||||
using TensorRef = TensorRef<Element, Layout>;
|
||||
using TensorView = TensorView<Element, Layout>;
|
||||
using TensorCoord = typename Layout::TensorCoord;
|
||||
|
||||
using Pointer = Element *;
|
||||
using NonConstPointer = typename platform::remove_const<Element>::type *;
|
||||
|
||||
using UnderlyingIterator = PredicatedTileAccessIteratorTriangularMatrix<
|
||||
layout::PitchLinearShape<Shape::kColumn, Shape::kRow>, Element,
|
||||
layout::PitchLinear, (kAdvanceRank == 0 ? 1 : 0), ThreadMap,
|
||||
kSideMode, kFillMode, kDiagType, AccessType>;
|
||||
|
||||
static int const kAccessesPerVector = UnderlyingIterator::kAccessesPerVector;
|
||||
|
||||
static int const kAccessDiagonalBoundary =
|
||||
(kFillMode == FillMode::kUpper) ? (AccessType::kElements - 1) : 0;
|
||||
|
||||
/// Predicate vector stores mask to guard accesses
|
||||
using Mask = typename UnderlyingIterator::Mask;
|
||||
|
||||
/// Parameters object is precomputed state and is host-constructible
|
||||
class Params {
|
||||
private:
|
||||
friend PredicatedTileAccessIteratorTriangularMatrix;
|
||||
|
||||
/// Parameters object
|
||||
typename UnderlyingIterator::Params params_;
|
||||
|
||||
public:
|
||||
|
||||
/// Default ctor
|
||||
CUTLASS_HOST_DEVICE
|
||||
Params() { }
|
||||
|
||||
/// Construct the Params object given a pitch-linear tensor's layout
|
||||
CUTLASS_HOST_DEVICE
|
||||
Params(Layout const &layout)
|
||||
: params_(layout::PitchLinear(layout.stride(0)), true, kAccessDiagonalBoundary){};
|
||||
};
|
||||
|
||||
private:
|
||||
//
|
||||
// Data members
|
||||
//
|
||||
|
||||
/// Underlying pitch-linear tile iterator
|
||||
UnderlyingIterator iterator_;
|
||||
|
||||
public:
|
||||
/// Constructs a TileIterator from its precomputed state, threadblock offset,
|
||||
/// and thread ID
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileAccessIteratorTriangularMatrix(
|
||||
///< Precomputed parameters object
|
||||
Params const ¶ms,
|
||||
///< Pointer to start of tensor
|
||||
Pointer pointer,
|
||||
///< Extent of tensor
|
||||
TensorCoord extent,
|
||||
///< ID of each participating thread
|
||||
int thread_id,
|
||||
///< Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset)
|
||||
: iterator_(params.params_, pointer,
|
||||
layout::PitchLinearCoord(extent.column(), extent.row()),
|
||||
thread_id,
|
||||
layout::PitchLinearCoord(threadblock_offset.column(),
|
||||
threadblock_offset.row())) {}
|
||||
|
||||
/// Construct a PredicatedTileAccessIteratorTriangularMatrix with zero threadblock offset
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileAccessIteratorTriangularMatrix(
|
||||
Params const ¶ms, ///< Precomputed parameters object
|
||||
Pointer pointer, ///< Pointer to start of tensor
|
||||
TensorCoord extent, ///< Extent of tensor
|
||||
int thread_id ///< ID of each participating thread
|
||||
)
|
||||
: PredicatedTileAccessIteratorTriangularMatrix(params, pointer, extent, thread_id,
|
||||
make_Coord(0, 0)) {}
|
||||
|
||||
/// Overrides the internal iteration index
|
||||
CUTLASS_HOST_DEVICE
|
||||
void set_iteration_index(int index) { iterator_.set_iteration_index(index); }
|
||||
|
||||
/// Adds a pointer offset in units of Element
|
||||
CUTLASS_HOST_DEVICE
|
||||
void add_pointer_offset(LongIndex pointer_offset) {
|
||||
iterator_.add_pointer_offset(pointer_offset);
|
||||
}
|
||||
|
||||
/// Advances an iterator along logical dimensions of matrix in units of whole
|
||||
/// tiles
|
||||
CUTLASS_HOST_DEVICE
|
||||
void add_tile_offset(TensorCoord const &tile_offset) {
|
||||
iterator_.add_tile_offset({tile_offset.column(), tile_offset.row()});
|
||||
}
|
||||
|
||||
/// Returns a pointer
|
||||
CUTLASS_HOST_DEVICE
|
||||
AccessType *get() const {
|
||||
return reinterpret_cast<AccessType *>(iterator_.get());
|
||||
}
|
||||
|
||||
/// Advances to the next tile in memory.
|
||||
///
|
||||
/// The first time this method is called, predicates are updated, and the
|
||||
/// iterator's internal pointer is reverted to the first "steady state" tile.
|
||||
/// Subsequent calls are lightweight and must only update the internal
|
||||
/// pointer.
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileAccessIteratorTriangularMatrix &operator++() {
|
||||
++iterator_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Advances to the next tile in memory.
|
||||
///
|
||||
/// The first time this method is called, predicates are updated, and the
|
||||
/// iterator's internal pointer is reverted to the first "steady state" tile.
|
||||
/// Subsequent calls are lightweight and must only update the internal
|
||||
/// pointer.
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileAccessIteratorTriangularMatrix operator++(int) {
|
||||
PredicatedTileAccessIteratorTriangularMatrix self(*this);
|
||||
operator++();
|
||||
return self;
|
||||
}
|
||||
|
||||
/// Clears the predicate set efficiently
|
||||
CUTLASS_HOST_DEVICE
|
||||
void clear_mask(bool enable = true) { iterator_.clear_mask(enable); }
|
||||
|
||||
/// Clears the predicate set efficiently
|
||||
CUTLASS_HOST_DEVICE
|
||||
void enable_mask() { iterator_.enable_mask(); }
|
||||
|
||||
/// Sets the predicate mask, overriding value stored in predicate iterator
|
||||
CUTLASS_HOST_DEVICE
|
||||
void set_mask(Mask const &mask) { iterator_.set_mask(mask); }
|
||||
|
||||
/// Gets the mask
|
||||
CUTLASS_HOST_DEVICE
|
||||
void get_mask(Mask &mask) { iterator_.get_mask(mask); }
|
||||
|
||||
/// Return if the address in on the diagonal
|
||||
CUTLASS_HOST_DEVICE
|
||||
bool getOnDiag() {
|
||||
return iterator_.getOnDiag();
|
||||
}
|
||||
|
||||
/// Returns whether access is valid or not
|
||||
CUTLASS_HOST_DEVICE
|
||||
bool valid() {
|
||||
return iterator_.valid();
|
||||
}
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
} // namespace threadblock
|
||||
} // namespace transform
|
||||
} // namespace cutlass
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -1,24 +1,30 @@
|
||||
/***************************************************************************************************
|
||||
* Copyright (c) 2017-2021, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2017 - 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* 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 the NVIDIA CORPORATION nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 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 NVIDIA CORPORATION 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
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. 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.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder 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.
|
||||
*
|
||||
**************************************************************************************************/
|
||||
@@ -130,7 +136,8 @@ template <
|
||||
typename Layout,
|
||||
int AdvanceRank,
|
||||
typename ThreadMap,
|
||||
int AccessSize = ThreadMap::kElementsPerAccess
|
||||
int AccessSize = ThreadMap::kElementsPerAccess,
|
||||
bool Gather = false
|
||||
>
|
||||
class PredicatedTileIterator;
|
||||
|
||||
@@ -144,9 +151,9 @@ class PredicatedTileIterator;
|
||||
/// MaskedTileIteratorConcept
|
||||
///
|
||||
template <typename Shape_, typename Element_, int AdvanceRank,
|
||||
typename ThreadMap_, int AccessSize>
|
||||
typename ThreadMap_, int AccessSize, bool Gather>
|
||||
class PredicatedTileIterator<Shape_, Element_, layout::PitchLinear, AdvanceRank,
|
||||
ThreadMap_, AccessSize> {
|
||||
ThreadMap_, AccessSize, Gather> {
|
||||
public:
|
||||
static_assert(
|
||||
AdvanceRank == 0 || AdvanceRank == 1,
|
||||
@@ -175,7 +182,7 @@ class PredicatedTileIterator<Shape_, Element_, layout::PitchLinear, AdvanceRank,
|
||||
/// Underlying iterator to compute the addresses
|
||||
using TileAccessIterator =
|
||||
PredicatedTileAccessIterator<Shape, Element, Layout, kAdvanceRank,
|
||||
ThreadMap, AccessType>;
|
||||
ThreadMap, AccessType, Gather>;
|
||||
|
||||
static int const kAccessesPerVector = TileAccessIterator::kAccessesPerVector;
|
||||
|
||||
@@ -236,9 +243,11 @@ class PredicatedTileIterator<Shape_, Element_, layout::PitchLinear, AdvanceRank,
|
||||
/// ID of each participating thread
|
||||
int thread_id,
|
||||
/// Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset)
|
||||
TensorCoord const &threadblock_offset,
|
||||
/// Gather indices
|
||||
int const *indices = nullptr)
|
||||
: address_iterator_(params.params_, pointer, extent, thread_id,
|
||||
threadblock_offset) {}
|
||||
threadblock_offset, indices) {}
|
||||
|
||||
/// Construct a PredicatedTileIterator with zero threadblock offset
|
||||
CUTLASS_HOST_DEVICE
|
||||
@@ -394,9 +403,10 @@ template <
|
||||
typename Element_,
|
||||
int AdvanceRank,
|
||||
typename ThreadMap_,
|
||||
int AccessSize
|
||||
int AccessSize,
|
||||
bool Gather
|
||||
>
|
||||
class PredicatedTileIterator<Shape_, Element_, layout::ColumnMajor, AdvanceRank, ThreadMap_, AccessSize> {
|
||||
class PredicatedTileIterator<Shape_, Element_, layout::ColumnMajor, AdvanceRank, ThreadMap_, AccessSize, Gather> {
|
||||
public:
|
||||
|
||||
static_assert(AdvanceRank == 0 || AdvanceRank == 1,
|
||||
@@ -425,7 +435,8 @@ public:
|
||||
layout::PitchLinear,
|
||||
(kAdvanceRank == 0 ? 0 : 1),
|
||||
ThreadMap,
|
||||
AccessSize
|
||||
AccessSize,
|
||||
Gather
|
||||
>;
|
||||
|
||||
using AccessType = typename UnderlyingIterator::AccessType;
|
||||
@@ -480,15 +491,17 @@ public:
|
||||
Pointer pointer, ///< Pointer to start of tensor
|
||||
TensorCoord extent, ///< Extent of tensor
|
||||
int thread_id, ///< ID of each participating thread
|
||||
TensorCoord const &threadblock_offset ///< Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset, ///< Initial offset of threadblock
|
||||
int const *indices = nullptr ///< gather/scatter indices, note no support for gather/scatter at this specialization
|
||||
):
|
||||
iterator_(
|
||||
params.params_,
|
||||
pointer,
|
||||
layout::PitchLinearCoord(extent.row(), extent.column()),
|
||||
thread_id,
|
||||
layout::PitchLinearCoord(threadblock_offset.row(), threadblock_offset.column())
|
||||
) { }
|
||||
layout::PitchLinearCoord(threadblock_offset.row(), threadblock_offset.column()),
|
||||
indices)
|
||||
{ }
|
||||
|
||||
/// Construct a PredicatedTileIterator with zero threadblock offset
|
||||
CUTLASS_HOST_DEVICE
|
||||
@@ -603,9 +616,10 @@ template <
|
||||
typename Element_,
|
||||
int AdvanceRank,
|
||||
typename ThreadMap_,
|
||||
int AccessSize
|
||||
int AccessSize,
|
||||
bool Gather
|
||||
>
|
||||
class PredicatedTileIterator<Shape_, Element_, layout::RowMajor, AdvanceRank, ThreadMap_, AccessSize> {
|
||||
class PredicatedTileIterator<Shape_, Element_, layout::RowMajor, AdvanceRank, ThreadMap_, AccessSize, Gather> {
|
||||
public:
|
||||
|
||||
static_assert(AdvanceRank == 0 || AdvanceRank == 1,
|
||||
@@ -634,7 +648,8 @@ public:
|
||||
layout::PitchLinear,
|
||||
(kAdvanceRank == 0 ? 1 : 0),
|
||||
ThreadMap,
|
||||
AccessSize
|
||||
AccessSize,
|
||||
Gather
|
||||
>;
|
||||
|
||||
using AccessType = typename UnderlyingIterator::AccessType;
|
||||
@@ -669,7 +684,6 @@ public:
|
||||
|
||||
};
|
||||
|
||||
|
||||
private:
|
||||
|
||||
//
|
||||
@@ -688,14 +702,16 @@ public:
|
||||
Pointer pointer, ///< Pointer to start of tensor
|
||||
TensorCoord extent, ///< Extent of tensor
|
||||
int thread_id, ///< ID of each participating thread
|
||||
TensorCoord const &threadblock_offset ///< Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset, ///< Initial offset of threadblock
|
||||
int const *indices = nullptr ///< Gather indices
|
||||
):
|
||||
iterator_(
|
||||
params.params_,
|
||||
pointer,
|
||||
layout::PitchLinearCoord(extent.column(), extent.row()),
|
||||
thread_id,
|
||||
layout::PitchLinearCoord(threadblock_offset.column(), threadblock_offset.row())
|
||||
layout::PitchLinearCoord(threadblock_offset.column(), threadblock_offset.row()),
|
||||
indices
|
||||
) { }
|
||||
|
||||
/// Construct a PredicatedTileIterator with zero threadblock offset
|
||||
@@ -809,7 +825,7 @@ public:
|
||||
template <typename Shape_, typename Element_, int AdvanceRank,
|
||||
typename ThreadMap_, int AccessSize>
|
||||
class PredicatedTileIterator<Shape_, Element_, layout::AffineRankN<2>, AdvanceRank,
|
||||
ThreadMap_, AccessSize> {
|
||||
ThreadMap_, AccessSize, false> {
|
||||
public:
|
||||
static_assert(
|
||||
AdvanceRank == 0 || AdvanceRank == 1,
|
||||
@@ -894,7 +910,9 @@ class PredicatedTileIterator<Shape_, Element_, layout::AffineRankN<2>, AdvanceRa
|
||||
/// ID of each participating thread
|
||||
int thread_id,
|
||||
/// Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset)
|
||||
TensorCoord const &threadblock_offset,
|
||||
int const *indices = nullptr ///< gather/scatter indices, note no support for gather/scatter at this specialization
|
||||
)
|
||||
: address_iterator_(params.params_, pointer, extent, thread_id,
|
||||
threadblock_offset) {}
|
||||
|
||||
@@ -1054,7 +1072,7 @@ template <
|
||||
typename ThreadMap_,
|
||||
int AccessSize
|
||||
>
|
||||
class PredicatedTileIterator<Shape_, Element_, layout::AffineRank2ColumnMajor, AdvanceRank, ThreadMap_, AccessSize> {
|
||||
class PredicatedTileIterator<Shape_, Element_, layout::AffineRank2ColumnMajor, AdvanceRank, ThreadMap_, AccessSize, false> {
|
||||
public:
|
||||
|
||||
static_assert(AdvanceRank == 0 || AdvanceRank == 1,
|
||||
@@ -1134,7 +1152,8 @@ public:
|
||||
Pointer pointer, ///< Pointer to start of tensor
|
||||
TensorCoord extent, ///< Extent of tensor
|
||||
int thread_id, ///< ID of each participating thread
|
||||
TensorCoord const &threadblock_offset ///< Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset, ///< Initial offset of threadblock
|
||||
int const *indices = nullptr ///< gather/scatter indices, note no support for gather/scatter at this specialization
|
||||
):
|
||||
iterator_(
|
||||
params.params_,
|
||||
@@ -1259,7 +1278,7 @@ template <
|
||||
typename ThreadMap_,
|
||||
int AccessSize
|
||||
>
|
||||
class PredicatedTileIterator<Shape_, Element_, layout::AffineRank2RowMajor, AdvanceRank, ThreadMap_, AccessSize> {
|
||||
class PredicatedTileIterator<Shape_, Element_, layout::AffineRank2RowMajor, AdvanceRank, ThreadMap_, AccessSize, false> {
|
||||
public:
|
||||
|
||||
static_assert(AdvanceRank == 0 || AdvanceRank == 1,
|
||||
@@ -1338,7 +1357,8 @@ public:
|
||||
Pointer pointer, ///< Pointer to start of tensor
|
||||
TensorCoord extent, ///< Extent of tensor
|
||||
int thread_id, ///< ID of each participating thread
|
||||
TensorCoord const &threadblock_offset ///< Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset, ///< Initial offset of threadblock
|
||||
int const *indices = nullptr ///< gather/scatter indices, note no support for gather/scatter at this specialization
|
||||
):
|
||||
iterator_(
|
||||
params.params_,
|
||||
@@ -1449,7 +1469,6 @@ public:
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/// Specialization of PredicatedTileIterator for interleaved data. It is mapped
|
||||
/// to the congruous layout.
|
||||
///
|
||||
@@ -1463,7 +1482,7 @@ template <typename Shape_, typename Element_, int AdvanceRank,
|
||||
typename ThreadMap_, int AccessSize, int InterleavedK>
|
||||
class PredicatedTileIterator<Shape_, Element_,
|
||||
layout::ColumnMajorInterleaved<InterleavedK>,
|
||||
AdvanceRank, ThreadMap_, AccessSize> {
|
||||
AdvanceRank, ThreadMap_, AccessSize, false> {
|
||||
public:
|
||||
static_assert(
|
||||
AdvanceRank == 0 || AdvanceRank == 1,
|
||||
@@ -1547,7 +1566,9 @@ class PredicatedTileIterator<Shape_, Element_,
|
||||
/// ID of each participating thread
|
||||
int thread_id,
|
||||
/// Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset)
|
||||
TensorCoord const &threadblock_offset,
|
||||
int const *indices = nullptr ///< gather/scatter indices, note no support for gather/scatter at this specialization
|
||||
)
|
||||
: iterator_(params.params_, pointer,
|
||||
layout::PitchLinearCoord(extent.row() * kInterleavedK,
|
||||
extent.column() / kInterleavedK),
|
||||
@@ -1649,7 +1670,7 @@ template <typename Shape_, typename Element_, int AdvanceRank,
|
||||
typename ThreadMap_, int AccessSize, int InterleavedK>
|
||||
class PredicatedTileIterator<Shape_, Element_,
|
||||
layout::RowMajorInterleaved<InterleavedK>,
|
||||
AdvanceRank, ThreadMap_, AccessSize> {
|
||||
AdvanceRank, ThreadMap_, AccessSize, false> {
|
||||
public:
|
||||
static_assert(
|
||||
AdvanceRank == 0 || AdvanceRank == 1,
|
||||
@@ -1732,7 +1753,9 @@ class PredicatedTileIterator<Shape_, Element_,
|
||||
/// ID of each participating thread
|
||||
int thread_id,
|
||||
/// Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset)
|
||||
TensorCoord const &threadblock_offset,
|
||||
int const *indices = nullptr ///< gather/scatter indices, note no support for gather/scatter at this specialization
|
||||
)
|
||||
: iterator_(params.params_, pointer,
|
||||
layout::PitchLinearCoord(extent.column() * kInterleavedK,
|
||||
extent.row() / kInterleavedK),
|
||||
|
||||
@@ -1,24 +1,30 @@
|
||||
/***************************************************************************************************
|
||||
* Copyright (c) 2017-2021, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2017 - 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* 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 the NVIDIA CORPORATION nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 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 NVIDIA CORPORATION 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
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. 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.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder 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.
|
||||
*
|
||||
**************************************************************************************************/
|
||||
@@ -241,7 +247,9 @@ class PredicatedTileIterator2dThreadTile<Shape_, Element_, layout::PitchLinear,
|
||||
/// ID of each participating thread
|
||||
int thread_id,
|
||||
/// Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset)
|
||||
TensorCoord const &threadblock_offset,
|
||||
int const *indices = nullptr ///< gather/scatter indices, note no support for gather/scatter at this specialization
|
||||
)
|
||||
: address_iterator_(params.params_, pointer, extent, thread_id,
|
||||
threadblock_offset) {}
|
||||
|
||||
@@ -475,7 +483,8 @@ public:
|
||||
Pointer pointer, ///< Pointer to start of tensor
|
||||
TensorCoord extent, ///< Extent of tensor
|
||||
int thread_id, ///< ID of each participating thread
|
||||
TensorCoord const &threadblock_offset ///< Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset, ///< Initial offset of threadblock
|
||||
int const *indices = nullptr ///< gather/scatter indices, note no support for gather/scatter at this specialization
|
||||
):
|
||||
iterator_(
|
||||
params.params_,
|
||||
@@ -671,7 +680,8 @@ public:
|
||||
Pointer pointer, ///< Pointer to start of tensor
|
||||
TensorCoord extent, ///< Extent of tensor
|
||||
int thread_id, ///< ID of each participating thread
|
||||
TensorCoord const &threadblock_offset ///< Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset, ///< Initial offset of threadblock
|
||||
int const *indices = nullptr ///< gather/scatter indices, note no support for gather/scatter at this specialization
|
||||
):
|
||||
iterator_(
|
||||
params.params_,
|
||||
|
||||
@@ -0,0 +1,818 @@
|
||||
/***************************************************************************************************
|
||||
* Copyright (c) 2017 - 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. 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.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder 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.
|
||||
*
|
||||
**************************************************************************************************/
|
||||
/*! \file
|
||||
\brief Templates implementing loading of tiles from pitch-linear rank=2 tensors.
|
||||
|
||||
This iterator uses masks to guard out-of-bounds accesses and visits the last "residue" tile
|
||||
first, with the objective of minimizing predicate mask updates during steady-state operation.
|
||||
|
||||
A precomputed "Params" object minimizes the amount of state that must be stored in registers,
|
||||
and integer addition is used to advance the pointer through memory.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cutlass/arch/memory.h"
|
||||
#include "cutlass/transform/threadblock/predicated_tile_access_iterator_triangular_matrix.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace cutlass {
|
||||
namespace transform {
|
||||
namespace threadblock {
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// PredicatedTileIteratorTriangularMatrix
|
||||
///
|
||||
/// Satisfies: ForwardTileIteratorConcept |
|
||||
/// ReadableContiguousTileIteratorConcept |
|
||||
/// WriteableContiguousTileIteratorConcept |
|
||||
/// MaskedTileIteratorConcept
|
||||
///
|
||||
/// Regular tile iterator using a precomputed control structure to minimize register liveness
|
||||
/// and integer arithmetic.
|
||||
///
|
||||
/// Layout is assumed to be invariant at the time the precomputed "Params" object is constructed.
|
||||
///
|
||||
/// Base pointer and tensor extents may be specified at the time the iterator is constructed.
|
||||
/// Subsequently, they are assumed to be immutable.
|
||||
///
|
||||
/// Adding a logical coordinate offset may be performed at the time the iterator is constructed.
|
||||
/// Subsequent additions to logical coordinate offset may be performed but are relatively expensive.
|
||||
///
|
||||
/// Vistitation order is intended to first visit a "residual" tile that may be partially full in
|
||||
/// both the advance dimension and the steady-state dimension. This is assumed to be the last
|
||||
/// tile in the iteration sequence. Advancing an iterator that has just been constructed moves to
|
||||
/// the first tile that is full in the advance dimension and recomputes predicates. Subsequent
|
||||
/// accesses may be performed without updating internal predicates and are efficient in terms of
|
||||
/// live register state and pointer arithmetic instructions.
|
||||
///
|
||||
/// To be efficient, this assumes the iteraor will be dereferenced and advanced at least once
|
||||
/// outside any looping structure to minimize integer arithmetic.
|
||||
///
|
||||
/// Acceses out of bounds are safe so long as `clear_mask()` is called prior to dereferencing
|
||||
/// the iterator.
|
||||
///
|
||||
///
|
||||
/// Example:
|
||||
///
|
||||
/// An efficient pipeline structure may be constructed as follows:
|
||||
///
|
||||
// template <typename Iterator>
|
||||
// __global__ void kernel(
|
||||
// typename Iterator::Params params,
|
||||
// typename Iterator::Element *ptr,
|
||||
// TensorCoord extent) {
|
||||
//
|
||||
// typename Iterator::Fragment fragment;
|
||||
//
|
||||
// TensorCoord threadblock_offset(0, 0);
|
||||
//
|
||||
// Iterator iter(params, ptr, extent, threadIdx.x, threadblock_offsets);
|
||||
//
|
||||
//
|
||||
// fragment = *iter; // load "residue" tile first
|
||||
// ++iter; // advance to first "steady state" tile and update internal masks
|
||||
//
|
||||
//
|
||||
// #pragma unroll
|
||||
// for (int i = Remaining - 1; i >= 0; --i) {
|
||||
//
|
||||
// f(fragment);
|
||||
//
|
||||
// if (!i) {
|
||||
// iter.clear_mask(); // light-weight operation to clear masks - subsequent loads become NO-OPs.
|
||||
// }
|
||||
//
|
||||
// fragment = *iter; // load tile during "steady state" phase
|
||||
// ++iter; // advance to next tile - lightweight due to steady-state masks
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// void host(TensorView<Element, 2, layout::PitchLinear> view) {
|
||||
//
|
||||
// using Iterator = transform::threadblock::PredicatedTileIteratorTriangularMatrix;
|
||||
//
|
||||
// typename Iterator::Params params(view.layout());
|
||||
//
|
||||
// kernel<Iterator>(params, view.data());
|
||||
// }
|
||||
///
|
||||
///
|
||||
template <
|
||||
typename Shape,
|
||||
typename Element,
|
||||
typename Layout,
|
||||
int AdvanceRank,
|
||||
typename ThreadMap,
|
||||
SideMode kSideMode,
|
||||
FillMode kFillMode,
|
||||
DiagType kDiagType,
|
||||
int AccessSize = ThreadMap::kElementsPerAccess
|
||||
>
|
||||
class PredicatedTileIteratorTriangularMatrix;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// Specialization of PredicatedTileIteratorTriangularMatrix for pitch-linear data.
|
||||
///
|
||||
/// Satisfies: ForwardTileIteratorConcept |
|
||||
/// ReadableContiguousTileIteratorConcept |
|
||||
/// WriteableContiguousTileIteratorConcept |
|
||||
/// MaskedTileIteratorConcept
|
||||
///
|
||||
template <typename Shape_, typename Element_, int AdvanceRank, typename ThreadMap_,
|
||||
SideMode kSideMode, FillMode kFillMode, DiagType kDiagType,
|
||||
int AccessSize>
|
||||
class PredicatedTileIteratorTriangularMatrix<Shape_, Element_, layout::PitchLinear, AdvanceRank, ThreadMap_,
|
||||
kSideMode, kFillMode, kDiagType,
|
||||
AccessSize> {
|
||||
public:
|
||||
static_assert(
|
||||
AdvanceRank == 0 || AdvanceRank == 1,
|
||||
"Specialization for pitch-linear iterator may along advance along the "
|
||||
"contiguous(rank=0) or strided(rank=1) dimension.");
|
||||
|
||||
using Shape = Shape_;
|
||||
using Element = Element_;
|
||||
using Layout = layout::PitchLinear;
|
||||
static int const kAdvanceRank = AdvanceRank;
|
||||
using ThreadMap = ThreadMap_;
|
||||
|
||||
using Index = typename Layout::Index;
|
||||
using LongIndex = typename Layout::LongIndex;
|
||||
|
||||
using TensorRef = TensorRef<Element, Layout>;
|
||||
using TensorView = TensorView<Element, Layout>;
|
||||
using TensorCoord = typename Layout::TensorCoord;
|
||||
|
||||
using Pointer = Element *;
|
||||
using NonConstPointer = typename platform::remove_const<Element>::type *;
|
||||
|
||||
/// Type used for internal memory accesses
|
||||
using AccessType = AlignedArray<Element, AccessSize, (AccessSize * sizeof_bits<Element>::value / 8)>;
|
||||
|
||||
/// Underlying iterator to compute the addresses
|
||||
using TileAccessIterator =
|
||||
PredicatedTileAccessIteratorTriangularMatrix<Shape, Element, Layout, kAdvanceRank,
|
||||
ThreadMap, kSideMode, kFillMode, kDiagType, AccessType>;
|
||||
|
||||
static int const kAccessesPerVector = TileAccessIterator::kAccessesPerVector;
|
||||
|
||||
/// Fragment object to be loaded or stored
|
||||
using Fragment = cutlass::Array<Element, ThreadMap::Iterations::kCount *
|
||||
ThreadMap::kElementsPerAccess>;
|
||||
|
||||
/// Predicate vector stores mask to guard accesses
|
||||
using Mask = typename TileAccessIterator::Mask;
|
||||
|
||||
/// Parameters object is precomputed state and is host-constructible
|
||||
class Params {
|
||||
public:
|
||||
friend PredicatedTileIteratorTriangularMatrix;
|
||||
|
||||
private:
|
||||
/// Parameters object
|
||||
typename TileAccessIterator::Params params_;
|
||||
|
||||
public:
|
||||
/// Construct the Params object given a pitch-linear tensor's layout
|
||||
CUTLASS_HOST_DEVICE
|
||||
Params(Layout const &layout) : params_(layout) { }
|
||||
|
||||
CUTLASS_HOST_DEVICE
|
||||
Params() { }
|
||||
};
|
||||
|
||||
private:
|
||||
/// Internal pointer type permits fast address arithmetic
|
||||
using BytePointer = char *;
|
||||
|
||||
private:
|
||||
//
|
||||
// Data members
|
||||
//
|
||||
|
||||
/// Data member to the tile access iterator
|
||||
TileAccessIterator address_iterator_;
|
||||
|
||||
public:
|
||||
/// Constructs a TileIterator from its precomputed state, threadblock offset,
|
||||
/// and thread ID
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileIteratorTriangularMatrix(
|
||||
/// Precomputed parameters object
|
||||
Params const ¶ms,
|
||||
/// Pointer to start of tensor
|
||||
Pointer pointer,
|
||||
/// Extent of tensor
|
||||
TensorCoord extent,
|
||||
/// ID of each participating thread
|
||||
int thread_id,
|
||||
/// Initial offset of threadblock
|
||||
TensorCoord const &threadblock_offset)
|
||||
: address_iterator_(params.params_, pointer, extent, thread_id,
|
||||
threadblock_offset) {}
|
||||
|
||||
/// Construct a PredicatedTileIteratorTriangularMatrix with zero threadblock offset
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileIteratorTriangularMatrix(
|
||||
Params const ¶ms, ///< Precomputed parameters object
|
||||
Pointer pointer, ///< Pointer to start of tensor
|
||||
TensorCoord extent, ///< Extent of tensor
|
||||
int thread_id ///< ID of each participating thread
|
||||
)
|
||||
: PredicatedTileIteratorTriangularMatrix(params, pointer, extent, thread_id,
|
||||
make_Coord(0, 0)) {}
|
||||
|
||||
/// Adds a pointer offset in units of Element
|
||||
CUTLASS_HOST_DEVICE
|
||||
void add_pointer_offset(LongIndex pointer_offset) {
|
||||
address_iterator_.add_pointer_offset(pointer_offset);
|
||||
}
|
||||
|
||||
/// Advances to the next tile in memory.
|
||||
///
|
||||
/// The first time this method is called, predicates are updated, and the
|
||||
/// iterator's internal pointer is reverted to the first "steady state" tile.
|
||||
/// Subsequent calls are lightweight and must only update the internal
|
||||
/// pointer.
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileIteratorTriangularMatrix &operator++() {
|
||||
if (kAdvanceRank)
|
||||
address_iterator_.add_tile_offset({0, 1});
|
||||
else
|
||||
address_iterator_.add_tile_offset({1, 0});
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Advances to the next tile in memory.
|
||||
///
|
||||
/// The first time this method is called, predicates are updated, and the
|
||||
/// iterator's internal pointer is reverted to the first "steady state" tile.
|
||||
/// Subsequent calls are lightweight and must only update the internal
|
||||
/// pointer.
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileIteratorTriangularMatrix operator++(int) {
|
||||
PredicatedTileIteratorTriangularMatrix self(*this);
|
||||
operator++();
|
||||
return self;
|
||||
}
|
||||
|
||||
/// Clears the predicate set efficiently
|
||||
CUTLASS_HOST_DEVICE
|
||||
void clear_mask(bool enable = true) { address_iterator_.clear_mask(enable); }
|
||||
|
||||
/// Clears the predicate set efficiently
|
||||
CUTLASS_HOST_DEVICE
|
||||
void enable_mask() { address_iterator_.enable_mask(); }
|
||||
|
||||
/// Sets the predicate mask, overriding value stored in predicate iterator
|
||||
CUTLASS_HOST_DEVICE
|
||||
void set_mask(Mask const &mask) { address_iterator_.set_mask(mask); }
|
||||
|
||||
/// Gets the mask
|
||||
CUTLASS_HOST_DEVICE
|
||||
void get_mask(Mask &mask) { address_iterator_.get_mask(mask); }
|
||||
|
||||
CUTLASS_DEVICE
|
||||
void load_with_pointer_offset(Fragment &frag, Index pointer_offset) {
|
||||
load_with_byte_offset(frag, pointer_offset * sizeof_bits<Element>::value / 8);
|
||||
}
|
||||
|
||||
CUTLASS_DEVICE
|
||||
void load_with_byte_offset(Fragment &frag, LongIndex byte_offset) {
|
||||
|
||||
AccessType *frag_ptr = reinterpret_cast<AccessType *>(&frag);
|
||||
|
||||
CUTLASS_PRAGMA_UNROLL
|
||||
for (int s = 0; s < ThreadMap::Iterations::kStrided; ++s) {
|
||||
CUTLASS_PRAGMA_UNROLL
|
||||
for (int c = 0; c < ThreadMap::Iterations::kContiguous; ++c) {
|
||||
|
||||
CUTLASS_PRAGMA_UNROLL
|
||||
for (int v = 0; v < kAccessesPerVector; ++v) {
|
||||
|
||||
int idx = v + kAccessesPerVector * (c + s * ThreadMap::Iterations::kContiguous);
|
||||
|
||||
address_iterator_.set_iteration_index(idx);
|
||||
char const *byte_ptr = reinterpret_cast<char const *>(address_iterator_.get()) + byte_offset;
|
||||
|
||||
AccessType const *access_ptr = reinterpret_cast<AccessType const *>(byte_ptr);
|
||||
|
||||
cutlass::arch::global_load<AccessType,
|
||||
sizeof(AccessType)
|
||||
>(
|
||||
frag_ptr[idx], access_ptr, address_iterator_.valid());
|
||||
|
||||
++address_iterator_;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Loads a fragment from memory
|
||||
CUTLASS_DEVICE
|
||||
void load(Fragment &frag) { load_with_byte_offset(frag, 0); }
|
||||
|
||||
/// Store a fragment to memory
|
||||
CUTLASS_DEVICE
|
||||
void store_with_pointer_offset(Fragment const &frag, Index pointer_offset) {
|
||||
store_with_byte_offset(frag, pointer_offset * sizeof_bits<Element>::value / 8);
|
||||
}
|
||||
|
||||
/// Store a fragment to memory
|
||||
CUTLASS_DEVICE
|
||||
void store_with_byte_offset(Fragment const &frag, LongIndex byte_offset) {
|
||||
address_iterator_.set_iteration_index(0);
|
||||
AccessType const *frag_ptr = reinterpret_cast<AccessType const *>(&frag);
|
||||
|
||||
CUTLASS_PRAGMA_UNROLL
|
||||
for (int s = 0; s < ThreadMap::Iterations::kStrided; ++s) {
|
||||
CUTLASS_PRAGMA_UNROLL
|
||||
for (int c = 0; c < ThreadMap::Iterations::kContiguous; ++c) {
|
||||
CUTLASS_PRAGMA_UNROLL
|
||||
for (int v = 0; v < kAccessesPerVector; ++v) {
|
||||
|
||||
int idx = v + kAccessesPerVector * (c + s * ThreadMap::Iterations::kContiguous);
|
||||
|
||||
char *byte_ptr = reinterpret_cast<char *>(address_iterator_.get()) + byte_offset;
|
||||
AccessType *access_ptr = reinterpret_cast<AccessType *>(byte_ptr);
|
||||
|
||||
if (address_iterator_.valid()) {
|
||||
*access_ptr = frag_ptr[idx];
|
||||
}
|
||||
++address_iterator_;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Store a fragment to memory
|
||||
CUTLASS_DEVICE
|
||||
void store(Fragment const &frag) { store_with_byte_offset(frag, 0); }
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// Specialization of PredicatedTileIteratorTriangularMatrix for column-major data.
|
||||
///
|
||||
/// Satisfies: ForwardTileIteratorConcept |
|
||||
/// ReadableContiguousTileIteratorConcept |
|
||||
/// WriteableContiguousTileIteratorConcept |
|
||||
/// MaskedTileIteratorConcept
|
||||
///
|
||||
template <
|
||||
typename Shape_,
|
||||
typename Element_,
|
||||
int AdvanceRank,
|
||||
typename ThreadMap_,
|
||||
SideMode kSideMode,
|
||||
FillMode kFillMode,
|
||||
DiagType kDiagType,
|
||||
int AccessSize
|
||||
>
|
||||
class PredicatedTileIteratorTriangularMatrix<Shape_, Element_, layout::ColumnMajor, AdvanceRank, ThreadMap_,
|
||||
kSideMode, kFillMode, kDiagType,
|
||||
AccessSize> {
|
||||
public:
|
||||
|
||||
static_assert(AdvanceRank == 0 || AdvanceRank == 1,
|
||||
"Specialization for pitch-linear iterator may along advance along the "
|
||||
"contiguous(rank=0) or strided(rank=1) dimension.");
|
||||
|
||||
using Shape = Shape_;
|
||||
using Element = Element_;
|
||||
using Layout = layout::ColumnMajor;
|
||||
static int const kAdvanceRank = AdvanceRank;
|
||||
using ThreadMap = ThreadMap_;
|
||||
|
||||
using Index = typename Layout::Index;
|
||||
using LongIndex = typename Layout::LongIndex;
|
||||
|
||||
using TensorRef = TensorRef<Element, Layout>;
|
||||
using TensorView = TensorView<Element, Layout>;
|
||||
using TensorCoord = typename Layout::TensorCoord;
|
||||
|
||||
using Pointer = Element *;
|
||||
using NonConstPointer = typename platform::remove_const<Element>::type *;
|
||||
|
||||
using UnderlyingIterator = PredicatedTileIteratorTriangularMatrix<
|
||||
layout::PitchLinearShape<Shape::kRow, Shape::kColumn>,
|
||||
Element,
|
||||
layout::PitchLinear,
|
||||
(kAdvanceRank == 0 ? 0 : 1),
|
||||
ThreadMap,
|
||||
kSideMode,
|
||||
kFillMode,
|
||||
kDiagType,
|
||||
AccessSize
|
||||
>;
|
||||
|
||||
using AccessType = typename UnderlyingIterator::AccessType;
|
||||
|
||||
/// Fragment object to be loaded or stored
|
||||
using Fragment = cutlass::Array<Element, ThreadMap::Iterations::kCount * ThreadMap::kElementsPerAccess>;
|
||||
|
||||
/// Predicate vector stores mask to guard accesses
|
||||
using Mask = typename UnderlyingIterator::Mask;
|
||||
|
||||
/// Parameters object is precomputed state and is host-constructible
|
||||
class Params {
|
||||
private:
|
||||
|
||||
friend PredicatedTileIteratorTriangularMatrix;
|
||||
|
||||
/// Parameters object
|
||||
typename UnderlyingIterator::Params params_;
|
||||
|
||||
public:
|
||||
|
||||
CUTLASS_HOST_DEVICE
|
||||
Params() { }
|
||||
|
||||
/// Construct the Params object given a pitch-linear tensor's layout
|
||||
CUTLASS_HOST_DEVICE
|
||||
Params(Layout const &layout): params_(layout::PitchLinear(layout.stride(0))) {
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
private:
|
||||
|
||||
//
|
||||
// Data members
|
||||
//
|
||||
|
||||
/// Underlying pitch-linear tile iterator
|
||||
UnderlyingIterator iterator_;
|
||||
|
||||
public:
|
||||
|
||||
/// Constructs a TileIterator from its precomputed state, threadblock offset, and thread ID
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileIteratorTriangularMatrix(
|
||||
Params const ¶ms, ///< Precomputed parameters object
|
||||
Pointer pointer, ///< Pointer to start of tensor
|
||||
TensorCoord extent, ///< Extent of tensor
|
||||
int thread_id, ///< ID of each participating thread
|
||||
TensorCoord const &threadblock_offset ///< Initial offset of threadblock
|
||||
):
|
||||
iterator_(
|
||||
params.params_,
|
||||
pointer,
|
||||
layout::PitchLinearCoord(extent.row(), extent.column()),
|
||||
thread_id,
|
||||
layout::PitchLinearCoord(threadblock_offset.row(), threadblock_offset.column())
|
||||
) { }
|
||||
|
||||
/// Construct a PredicatedTileIteratorTriangularMatrix with zero threadblock offset
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileIteratorTriangularMatrix(
|
||||
Params const ¶ms, ///< Precomputed parameters object
|
||||
Pointer pointer, ///< Pointer to start of tensor
|
||||
TensorCoord extent, ///< Extent of tensor
|
||||
int thread_id ///< ID of each participating thread
|
||||
): PredicatedTileIteratorTriangularMatrix(params, pointer, extent, thread_id, make_Coord(0, 0)) { }
|
||||
|
||||
/// Adds a pointer offset in units of Element
|
||||
CUTLASS_HOST_DEVICE
|
||||
void add_pointer_offset(LongIndex pointer_offset) {
|
||||
iterator_.add_pointer_offset(pointer_offset);
|
||||
}
|
||||
|
||||
/// Advances to the next tile in memory.
|
||||
///
|
||||
/// The first time this method is called, predicates are updated, and the iterator's
|
||||
/// internal pointer is reverted to the first "steady state" tile. Subsequent calls
|
||||
/// are lightweight and must only update the internal pointer.
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileIteratorTriangularMatrix &operator++() {
|
||||
++iterator_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Advances to the next tile in memory.
|
||||
///
|
||||
/// The first time this method is called, predicates are updated, and the iterator's
|
||||
/// internal pointer is reverted to the first "steady state" tile. Subsequent calls
|
||||
/// are lightweight and must only update the internal pointer.
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileIteratorTriangularMatrix operator++(int) {
|
||||
PredicatedTileIteratorTriangularMatrix self(*this);
|
||||
operator++();
|
||||
return self;
|
||||
}
|
||||
|
||||
/// Clears the predicate set efficiently
|
||||
CUTLASS_HOST_DEVICE
|
||||
void clear_mask(bool enable = true) {
|
||||
iterator_.clear_mask(enable);
|
||||
}
|
||||
|
||||
/// Clears the predicate set efficiently
|
||||
CUTLASS_HOST_DEVICE
|
||||
void enable_mask() {
|
||||
iterator_.enable_mask();
|
||||
}
|
||||
|
||||
/// Sets the predicate mask, overriding value stored in predicate iterator
|
||||
CUTLASS_HOST_DEVICE
|
||||
void set_mask(Mask const &mask) {
|
||||
iterator_.set_mask(mask);
|
||||
}
|
||||
|
||||
/// Gets the mask
|
||||
CUTLASS_HOST_DEVICE
|
||||
void get_mask(Mask &mask) {
|
||||
iterator_.get_mask(mask);
|
||||
}
|
||||
|
||||
/// Loads a fragment from memory
|
||||
CUTLASS_DEVICE
|
||||
void load_with_pointer_offset(Fragment &frag, Index pointer_offset) {
|
||||
iterator_.load_with_pointer_offset(frag, pointer_offset);
|
||||
}
|
||||
|
||||
/// Loads a fragment from memory
|
||||
CUTLASS_DEVICE
|
||||
void load_with_byte_offset(Fragment &frag, LongIndex byte_offset) {
|
||||
iterator_.load_with_byte_offset(frag, byte_offset);
|
||||
}
|
||||
|
||||
/// Loads a fragment from memory
|
||||
CUTLASS_DEVICE
|
||||
void load(Fragment &frag) {
|
||||
load_with_pointer_offset(frag, 0);
|
||||
}
|
||||
|
||||
/// Store a fragment to memory
|
||||
CUTLASS_DEVICE
|
||||
void store_with_pointer_offset(Fragment const &frag, Index pointer_offset) {
|
||||
iterator_.store_with_pointer_offset(frag, pointer_offset);
|
||||
}
|
||||
|
||||
/// Store a fragment to memory
|
||||
CUTLASS_DEVICE
|
||||
void store_with_byte_offset(Fragment const &frag, LongIndex byte_offset) {
|
||||
iterator_.store_with_byte_offset(frag, byte_offset);
|
||||
}
|
||||
|
||||
/// Store a fragment to memory
|
||||
CUTLASS_DEVICE
|
||||
void store(Fragment const &frag) {
|
||||
store_with_pointer_offset(frag, 0);
|
||||
}
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// Specialization of PredicatedTileIteratorTriangularMatrix for row-major data.
|
||||
///
|
||||
/// Satisfies: ForwardTileIteratorConcept |
|
||||
/// ReadableContiguousTileIteratorConcept |
|
||||
/// WriteableContiguousTileIteratorConcept |
|
||||
/// MaskedTileIteratorConcept
|
||||
///
|
||||
template <
|
||||
typename Shape_,
|
||||
typename Element_,
|
||||
int AdvanceRank,
|
||||
typename ThreadMap_,
|
||||
SideMode kSideMode,
|
||||
FillMode kFillMode,
|
||||
DiagType kDiagType,
|
||||
int AccessSize
|
||||
>
|
||||
class PredicatedTileIteratorTriangularMatrix<Shape_, Element_, layout::RowMajor, AdvanceRank, ThreadMap_,
|
||||
kSideMode, kFillMode, kDiagType,
|
||||
AccessSize> {
|
||||
public:
|
||||
|
||||
static_assert(AdvanceRank == 0 || AdvanceRank == 1,
|
||||
"Specialization for pitch-linear iterator may along advance along the "
|
||||
"contiguous(rank=0) or strided(rank=1) dimension.");
|
||||
|
||||
using Shape = Shape_;
|
||||
using Element = Element_;
|
||||
using Layout = layout::RowMajor;
|
||||
static int const kAdvanceRank = AdvanceRank;
|
||||
using ThreadMap = ThreadMap_;
|
||||
|
||||
using Index = typename Layout::Index;
|
||||
using LongIndex = typename Layout::LongIndex;
|
||||
|
||||
using TensorRef = TensorRef<Element, Layout>;
|
||||
using TensorView = TensorView<Element, Layout>;
|
||||
using TensorCoord = typename Layout::TensorCoord;
|
||||
|
||||
using Pointer = Element *;
|
||||
using NonConstPointer = typename platform::remove_const<Element>::type *;
|
||||
|
||||
using UnderlyingIterator = PredicatedTileIteratorTriangularMatrix<
|
||||
layout::PitchLinearShape<Shape::kColumn, Shape::kRow>,
|
||||
Element,
|
||||
layout::PitchLinear,
|
||||
(kAdvanceRank == 0 ? 1 : 0),
|
||||
ThreadMap,
|
||||
kSideMode,
|
||||
kFillMode,
|
||||
kDiagType,
|
||||
AccessSize
|
||||
>;
|
||||
|
||||
using AccessType = typename UnderlyingIterator::AccessType;
|
||||
|
||||
/// Fragment object to be loaded or stored
|
||||
using Fragment = cutlass::Array<Element, ThreadMap::Iterations::kCount * ThreadMap::kElementsPerAccess>;
|
||||
|
||||
/// Predicate vector stores mask to guard accesses
|
||||
using Mask = typename UnderlyingIterator::Mask;
|
||||
|
||||
/// Parameters object is precomputed state and is host-constructible
|
||||
class Params {
|
||||
private:
|
||||
|
||||
friend PredicatedTileIteratorTriangularMatrix;
|
||||
|
||||
/// Parameters object
|
||||
typename UnderlyingIterator::Params params_;
|
||||
|
||||
public:
|
||||
|
||||
CUTLASS_HOST_DEVICE
|
||||
Params() { }
|
||||
|
||||
/// Construct the Params object given a pitch-linear tensor's layout
|
||||
CUTLASS_HOST_DEVICE
|
||||
Params(Layout const &layout): params_(layout::PitchLinear(layout.stride(0))) {
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
private:
|
||||
|
||||
//
|
||||
// Data members
|
||||
//
|
||||
|
||||
/// Underlying pitch-linear tile iterator
|
||||
UnderlyingIterator iterator_;
|
||||
|
||||
public:
|
||||
|
||||
/// Constructs a TileIterator from its precomputed state, threadblock offset, and thread ID
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileIteratorTriangularMatrix(
|
||||
Params const ¶ms, ///< Precomputed parameters object
|
||||
Pointer pointer, ///< Pointer to start of tensor
|
||||
TensorCoord extent, ///< Extent of tensor
|
||||
int thread_id, ///< ID of each participating thread
|
||||
TensorCoord const &threadblock_offset ///< Initial offset of threadblock
|
||||
):
|
||||
iterator_(
|
||||
params.params_,
|
||||
pointer,
|
||||
layout::PitchLinearCoord(extent.column(), extent.row()),
|
||||
thread_id,
|
||||
layout::PitchLinearCoord(threadblock_offset.column(), threadblock_offset.row())
|
||||
) { }
|
||||
|
||||
/// Construct a PredicatedTileIteratorTriangularMatrix with zero threadblock offset
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileIteratorTriangularMatrix(
|
||||
Params const ¶ms, ///< Precomputed parameters object
|
||||
Pointer pointer, ///< Pointer to start of tensor
|
||||
TensorCoord extent, ///< Extent of tensor
|
||||
int thread_id ///< ID of each participating thread
|
||||
): PredicatedTileIteratorTriangularMatrix(params, pointer, extent, thread_id, make_Coord(0, 0)) { }
|
||||
|
||||
/// Adds a pointer offset in units of Element
|
||||
CUTLASS_HOST_DEVICE
|
||||
void add_pointer_offset(LongIndex pointer_offset) {
|
||||
iterator_.add_pointer_offset(pointer_offset);
|
||||
}
|
||||
|
||||
/// Advances to the next tile in memory.
|
||||
///
|
||||
/// The first time this method is called, predicates are updated, and the iterator's
|
||||
/// internal pointer is reverted to the first "steady state" tile. Subsequent calls
|
||||
/// are lightweight and must only update the internal pointer.
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileIteratorTriangularMatrix &operator++() {
|
||||
++iterator_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Advances to the next tile in memory.
|
||||
///
|
||||
/// The first time this method is called, predicates are updated, and the iterator's
|
||||
/// internal pointer is reverted to the first "steady state" tile. Subsequent calls
|
||||
/// are lightweight and must only update the internal pointer.
|
||||
CUTLASS_HOST_DEVICE
|
||||
PredicatedTileIteratorTriangularMatrix operator++(int) {
|
||||
PredicatedTileIteratorTriangularMatrix self(*this);
|
||||
operator++();
|
||||
return self;
|
||||
}
|
||||
|
||||
/// Clears the predicate set efficiently
|
||||
CUTLASS_HOST_DEVICE
|
||||
void clear_mask(bool enable = true) {
|
||||
iterator_.clear_mask(enable);
|
||||
}
|
||||
|
||||
/// Clears the predicate set efficiently
|
||||
CUTLASS_HOST_DEVICE
|
||||
void enable_mask() {
|
||||
iterator_.enable_mask();
|
||||
}
|
||||
|
||||
/// Sets the predicate mask, overriding value stored in predicate iterator
|
||||
CUTLASS_HOST_DEVICE
|
||||
void set_mask(Mask const &mask) {
|
||||
iterator_.set_mask(mask);
|
||||
}
|
||||
|
||||
/// Gets the mask
|
||||
CUTLASS_HOST_DEVICE
|
||||
void get_mask(Mask &mask) {
|
||||
iterator_.get_mask(mask);
|
||||
}
|
||||
|
||||
/// Loads a fragment from memory
|
||||
CUTLASS_DEVICE
|
||||
void load_with_pointer_offset(Fragment &frag, Index pointer_offset) {
|
||||
iterator_.load_with_pointer_offset(frag, pointer_offset);
|
||||
}
|
||||
|
||||
/// Loads a fragment from memory
|
||||
CUTLASS_DEVICE
|
||||
void load_with_byte_offset(Fragment &frag, LongIndex byte_offset) {
|
||||
iterator_.load_with_byte_offset(frag, byte_offset);
|
||||
}
|
||||
|
||||
/// Loads a fragment from memory
|
||||
CUTLASS_DEVICE
|
||||
void load(Fragment &frag) {
|
||||
load_with_pointer_offset(frag, 0);
|
||||
}
|
||||
|
||||
/// Store a fragment to memory
|
||||
CUTLASS_DEVICE
|
||||
void store_with_pointer_offset(Fragment const &frag, Index pointer_offset) {
|
||||
iterator_.store_with_pointer_offset(frag, pointer_offset);
|
||||
}
|
||||
|
||||
/// Store a fragment to memory
|
||||
CUTLASS_DEVICE
|
||||
void store_with_byte_offset(Fragment const &frag, LongIndex byte_offset) {
|
||||
iterator_.store_with_byte_offset(frag, byte_offset);
|
||||
}
|
||||
|
||||
/// Store a fragment to memory
|
||||
CUTLASS_DEVICE
|
||||
void store(Fragment const &frag) {
|
||||
store_with_pointer_offset(frag, 0);
|
||||
}
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
} // namespace threadblock
|
||||
} // namespace transform
|
||||
} // namespace cutlass
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -1,24 +1,30 @@
|
||||
/***************************************************************************************************
|
||||
* Copyright (c) 2017-2021, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2017 - 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* 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 the NVIDIA CORPORATION nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 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 NVIDIA CORPORATION 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 TOR (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. 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.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder 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.
|
||||
*
|
||||
**************************************************************************************************/
|
||||
|
||||
@@ -1,27 +1,31 @@
|
||||
/***************************************************************************************************
|
||||
* Copyright (c) 2017-2021, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2017 - 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* 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 the NVIDIA CORPORATION nor the names of its
|
||||
*contributors may be used to endorse or promote products derived from this
|
||||
*software without specific prior written permission.
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. 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.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder 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 NVIDIA CORPORATION 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.
|
||||
* 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.
|
||||
*
|
||||
**************************************************************************************************/
|
||||
/*! \file
|
||||
|
||||
@@ -1,24 +1,30 @@
|
||||
/***************************************************************************************************
|
||||
* Copyright (c) 2017-2021, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2017 - 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* 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 the NVIDIA CORPORATION nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 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 NVIDIA CORPORATION 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
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. 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.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder 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.
|
||||
*
|
||||
**************************************************************************************************/
|
||||
|
||||
@@ -1,24 +1,30 @@
|
||||
/***************************************************************************************************
|
||||
* Copyright (c) 2017-2021, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2017 - 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* 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 the NVIDIA CORPORATION nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 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 NVIDIA CORPORATION 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
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. 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.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder 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.
|
||||
*
|
||||
**************************************************************************************************/
|
||||
|
||||
@@ -1,24 +1,30 @@
|
||||
/***************************************************************************************************
|
||||
* Copyright (c) 2017-2021, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2017 - 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* 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 the NVIDIA CORPORATION nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 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 NVIDIA CORPORATION 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
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. 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.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder 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.
|
||||
*
|
||||
**************************************************************************************************/
|
||||
@@ -535,7 +541,7 @@ class RegularTileAccessIterator<
|
||||
AccessType *get() const {
|
||||
|
||||
// Map the logical contiguous and strided access to the internal swizzled structure.
|
||||
int uniform_offset = (iteration_strided_ & 0x3) * stride_ + (iteration_strided_ >> 3) * 16;
|
||||
int uniform_offset = (iteration_strided_ & 0x3) * stride_ + (iteration_strided_ >> 3) * 16 + stride_ * ThreadMap::Delta::kContiguous * iteration_contiguous_;
|
||||
|
||||
char *access_byte_ptr = reinterpret_cast<char *>(pointer_ + uniform_offset);
|
||||
|
||||
|
||||
@@ -1,24 +1,30 @@
|
||||
/***************************************************************************************************
|
||||
* Copyright (c) 2017-2021, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2017 - 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* 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 the NVIDIA CORPORATION nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 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 NVIDIA CORPORATION 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
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. 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.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder 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.
|
||||
*
|
||||
**************************************************************************************************/
|
||||
|
||||
@@ -1,24 +1,30 @@
|
||||
/***************************************************************************************************
|
||||
* Copyright (c) 2017-2021, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2017 - 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* 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 the NVIDIA CORPORATION nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 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 NVIDIA CORPORATION 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
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. 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.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder 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.
|
||||
*
|
||||
**************************************************************************************************/
|
||||
|
||||
@@ -1,24 +1,30 @@
|
||||
/***************************************************************************************************
|
||||
* Copyright (c) 2017-2021, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2017 - 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* 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 the NVIDIA CORPORATION nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 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 NVIDIA CORPORATION 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
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. 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.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder 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.
|
||||
*
|
||||
**************************************************************************************************/
|
||||
|
||||
@@ -1,24 +1,30 @@
|
||||
/***************************************************************************************************
|
||||
* Copyright (c) 2017-2021, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2017 - 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* 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 the NVIDIA CORPORATION nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 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 NVIDIA CORPORATION 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
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. 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.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder 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.
|
||||
*
|
||||
**************************************************************************************************/
|
||||
|
||||
@@ -1,24 +1,30 @@
|
||||
/***************************************************************************************************
|
||||
* Copyright (c) 2017-2021, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2017 - 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* 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 the NVIDIA CORPORATION nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 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 NVIDIA CORPORATION 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
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. 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.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder 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.
|
||||
*
|
||||
**************************************************************************************************/
|
||||
|
||||
@@ -1,24 +1,30 @@
|
||||
/***************************************************************************************************
|
||||
* Copyright (c) 2017-2021, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2017 - 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* 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 the NVIDIA CORPORATION nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 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 NVIDIA CORPORATION 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 TOR (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. 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.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder 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.
|
||||
*
|
||||
**************************************************************************************************/
|
||||
|
||||
Reference in New Issue
Block a user