diff --git a/impl/ascend/aclnn/adaptor.hpp b/impl/ascend/aclnn/adaptor.hpp index 34c671b17..f7b623fc8 100644 --- a/impl/ascend/aclnn/adaptor.hpp +++ b/impl/ascend/aclnn/adaptor.hpp @@ -90,15 +90,7 @@ inline aclTensor* createAclTensorFromDiopiTensor(diopiConstTensorHandle_t tensor auto type = diopiDtypeToAclDataType(dtype); auto format = inferAclDataFormat(shape.len, shape.data, stride.data); auto storageSize = static_cast(storageNbytes / elemsize); - return ::aclCreateTensor(shape.data, - shape.len, - type, - stride.data, - storageOffset, - format, - &storageSize, - /*storageDimsNum=*/1, - const_cast(tensorData)); + return ::aclCreateTensor(shape.data, shape.len, type, stride.data, storageOffset, format, shape.data, shape.len, const_cast(tensorData)); } inline aclScalar* createAclScalarFromDiopiScalar(const diopiScalar_t* scalar) { diff --git a/impl/ascend/convert_config.yaml b/impl/ascend/convert_config.yaml index 257ce5fc6..1d42478aa 100755 --- a/impl/ascend/convert_config.yaml +++ b/impl/ascend/convert_config.yaml @@ -444,3 +444,6 @@ - diopiLerpScalar: # aclnnLerps doesn't support float64 dtype: (float64)->float32 + +- diopiSlice: + dtype: (float64)->float32, (int16)->int32 \ No newline at end of file diff --git a/impl/ascend/functions/slice.cpp b/impl/ascend/functions/slice.cpp index e8160def7..02caee9e8 100644 --- a/impl/ascend/functions/slice.cpp +++ b/impl/ascend/functions/slice.cpp @@ -4,47 +4,36 @@ * @copyright (c) 2023, DeepLink. */ +#include "../aclnn/adaptor.hpp" #include "../common/acloprunner.hpp" namespace impl { namespace ascend { diopiError_t diopiSlice(diopiContextHandle_t ctx, diopiTensorHandle_t nullOut, diopiConstTensorHandle_t input, int64_t dim, int64_t start, int64_t end, int64_t step) { - std::vector index; - for (int64_t i = start; i < end; i += step) { - index.push_back(i); - } - std::vector dimVec{dim}; - bool negativeIndexSupport = true; - AclOpRunner<3, 1>("GatherV2", ctx) - .addInput(input) - .addConstInput(vectorToDiopiSize(index)) - .addConstInput(vectorToDiopiSize(dimVec)) - .setAttr("negative_index_support", negativeIndexSupport) - .addOutput(nullOut) - .run(); + DIOPI_ASCEND_CALL_ACLNN(aclnnSlice, ctx, input, dim, start, end, step, nullOut); return diopiSuccess; } diopiError_t diopiSliceBackward(diopiContextHandle_t ctx, diopiTensorHandle_t gradInput, diopiConstTensorHandle_t gradOutput, diopiSize_t inputSizes, int64_t dim, int64_t start, int64_t end, int64_t step) { - if (dim < 0) { - dim += inputSizes.len; - } - std::vector start64(inputSizes.len, 0); - std::vector step64(inputSizes.len, 1); - std::vector end64(inputSizes.data, inputSizes.data + inputSizes.len); - start64[dim] = start; - step64[dim] = step; - end64[dim] = end; - AclOpRunner<5, 1>("StridedSliceGrad", ctx) - .addConstInput(inputSizes) - .addConstInput(vectorToDiopiSize(start64)) - .addConstInput(vectorToDiopiSize(end64)) - .addConstInput(vectorToDiopiSize(step64)) - .addInput(gradOutput) - .addOutput(gradInput) - .run(); + DIOPI_ASCEND_CALL_ACLNN(aclnnInplaceZero, ctx, gradInput); + + if (start < 0) start += inputSizes.data[dim]; + if (end < 0) end += inputSizes.data[dim]; + + diopiTensorHandle_t index; + std::array indexSize = {(end - start) / step}; + diopiSize_t indexShape = {indexSize.data(), 1}; + diopiRequireTensor(ctx, &index, &indexShape, nullptr, diopi_dtype_int64, diopi_device); + + diopiScalar_t startScalar = constructDiopiScalarT(diopi_dtype_int64, start); + diopiScalar_t endScalar = constructDiopiScalarT(diopi_dtype_int64, end); + diopiScalar_t stepScalar = constructDiopiScalarT(diopi_dtype_int64, step); + DIOPI_ASCEND_CALL_ACLNN(aclnnArange, ctx, &startScalar, &endScalar, &stepScalar, index); + + diopiScalar_t one = constructDiopiScalarT(diopi_dtype_int64, 1); + DIOPI_ASCEND_CALL_ACLNN(aclnnIndexAdd, ctx, gradInput, dim, index, gradOutput, &one, gradInput); return diopiSuccess; }