Files
2026-07-13 12:47:05 +08:00

336 lines
18 KiB
Plaintext

/* ******************************************************************************
*
*
* This program and the accompanying materials are made available under the
* terms of the Apache License, Version 2.0 which is available at
* https://www.apache.org/licenses/LICENSE-2.0.
*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* SPDX-License-Identifier: Apache-2.0
******************************************************************************/
#include <array/ConstantDataBuffer.h>
#include <array/DataTypeUtils.h>
#include <array/ShapeDescriptor.h>
#include <exceptions/cuda_exception.h>
#include <exceptions/datatype_exception.h>
#include <execution/cuda/LaunchDims.h>
#include <helpers/DebugHelper.h>
#include <helpers/PointersManager.h>
#include <legacy/NativeOpExecutioner.h>
#include <loops/broadcasting.h>
#include <loops/broadcasting_bool.h>
#include <loops/broadcasting_int.h>
#include <loops/indexreduce.h>
#include <loops/pairwise_bool.h>
#include <loops/pairwise_int.h>
#include <loops/pairwise_transform.h>
#include <loops/random.h>
#include <loops/reduce3.h>
#include <loops/reduce_bool.h>
#include <loops/reduce_float.h>
#include <loops/reduce_long.h>
#include <loops/reduce_same.h>
#include <loops/scalar.h>
#include <loops/scalar_bool.h>
#include <loops/scalar_int.h>
#include <loops/special_kernels.h>
#include <loops/summarystatsreduce.h>
#include <loops/transform_any.h>
#include <loops/transform_bool.h>
#include <loops/transform_float.h>
#include <loops/transform_same.h>
#include <loops/transform_strict.h>
#include <system/op_boilerplate.h>
#include <helpers/ConstantTadHelper.h>
#include <system/selective_rendering.h>
////////////////////////////////////////////////////////////////////////
void NativeOpExecutioner::execBroadcastBool(sd::LaunchContext* lc, int opNum, void const* hX, sd::LongType const* hXShapeInfo,
void const* dX, sd::LongType const* dXShapeInfo, void const* hY,
sd::LongType const* hYShapeInfo, void const* dY, sd::LongType const* dYShapeInfo,
void* hZ, sd::LongType const* hZShapeInfo, void* dZ,
sd::LongType const* dZShapeInfo, void* extraParams, sd::LongType* dimension,
sd::LongType dimensionLength, sd::LongType const* tadOnlyShapeInfo,
sd::LongType const* tadOffsets, sd::LongType const* tadOnlyShapeInfoZ,
sd::LongType const* tadOffsetsZ) {
auto stream = lc->getCudaStream();
auto xType = sd::ArrayOptions::dataType(hXShapeInfo);
auto yType = sd::ArrayOptions::dataType(hYShapeInfo);
auto zType = sd::ArrayOptions::dataType(hZShapeInfo);
if (sd::DataTypeUtils::isS(xType) || sd::DataTypeUtils::isS(yType) || sd::DataTypeUtils::isS(zType)) {
THROW_EXCEPTION(
"NativeOpExecutioner::execBroadcastBool:: unable to execute on strings. Please write logic higher level in "
"each op for the string data type.")
}
if (!sd::DataTypeUtils::isB(zType))
THROW_EXCEPTION("NativeOpExecutioner::execBroadcastBool requires Z operand to have BOOL type");
if (yType != xType)
THROW_EXCEPTION("NativeOpExecutioner::execBroadcastBool requires both X & Y operands to have same type");
if (sd::Environment::getInstance().isDebugAndVerbose()) printf("F3B opType:[%i]\n", opNum);
dim3 launchDims = getLaunchDims("broadcast");
#if SD_IS_PAIR_TYPE_COMPILED(xType,zType)
BUILD_DOUBLE_SELECTOR(
xType, zType, functions::broadcast::BroadcastBool,
::execBroadcast(launchDims, stream, opNum, dX, dXShapeInfo, dY, dYShapeInfo, dZ, dZShapeInfo, extraParams,
dimension, dimensionLength, tadOnlyShapeInfo, tadOffsets, tadOnlyShapeInfoZ, tadOffsetsZ),
SD_COMMON_TYPES, SD_BOOL_TYPES)
#endif
}
////////////////////////////////////////////////////////////////////////
void NativeOpExecutioner::execBroadcastBool(sd::LaunchContext* lc, const int opNum, const void* hX,
const sd::LongType* hXShapeInfo, const void* dX, const sd::LongType* dXShapeInfo,
const void* hY, const sd::LongType* hYShapeInfo, const void* dY,
const sd::LongType* dYShapeInfo, void* hZ, const sd::LongType* hZShapeInfo,
void* dZ, const sd::LongType* dZShapeInfo, void* extraParams) {
auto stream = lc->getCudaStream();
auto xType = sd::ArrayOptions::dataType(hXShapeInfo);
auto zType = sd::ArrayOptions::dataType(hZShapeInfo);
if (sd::DataTypeUtils::isS(xType) || sd::DataTypeUtils::isS(zType)) {
THROW_EXCEPTION(
"NativeOpExecutioner::execBroadcastBool:: unable to execute on strings. Please write logic higher level in "
"each op for the string data type.")
}
dim3 launchDims = getLaunchDims("broadcastBool");
BUILD_DOUBLE_SELECTOR(
xType, zType, functions::broadcast::BroadcastBool,
::execBroadcast(launchDims, stream, opNum, dX, dXShapeInfo, dY, dYShapeInfo, dZ, dZShapeInfo, extraParams),
SD_COMMON_TYPES, SD_BOOL_TYPES);
}
void NativeOpExecutioner::execInverseBroadcastBool(
sd::LaunchContext* lc, int opNum, void const* hX, sd::LongType const* hXShapeInfo, void const* dX,
sd::LongType const* dXShapeInfo, void const* hY, sd::LongType const* hYShapeInfo, void const* dY,
sd::LongType const* dYShapeInfo, void* hZ, sd::LongType const* hZShapeInfo, void* dZ, sd::LongType const* dZShapeInfo,
void* extraParams, sd::LongType* dimension, sd::LongType dimensionLength, sd::LongType const* tadOnlyShapeInfo,
sd::LongType const* tadOffsets, sd::LongType const* tadOnlyShapeInfoZ, sd::LongType const* tadOffsetsZ) {
auto stream = lc->getCudaStream();
auto xType = sd::ArrayOptions::dataType(hXShapeInfo);
auto yType = sd::ArrayOptions::dataType(hYShapeInfo);
auto zType = sd::ArrayOptions::dataType(hZShapeInfo);
if (sd::DataTypeUtils::isS(xType) || sd::DataTypeUtils::isS(yType) || sd::DataTypeUtils::isS(zType)) {
THROW_EXCEPTION(
"NativeOpExecutioner::execInverseBroadcastBool:: unable to execute on strings. Please write logic higher level "
"in each op for the string data type.")
}
if (!sd::DataTypeUtils::isB(zType))
THROW_EXCEPTION("NativeOpExecutioner::execBroadcastBool requires Z operand to have BOOL type");
if (yType != xType)
THROW_EXCEPTION("NativeOpExecutioner::execBroadcastBool requires both X & Y operands to have same type");
dim3 launchDims = getLaunchDims("broadcastBool");
BUILD_DOUBLE_SELECTOR(
xType, zType, functions::broadcast::BroadcastBool,
::execInverseBroadcast(launchDims, stream, opNum, dX, dXShapeInfo, dY, dYShapeInfo, dZ, dZShapeInfo, extraParams,
dimension, dimensionLength, tadOnlyShapeInfo, tadOffsets, tadOnlyShapeInfoZ, tadOffsetsZ),
SD_COMMON_TYPES, SD_BOOL_TYPES)
}
////////////////////////////////////////////////////////////////////////
void NativeOpExecutioner::execBroadcastInt(sd::LaunchContext* lc, int opNum, void const* hX,
sd::LongType const* hXShapeInfo, void const* dX, sd::LongType const* dXShapeInfo,
void const* hY, sd::LongType const* hYShapeInfo, void const* dY,
sd::LongType const* dYShapeInfo, void* hZ, sd::LongType const* hZShapeInfo, void* dZ,
sd::LongType const* dZShapeInfo, sd::LongType* dimension, sd::LongType dimensionLength,
sd::LongType const* tadOnlyShapeInfo, sd::LongType const* tadOffsets,
sd::LongType const* tadOnlyShapeInfoZ, sd::LongType const* tadOffsetsZ) {
auto stream = lc->getCudaStream();
auto xType = sd::ArrayOptions::dataType(hXShapeInfo);
auto yType = sd::ArrayOptions::dataType(hYShapeInfo);
auto zType = sd::ArrayOptions::dataType(hZShapeInfo);
if (sd::DataTypeUtils::isS(xType) || sd::DataTypeUtils::isS(yType) || sd::DataTypeUtils::isS(zType)) {
THROW_EXCEPTION(
"NativeOpExecutioner::execBroadcastInt:: unable to execute on strings. Please write logic higher level in each "
"op for the string data type.")
}
if (!sd::DataTypeUtils::isZ(zType))
THROW_EXCEPTION("NativeOpExecutioner::execBroadcastInt requires Z operand to have INT type");
if (yType != xType || zType != xType)
THROW_EXCEPTION("NativeOpExecutioner::execBroadcastInt requires both X & Y operands to have same type");
dim3 launchDims = getLaunchDims("broadcastInt");
BUILD_SINGLE_SELECTOR(
xType, functions::broadcast::BroadcastInt,
::execBroadcast(launchDims, stream, opNum, dX, dXShapeInfo, dY, dYShapeInfo, dZ, dZShapeInfo, dimension,
dimensionLength, tadOnlyShapeInfo, tadOffsets, tadOnlyShapeInfoZ, tadOffsetsZ),
SD_INTEGER_TYPES)
}
////////////////////////////////////////////////////////////////////////
void NativeOpExecutioner::execBroadcastInt(sd::LaunchContext* lc, const int opNum, const void* hX,
const sd::LongType* hXShapeInfo, const void* dX, const sd::LongType* dXShapeInfo,
const void* hY, const sd::LongType* hYShapeInfo, const void* dY,
const sd::LongType* dYShapeInfo, void* hZ, const sd::LongType* hZShapeInfo, void* dZ,
const sd::LongType* dZShapeInfo) {
auto stream = lc->getCudaStream();
auto xType = sd::ArrayOptions::dataType(hXShapeInfo);
auto yType = sd::ArrayOptions::dataType(hYShapeInfo);
auto zType = sd::ArrayOptions::dataType(hZShapeInfo);
if (sd::DataTypeUtils::isS(xType) || sd::DataTypeUtils::isS(yType) || sd::DataTypeUtils::isS(zType)) {
THROW_EXCEPTION(
"NativeOPExecutioner::execBroadcastInt:: unable to execute on strings. Please write logic higher level in each "
"op for the string data type.")
}
if (!sd::DataTypeUtils::isZ(zType))
THROW_EXCEPTION("NativeOpExecutioner::execBroadcastInt requires Z operand to have INT type");
if (yType != xType || zType != xType)
THROW_EXCEPTION("NativeOpExecutioner::execBroadcastInt requires both X & Y operands to have same type");
dim3 launchDims = getLaunchDims("broadcastInt");
// shared memory
BUILD_SINGLE_SELECTOR(xType, functions::broadcast::BroadcastInt,
::execBroadcast(launchDims, stream, opNum, dX, dXShapeInfo, dY, dYShapeInfo, dZ, dZShapeInfo),
SD_INTEGER_TYPES)
}
void NativeOpExecutioner::execInverseBroadcastInt(
sd::LaunchContext* lc, int opNum, void const* hX, sd::LongType const* hXShapeInfo, void const* dX,
sd::LongType const* dXShapeInfo, void const* hY, sd::LongType const* hYShapeInfo, void const* dY,
sd::LongType const* dYShapeInfo, void* hZ, sd::LongType const* hZShapeInfo, void* dZ, sd::LongType const* dZShapeInfo,
sd::LongType* dimension, sd::LongType dimensionLength, sd::LongType const* tadOnlyShapeInfo, sd::LongType const* tadOffsets,
sd::LongType const* tadOnlyShapeInfoZ, sd::LongType const* tadOffsetsZ) {
auto stream = lc->getCudaStream();
auto xType = sd::ArrayOptions::dataType(hXShapeInfo);
auto yType = sd::ArrayOptions::dataType(hYShapeInfo);
auto zType = sd::ArrayOptions::dataType(hZShapeInfo);
if (sd::DataTypeUtils::isS(xType) || sd::DataTypeUtils::isS(yType) || sd::DataTypeUtils::isS(zType)) {
THROW_EXCEPTION(
"NativeOpExecutioner::execInverseBroadcastInt:: unable to execute on strings. Please write logic higher level "
"in each op for the string data type.")
}
if (!sd::DataTypeUtils::isZ(zType))
THROW_EXCEPTION("NativeOpExecutioner::execInverseBroadcastInt requires Z operand to have INT type");
if (yType != xType || zType != xType)
THROW_EXCEPTION("NativeOpExecutioner::execInverseBroadcastInt requires both X & Y operands to have same type");
if (sd::Environment::getInstance().isDebugAndVerbose()) printf("F3BI opType:[%i]\n", opNum);
dim3 launchDims = getLaunchDims("broadcastInt");
BUILD_SINGLE_SELECTOR(
xType, functions::broadcast::BroadcastInt,
::execInverseBroadcast(launchDims, stream, opNum, dX, dXShapeInfo, dY, dYShapeInfo, dZ, dZShapeInfo, dimension,
dimensionLength, tadOnlyShapeInfo, tadOffsets, tadOnlyShapeInfoZ, tadOffsetsZ),
SD_INTEGER_TYPES)
}
////////////////////////////////////////////////////////////////////////
/**
*
* @param opNum
* @param dX
* @param dXShapeInfo
* @param dY
* @param dYShapeInfo
* @param dZ
* @param dZShapeInfo
* @param dimension
* @param dimensionLength
*/
void NativeOpExecutioner::execBroadcast(sd::LaunchContext* lc, int opNum, void const* hX, sd::LongType const* hXShapeInfo,
void const* dX, sd::LongType const* dXShapeInfo, void const* hY,
sd::LongType const* hYShapeInfo, void const* dY, sd::LongType const* dYShapeInfo,
void* hZ, sd::LongType const* hZShapeInfo, void* dZ, sd::LongType const* dZShapeInfo,
sd::LongType* dimension, sd::LongType dimensionLength, sd::LongType const* tadOnlyShapeInfo,
sd::LongType const* tadOffsets, sd::LongType const* tadOnlyShapeInfoZ,
sd::LongType const* tadOffsetsZ) {
auto stream = lc->getCudaStream();
auto xType = sd::ArrayOptions::dataType(hXShapeInfo);
auto yType = sd::ArrayOptions::dataType(hYShapeInfo);
auto zType = sd::ArrayOptions::dataType(hZShapeInfo);
if (sd::DataTypeUtils::isS(xType) || sd::DataTypeUtils::isS(yType) || sd::DataTypeUtils::isS(zType)) {
THROW_EXCEPTION(
"NativeOPExecutioner::execBroadcast:: unable to execute on strings. Please write logic higher level in each op "
"for the string data type.")
}
dim3 launchDims = getLaunchDims("broadcast");
BUILD_SINGLE_SELECTOR_THRICE(
xType, functions::broadcast::Broadcast,
::execBroadcast(launchDims, stream, opNum, dX, dXShapeInfo, dY, dYShapeInfo, dZ, dZShapeInfo, dimension,
dimensionLength, tadOnlyShapeInfo, tadOffsets, tadOnlyShapeInfoZ, tadOffsetsZ),
SD_COMMON_TYPES);
}
////////////////////////////////////////////////////////////////////////
void NativeOpExecutioner::execBroadcast(sd::LaunchContext* lc, const int opNum, const void* hX,
const sd::LongType* hXShapeInfo, const void* dX, const sd::LongType* dXShapeInfo,
const void* hY, const sd::LongType* hYShapeInfo, const void* dY,
const sd::LongType* dYShapeInfo, void* hZ, const sd::LongType* hZShapeInfo, void* dZ,
const sd::LongType* dZShapeInfo) {
auto stream = lc->getCudaStream();
auto xType = sd::ArrayOptions::dataType(hXShapeInfo);
auto yType = sd::ArrayOptions::dataType(hYShapeInfo);
auto zType = sd::ArrayOptions::dataType(hZShapeInfo);
if (sd::DataTypeUtils::isS(xType) || sd::DataTypeUtils::isS(yType) || sd::DataTypeUtils::isS(zType)) {
THROW_EXCEPTION(
"NativeOpExecutioner::execBroadcast:: unable to execute on strings. Please write logic higher level in each op "
"for the string data type.")
}
dim3 launchDims = getLaunchDims("broadcast");
// shared memory
BUILD_SINGLE_SELECTOR_THRICE(
xType, functions::broadcast::Broadcast,
::execBroadcast(launchDims, stream, opNum, dX, dXShapeInfo, dY, dYShapeInfo, dZ, dZShapeInfo), SD_COMMON_TYPES);
}
void NativeOpExecutioner::execInverseBroadcast(sd::LaunchContext* lc, int opNum, void const* hX,
sd::LongType const* hXShapeInfo, void const* dX, sd::LongType const* dXShapeInfo,
void const* hY, sd::LongType const* hYShapeInfo, void const* dY,
sd::LongType const* dYShapeInfo, void* hZ, sd::LongType const* hZShapeInfo,
void* dZ, sd::LongType const* dZShapeInfo, sd::LongType* dimension,
sd::LongType dimensionLength, sd::LongType const* tadOnlyShapeInfo,
sd::LongType const* tadOffsets, sd::LongType const* tadOnlyShapeInfoZ,
sd::LongType const* tadOffsetsZ) {
auto stream = lc->getCudaStream();
auto xType = sd::ArrayOptions::dataType(hXShapeInfo);
auto yType = sd::ArrayOptions::dataType(hYShapeInfo);
auto zType = sd::ArrayOptions::dataType(hZShapeInfo);
if (sd::DataTypeUtils::isS(xType) || sd::DataTypeUtils::isS(yType) || sd::DataTypeUtils::isS(zType)) {
THROW_EXCEPTION(
"NativeOpExecutioner::execInverseBroadcast:: unable to execute on strings. Please write logic higher level in "
"each op for the string data type.")
}
dim3 launchDims = getLaunchDims("broadcast");
BUILD_SINGLE_SELECTOR_THRICE(
xType, functions::broadcast::Broadcast,
::execInverseBroadcast(launchDims, stream, opNum, dX, dXShapeInfo, dY, dYShapeInfo, dZ, dZShapeInfo, dimension,
dimensionLength, tadOnlyShapeInfo, tadOffsets, tadOnlyShapeInfoZ, tadOffsetsZ),
SD_COMMON_TYPES);
}
////////////////////////////////////////////////////////////////////////