[INFO] Initializing environment for https://gitcode.com/pre-commit/pre-commit-hooks.
[WARNING] repo `https://gitcode.com/pre-commit/pre-commit-hooks` uses deprecated stage names (commit, push) which will be removed in a future version. Hint: often `pre-commit autoupdate --repo https://gitcode.com/pre-commit/pre-commit-hooks` will fix this. if it does not -- consider reporting an issue to that repo.
[INFO] Initializing environment for https://gitcode.com/pre-commit-clang/mirrors-clang-format.
[INFO] Initializing environment for https://gitcode.com/gh_mirrors/ru/ruff-pre-commit.
[INFO] Initializing environment for https://gitcode.com/gh_mirrors/co/codespell.
[INFO] Installing environment for https://gitcode.com/pre-commit/pre-commit-hooks.
[INFO] Once installed this environment will be reused.
[INFO] This may take a few minutes...
[INFO] Installing environment for https://gitcode.com/pre-commit-clang/mirrors-clang-format.
[INFO] Once installed this environment will be reused.
[INFO] This may take a few minutes...
[INFO] Installing environment for https://gitcode.com/gh_mirrors/ru/ruff-pre-commit.
[INFO] Once installed this environment will be reused.
[INFO] This may take a few minutes...
[INFO] Installing environment for https://gitcode.com/gh_mirrors/co/codespell.
[INFO] Once installed this environment will be reused.
[INFO] This may take a few minutes...
trim trailing whitespace.................................................Failed
- hook id: trailing-whitespace
- exit code: 1
- files were modified by this hook
Fixing foreach/foreach_addcmul_scalar/docs/aclnnForeachAddcmulScalar.md
Fixing foreach/foreach_minimum_scalar/docs/aclnnForeachMinimumScalarV2.md
Fixing foreach/foreach_expm1/docs/aclnnForeachExpm1.md
Fixing foreach/foreach_sign/docs/aclnnForeachSign.md
Fixing foreach/foreach_sub_scalar/docs/aclnnForeachSubScalarV2.md
Fixing foreach/foreach_add_scalar_list/docs/aclnnForeachAddScalarList.md
Fixing foreach/foreach_tan/docs/aclnnForeachTan.md
Fixing foreach/foreach_log2/docs/aclnnForeachLog2.md
Fixing foreach/foreach_lerp_scalar/docs/aclnnForeachLerpScalar.md
Fixing foreach/foreach_cosh/docs/aclnnForeachCosh.md
Fixing foreach/foreach_erf/docs/aclnnForeachErf.md
Fixing foreach/foreach_round_off_number/docs/aclnnForeachRoundOffNumberV2.md
Fixing foreach/foreach_log1p/docs/aclnnForeachLog1p.md
Fixing foreach/foreach_asin/docs/aclnnForeachAsin.md
Fixing foreach/foreach_addcdiv_scalar/docs/aclnnForeachAddcdivScalar.md
Fixing foreach/foreach_addcdiv_scalar/docs/aclnnForeachAddcdivScalarV2.md
Fixing foreach/foreach_mul_scalar_list/docs/aclnnForeachMulScalarList.md
Fixing foreach/foreach_pow_scalar/docs/aclnnForeachPowScalar.md
Fixing foreach/foreach_cos/docs/aclnnForeachCos.md
Fixing foreach/foreach_maximum_scalar/examples/test_aclnn_foreach_maximum_scalar.cpp
Fixing foreach/foreach_atan/docs/aclnnForeachAtan.md
Fixing foreach/foreach_reciprocal/docs/aclnnForeachReciprocal.md
Fixing foreach/foreach_sinh/docs/aclnnForeachSinh.md
Fixing foreach/foreach_addcdiv_list/docs/aclnnForeachAddcdivList.md
Fixing foreach/foreach_mul_scalar/docs/aclnnForeachMulScalarV2.md
Fixing foreach/foreach_minimum_list/docs/aclnnForeachMinimumList.md
Fixing foreach/foreach_div_list/docs/aclnnForeachDivList.md
Fixing foreach/foreach_pow_scalar/docs/aclnnForeachPowScalarV2.md
Fixing foreach/foreach_mul_scalar/docs/aclnnForeachMulScalar.md
Fixing foreach/foreach_minimum_scalar_list/docs/aclnnForeachMinimumScalarList.md
Fixing foreach/foreach_lerp_list/docs/aclnnForeachLerpList.md
Fixing foreach/foreach_minimum_scalar/docs/aclnnForeachMinimumScalar.md
Fixing foreach/foreach_maximum_scalar/docs/aclnnForeachMaximumScalar.md
Fixing foreach/foreach_norm/docs/aclnnForeachNorm.md
Fixing foreach/foreach_neg/docs/aclnnForeachNeg.md
Fixing foreach/foreach_add_list/docs/aclnnForeachAddList.md
Fixing foreach/foreach_maximum_list/docs/aclnnForeachMaximumList.md
Fixing foreach/foreach_zero_inplace/docs/aclnnForeachZeroInplace.md
Fixing foreach/foreach_maximum_scalar_list/docs/aclnnForeachMaximumScalarList.md
Fixing foreach/foreach_div_scalar/docs/aclnnForeachDivScalar.md
Fixing foreach/foreach_sub_list/docs/aclnnForeachSubListV2.md
Fixing foreach/foreach_pow_list/docs/aclnnForeachPowList.md
Fixing foreach/foreach_sqrt/docs/aclnnForeachSqrt.md
Fixing foreach/foreach_div_scalar_list/docs/aclnnForeachDivScalarList.md
Fixing foreach/foreach_add_scalar/docs/aclnnForeachAddScalarV2.md
Fixing foreach/foreach_addcmul_scalar_list/docs/aclnnForeachAddcmulScalarList.md
Fixing foreach/foreach_abs/docs/aclnnForeachAbs.md
Fixing foreach/foreach_addcmul_scalar/docs/aclnnForeachAddcmulScalarV2.md
Fixing foreach/foreach_acos/docs/aclnnForeachAcos.md
Fixing foreach/foreach_maximum_scalar/docs/aclnnForeachMaximumScalarV2.md
Fixing foreach/foreach_add_list/docs/aclnnForeachAddListV2.md
Fixing foreach/foreach_tanh/docs/aclnnForeachTanh.md
Fixing foreach/foreach_pow_scalar_and_tensor/docs/aclnnForeachPowScalarAndTensor.md
Fixing foreach/foreach_log10/docs/aclnnForeachLog10.md
Fixing foreach/foreach_erfc/docs/aclnnForeachErfc.md
Fixing foreach/foreach_add_scalar/docs/aclnnForeachAddScalar.md
Fixing foreach/foreach_div_scalar/docs/aclnnForeachDivScalarV2.md
Fixing foreach/foreach_round_off_number/docs/aclnnForeachRoundOffNumber.md
Fixing foreach/foreach_addcdiv_scalar_list/docs/aclnnForeachAddcdivScalarList.md
Fixing foreach/foreach_addcmul_list/docs/aclnnForeachAddcmulList.md
Fixing foreach/foreach_pow_scalar_list/docs/aclnnForeachPowScalarList.md
Fixing foreach/foreach_copy/docs/aclnnForeachCopy.md
Fixing foreach/foreach_log/docs/aclnnForeachLog.md
Fixing foreach/foreach_mul_list/docs/aclnnForeachMulList.md
Fixing foreach/foreach_exp/docs/aclnnForeachExp.md
Fixing foreach/foreach_sub_list/docs/aclnnForeachSubList.md
fix end of files.........................................................Failed
- hook id: end-of-file-fixer
- exit code: 1
- files were modified by this hook
Fixing foreach/foreach_sqrt/examples/test_aclnn_foreach_sqrt.cpp
Fixing foreach/foreach_pow_list/examples/test_aclnn_foreach_pow_list.cpp
Fixing foreach/foreach_mul_scalar/examples/test_aclnn_foreach_mul_scalar.cpp
Fixing foreach/foreach_expm1/examples/test_aclnn_foreach_expm1.cpp
Fixing foreach/foreach_addcdiv_scalar/examples/test_aclnn_foreach_addcdiv_scalar_v2.cpp
Fixing foreach/foreach_sign/examples/test_aclnn_foreach_sign.cpp
Fixing foreach/foreach_sub_list/examples/test_aclnn_foreach_sub_list_v2.cpp
Fixing foreach/foreach_mul_list/examples/test_aclnn_foreach_mul_list.cpp
Fixing foreach/foreach_addcdiv_scalar/examples/test_aclnn_foreach_addcdiv_scalar.cpp
Fixing foreach/foreach_log/examples/test_aclnn_foreach_log.cpp
Fixing foreach/foreach_reciprocal/examples/test_aclnn_foreach_reciprocal.cpp
Fixing foreach/foreach_pow_scalar_and_tensor/examples/test_aclnn_foreach_pow_scalar_and_tensor.cpp
Fixing foreach/foreach_neg/examples/test_aclnn_foreach_neg.cpp
Fixing foreach/foreach_addcmul_scalar_list/examples/test_aclnn_foreach_addcmul_scalar_list.cpp
Fixing foreach/foreach_lerp_list/examples/test_aclnn_foreach_lerp_list.cpp
Fixing foreach/foreach_add_scalar_list/examples/test_aclnn_foreach_add_scalar_list.cpp
Fixing foreach/foreach_tanh/examples/test_aclnn_foreach_tanh.cpp
Fixing foreach/foreach_sin/examples/test_aclnn_foreach_sin.cpp
Fixing foreach/foreach_maximum_scalar_list/examples/test_aclnn_foreach_maximum_scalar_list.cpp
Fixing foreach/foreach_pow_scalar/examples/test_aclnn_foreach_pow_scalar_v2.cpp
Fixing foreach/foreach_minimum_list/examples/test_aclnn_foreach_minimum_list.cpp
Fixing foreach/foreach_abs/examples/test_aclnn_foreach_abs.cpp
Fixing foreach/foreach_sub_scalar_list/examples/test_aclnn_foreach_sub_scalar_list.cpp
Fixing foreach/foreach_maximum_scalar/examples/test_aclnn_foreach_maximum_scalar.cpp
Fixing foreach/foreach_div_scalar/examples/test_aclnn_foreach_div_scalar.cpp
Fixing foreach/foreach_log2/examples/test_aclnn_foreach_log2.cpp
Fixing foreach/foreach_norm/examples/test_aclnn_foreach_norm.cpp
Fixing foreach/foreach_exp/examples/test_aclnn_foreach_exp.cpp
Fixing foreach/foreach_minimum_scalar_list/examples/test_aclnn_foreach_minimum_scalar_list.cpp
Fixing foreach/foreach_sigmoid/examples/test_aclnn_foreach_sigmoid.cpp
Fixing foreach/foreach_lerp_scalar/examples/test_aclnn_foreach_lerp_scalar.cpp
Fixing foreach/foreach_tan/examples/test_aclnn_foreach_tan.cpp
Fixing foreach/foreach_cosh/examples/test_aclnn_foreach_cosh.cpp
Fixing foreach/foreach_addcdiv_list/examples/test_aclnn_foreach_addcdiv_list.cpp
Fixing foreach/foreach_sub_scalar/examples/test_aclnn_foreach_sub_scalar.cpp
Fixing foreach/foreach_addcmul_list/examples/test_aclnn_foreach_addcmul_list.cpp
Fixing foreach/foreach_cos/examples/test_aclnn_foreach_cos.cpp
Fixing foreach/foreach_zero_inplace/examples/test_aclnn_foreach_zero_inplace.cpp
Fixing foreach/foreach_sinh/examples/test_aclnn_foreach_sinh.cpp
Fixing foreach/foreach_sub_scalar/examples/test_aclnn_foreach_sub_scalar_v2.cpp
Fixing foreach/foreach_acos/examples/test_aclnn_foreach_acos.cpp
Fixing foreach/foreach_pow_scalar_list/examples/test_aclnn_foreach_pow_scalar_list.cpp
Fixing foreach/foreach_maximum_scalar/examples/test_aclnn_foreach_maximum_scalar_v2.cpp
Fixing foreach/foreach_maximum_list/examples/test_aclnn_foreach_maximum_list.cpp
Fixing foreach/foreach_minimum_scalar/examples/test_aclnn_foreach_minimum_scalar_v2.cpp
Fixing foreach/foreach_erf/examples/test_aclnn_foreach_erf.cpp
Fixing foreach/foreach_mul_scalar_list/examples/test_aclnn_foreach_mul_scalar_list.cpp
Fixing foreach/foreach_addcdiv_scalar_list/examples/test_aclnn_foreach_addcdiv_scalar_list.cpp
Fixing foreach/foreach_log10/examples/test_aclnn_foreach_log10.cpp
Fixing foreach/foreach_addcmul_scalar/examples/test_aclnn_foreach_addcmul_scalar_v2.cpp
Fixing foreach/foreach_add_list/examples/test_aclnn_foreach_add_list_v2.cpp
Fixing foreach/foreach_mul_scalar/examples/test_aclnn_foreach_mul_scalar_v2.cpp
Fixing foreach/foreach_copy/examples/test_aclnn_foreach_copy.cpp
Fixing foreach/foreach_round_off_number/examples/test_aclnn_foreach_round_off_number.cpp
Fixing foreach/foreach_div_scalar/examples/test_aclnn_foreach_div_scalar_v2.cpp
Fixing foreach/foreach_asin/examples/test_aclnn_foreach_asin.cpp
Fixing foreach/foreach_div_list/examples/test_aclnn_foreach_div_list.cpp
Fixing foreach/foreach_add_scalar/examples/test_aclnn_foreach_add_scalar_v2.cpp
Fixing foreach/foreach_div_scalar_list/examples/test_aclnn_foreach_div_scalar_list.cpp
Fixing foreach/foreach_erfc/examples/test_aclnn_foreach_erfc.cpp
Fixing foreach/foreach_atan/examples/test_aclnn_foreach_atan.cpp
Fixing foreach/foreach_add_scalar/examples/test_aclnn_foreach_add_scalar.cpp
Fixing foreach/foreach_addcmul_scalar/examples/test_aclnn_foreach_addcmul_scalar.cpp
Fixing foreach/foreach_round_off_number/examples/test_aclnn_foreach_round_off_number_v2.cpp
Fixing foreach/foreach_sub_list/examples/test_aclnn_foreach_sub_list.cpp
Fixing foreach/foreach_minimum_scalar/examples/test_aclnn_foreach_minimum_scalar.cpp
check yaml...........................................(no files to check)Skipped
check for added large files..............................................Passed
check for merge conflicts................................................Passed
detect private key.......................................................Passed
check json...........................................(no files to check)Skipped
clang-format.............................................................Failed
- hook id: clang-format
- files were modified by this hook
Formatting [1/9] foreach/foreach_log1p/examples/test_aclnn_foreach_log1p.cpp
Formatting [2/9] foreach/foreach_addcdiv_scalar/examples/test_aclnn_foreach_addcdiv_scalar_v2.cpp
Formatting [3/9] foreach/foreach_addcmul_scalar_list/examples/test_aclnn_foreach_addcmul_scalar_list.cpp
Formatting [4/9] foreach/foreach_mul_scalar/examples/test_aclnn_foreach_mul_scalar_v2.cpp
Formatting [5/9] foreach/foreach_sub_scalar/examples/test_aclnn_foreach_sub_scalar_v2.cpp
Formatting [6/9] foreach/foreach_log2/examples/test_aclnn_foreach_log2.cpp
Formatting [7/9] foreach/foreach_sub_scalar/examples/test_aclnn_foreach_sub_scalar.cpp
Formatting [8/9] foreach/foreach_pow_list/examples/test_aclnn_foreach_pow_list.cpp
Formatting [9/9] foreach/foreach_pow_scalar_and_tensor/examples/test_aclnn_foreach_pow_scalar_and_tensor.cpp
Formatting [1/9] foreach/foreach_cos/examples/test_aclnn_foreach_cos.cpp
Formatting [2/9] foreach/foreach_add_scalar_list/examples/test_aclnn_foreach_add_scalar_list.cpp
Formatting [3/9] foreach/foreach_lerp_scalar/examples/test_aclnn_foreach_lerp_scalar.cpp
Formatting [4/9] foreach/foreach_norm/examples/test_aclnn_foreach_norm.cpp
Formatting [5/9] foreach/foreach_sin/examples/test_aclnn_foreach_sin.cpp
Formatting [6/9] foreach/foreach_pow_scalar/examples/test_aclnn_foreach_pow_scalar.cpp
Formatting [7/9] foreach/foreach_cosh/examples/test_aclnn_foreach_cosh.cpp
Formatting [8/9] foreach/foreach_addcdiv_scalar_list/examples/test_aclnn_foreach_addcdiv_scalar_list.cpp
Formatting [9/9] foreach/foreach_sign/examples/test_aclnn_foreach_sign.cpp
Formatting [1/9] foreach/foreach_zero_inplace/examples/test_aclnn_foreach_zero_inplace.cpp
Formatting [2/9] foreach/foreach_lerp_list/examples/test_aclnn_foreach_lerp_list.cpp
Formatting [3/9] foreach/foreach_maximum_scalar/examples/test_aclnn_foreach_maximum_scalar_v2.cpp
Formatting [4/9] foreach/foreach_erf/examples/test_aclnn_foreach_erf.cpp
Formatting [5/9] foreach/foreach_addcmul_list/examples/test_aclnn_foreach_addcmul_list.cpp
Formatting [6/9] foreach/foreach_mul_scalar/examples/test_aclnn_foreach_mul_scalar.cpp
Formatting [7/9] foreach/foreach_minimum_scalar/examples/test_aclnn_foreach_minimum_scalar.cpp
Formatting [8/9] foreach/foreach_addcdiv_list/examples/test_aclnn_foreach_addcdiv_list.cpp
Formatting [9/9] foreach/foreach_minimum_list/examples/test_aclnn_foreach_minimum_list.cpp
Formatting [1/9] foreach/foreach_abs/examples/test_aclnn_foreach_abs.cpp
Formatting [2/9] foreach/foreach_round_off_number/examples/test_aclnn_foreach_round_off_number.cpp
Formatting [3/9] foreach/foreach_neg/examples/test_aclnn_foreach_neg.cpp
Formatting [4/9] foreach/foreach_minimum_scalar_list/examples/test_aclnn_foreach_minimum_scalar_list.cpp
Formatting [5/9] foreach/foreach_addcmul_scalar/examples/test_aclnn_foreach_addcmul_scalar.cpp
Formatting [6/9] foreach/foreach_reciprocal/examples/test_aclnn_foreach_reciprocal.cpp
Formatting [7/9] foreach/foreach_maximum_scalar_list/examples/test_aclnn_foreach_maximum_scalar_list.cpp
Formatting [8/9] foreach/foreach_acos/examples/test_aclnn_foreach_acos.cpp
Formatting [9/9] foreach/foreach_maximum_scalar/examples/test_aclnn_foreach_maximum_scalar.cpp
Formatting [1/9] foreach/foreach_copy/examples/test_aclnn_foreach_copy.cpp
Formatting [2/9] foreach/foreach_add_list/examples/test_aclnn_foreach_add_list_v2.cpp
Formatting [3/9] foreach/foreach_sqrt/examples/test_aclnn_foreach_sqrt.cpp
Formatting [4/9] foreach/foreach_add_list/examples/test_aclnn_foreach_add_list.cpp
Formatting [5/9] foreach/foreach_div_scalar/examples/test_aclnn_foreach_div_scalar_v2.cpp
Formatting [6/9] foreach/foreach_asin/examples/test_aclnn_foreach_asin.cpp
Formatting [7/9] foreach/foreach_sub_scalar_list/examples/test_aclnn_foreach_sub_scalar_list.cpp
Formatting [8/9] foreach/foreach_log10/examples/test_aclnn_foreach_log10.cpp
Formatting [9/9] foreach/foreach_pow_scalar/examples/test_aclnn_foreach_pow_scalar_v2.cpp
Formatting [1/9] foreach/foreach_div_list/examples/test_aclnn_foreach_div_list.cpp
Formatting [2/9] foreach/foreach_pow_scalar_list/examples/test_aclnn_foreach_pow_scalar_list.cpp
Formatting [3/9] foreach/foreach_div_scalar_list/examples/test_aclnn_foreach_div_scalar_list.cpp
Formatting [4/9] foreach/foreach_add_scalar/examples/test_aclnn_foreach_add_scalar.cpp
Formatting [5/9] foreach/foreach_div_scalar/examples/test_aclnn_foreach_div_scalar.cpp
Formatting [6/9] foreach/foreach_erfc/examples/test_aclnn_foreach_erfc.cpp
Formatting [7/9] foreach/foreach_atan/examples/test_aclnn_foreach_atan.cpp
Formatting [8/9] foreach/foreach_round_off_number/examples/test_aclnn_foreach_round_off_number_v2.cpp
Formatting [9/9] foreach/foreach_addcmul_scalar/examples/test_aclnn_foreach_addcmul_scalar_v2.cpp
Formatting [1/9] foreach/foreach_expm1/examples/test_aclnn_foreach_expm1.cpp
Formatting [2/9] foreach/foreach_sigmoid/examples/test_aclnn_foreach_sigmoid.cpp
Formatting [3/9] foreach/foreach_add_scalar/examples/test_aclnn_foreach_add_scalar_v2.cpp
Formatting [4/9] foreach/foreach_mul_scalar_list/examples/test_aclnn_foreach_mul_scalar_list.cpp
Formatting [5/9] foreach/foreach_tanh/examples/test_aclnn_foreach_tanh.cpp
Formatting [6/9] foreach/foreach_tan/examples/test_aclnn_foreach_tan.cpp
Formatting [7/9] foreach/foreach_sinh/examples/test_aclnn_foreach_sinh.cpp
Formatting [8/9] foreach/foreach_addcdiv_scalar/examples/test_aclnn_foreach_addcdiv_scalar.cpp
Formatting [9/9] foreach/foreach_maximum_list/examples/test_aclnn_foreach_maximum_list.cpp
Formatting [1/6] foreach/foreach_log/examples/test_aclnn_foreach_log.cpp
Formatting [2/6] foreach/foreach_sub_list/examples/test_aclnn_foreach_sub_list_v2.cpp
Formatting [3/6] foreach/foreach_mul_list/examples/test_aclnn_foreach_mul_list.cpp
Formatting [4/6] foreach/foreach_minimum_scalar/examples/test_aclnn_foreach_minimum_scalar_v2.cpp
Formatting [5/6] foreach/foreach_exp/examples/test_aclnn_foreach_exp.cpp
Formatting [6/6] foreach/foreach_sub_list/examples/test_aclnn_foreach_sub_list.cpp
ruff check...........................................(no files to check)Skipped
ruff format..........................................(no files to check)Skipped
codespell................................................................Passed
All changes made by hooks:
diff --git a/foreach/foreach_abs/docs/aclnnForeachAbs.md b/foreach/foreach_abs/docs/aclnnForeachAbs.md
index 11a9fdfa..15ffed97 100644
--- a/foreach/foreach_abs/docs/aclnnForeachAbs.md
+++ b/foreach/foreach_abs/docs/aclnnForeachAbs.md
@@ -121,7 +121,7 @@ aclnnStatus aclnnForeachAbs(
aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。
第一段接口完成入参校验,出现以下场景时报错:
-
+
diff --git a/foreach/foreach_abs/examples/test_aclnn_foreach_abs.cpp b/foreach/foreach_abs/examples/test_aclnn_foreach_abs.cpp
index f8ad8ae6..1bc7c9d4 100644
--- a/foreach/foreach_abs/examples/test_aclnn_foreach_abs.cpp
+++ b/foreach/foreach_abs/examples/test_aclnn_foreach_abs.cpp
@@ -14,26 +14,27 @@
#include "aclnnop/aclnn_foreach_abs.h"
#define CHECK_RET(cond, return_expr) \
- do { \
- if (!(cond)) { \
- return_expr; \
- } \
- } while (0)
-
-#define LOG_PRINT(message, ...) \
- do { \
- printf(message, ##__VA_ARGS__); \
- } while (0)
-
-int64_t GetShapeSize(const std::vector& shape) {
- int64_t shapeSize = 1;
- for (auto i : shape) {
- shapeSize *= i;
- }
- return shapeSize;
+ do { \
+ if (!(cond)) { \
+ return_expr; \
+ } \
+ } while (0)
+
+#define LOG_PRINT(message, ...) \
+ do { \
+ printf(message, ##__VA_ARGS__); \
+ } while (0)
+
+int64_t GetShapeSize(const std::vector& shape)
+{
+ int64_t shapeSize = 1;
+ for (auto i : shape) {
+ shapeSize *= i;
+ }
+ return shapeSize;
}
-int Init(int32_t deviceId, aclrtStream *stream)
+int Init(int32_t deviceId, aclrtStream* stream)
{
// 固定写法,资源初始化
auto ret = aclInit(nullptr);
@@ -46,128 +47,134 @@ int Init(int32_t deviceId, aclrtStream *stream)
}
template
-int CreateAclTensor(const std::vector& hostData, const std::vector& shape, void** deviceAddr,
- aclDataType dataType, aclTensor** tensor) {
- auto size = GetShapeSize(shape) * sizeof(T);
- // 调用aclrtMalloc申请device侧内存
- auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
- // 调用aclrtMemcpy将host侧数据复制到device侧内存上
- ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
-
- // 计算连续tensor的strides
- std::vector strides(shape.size(), 1);
- for (int64_t i = shape.size() - 2; i >= 0; i--) {
- strides[i] = shape[i + 1] * strides[i + 1];
- }
-
- // 调用aclCreateTensor接口创建aclTensor
- *tensor = aclCreateTensor(shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND,
- shape.data(), shape.size(), *deviceAddr);
- return 0;
+int CreateAclTensor(
+ const std::vector& hostData, const std::vector& shape, void** deviceAddr, aclDataType dataType,
+ aclTensor** tensor)
+{
+ auto size = GetShapeSize(shape) * sizeof(T);
+ // 调用aclrtMalloc申请device侧内存
+ auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
+ // 调用aclrtMemcpy将host侧数据复制到device侧内存上
+ ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
+
+ // 计算连续tensor的strides
+ std::vector strides(shape.size(), 1);
+ for (int64_t i = shape.size() - 2; i >= 0; i--) {
+ strides[i] = shape[i + 1] * strides[i + 1];
+ }
+
+ // 调用aclCreateTensor接口创建aclTensor
+ *tensor = aclCreateTensor(
+ shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(),
+ *deviceAddr);
+ return 0;
}
-int main() {
- // 1. (固定写法)device/stream初始化,参考acl API手册
- // 根据自己的实际device填写deviceId
- int32_t deviceId = 0;
- aclrtStream stream;
- auto ret = Init(deviceId, &stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
-
- // 2. 构造输入与输出,需要根据API的接口自定义构造
- std::vector selfShape1 = {2, 3};
- std::vector selfShape2 = {1, 3};
- std::vector outShape1 = {2, 3};
- std::vector outShape2 = {1, 3};
- void* input1DeviceAddr = nullptr;
- void* input2DeviceAddr = nullptr;
- void* out1DeviceAddr = nullptr;
- void* out2DeviceAddr = nullptr;
- aclTensor* input1 = nullptr;
- aclTensor* input2 = nullptr;
- aclTensor* out1 = nullptr;
- aclTensor* out2 = nullptr;
- std::vector input1HostData = {1, 2, 3, 4, 5, 6};
- std::vector input2HostData = {7, 8, 9};
- std::vector out1HostData(6, 0);
- std::vector out2HostData(3, 0);
-
- // 创建input1 aclTensor
- ret = CreateAclTensor(input1HostData, selfShape1, &input1DeviceAddr, aclDataType::ACL_FLOAT, &input1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
-
- // 创建input2 aclTensor
- ret = CreateAclTensor(input2HostData, selfShape2, &input2DeviceAddr, aclDataType::ACL_FLOAT, &input2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
-
- // 创建out1 aclTensor
- ret = CreateAclTensor(out1HostData, outShape1, &out1DeviceAddr, aclDataType::ACL_FLOAT, &out1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
-
- // 创建out2 aclTensor
- ret = CreateAclTensor(out2HostData, outShape2, &out2DeviceAddr, aclDataType::ACL_FLOAT, &out2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
-
- std::vector tempInput{input1, input2};
- aclTensorList* tensorListInput = aclCreateTensorList(tempInput.data(), tempInput.size());
- std::vector tempOutput{out1, out2};
- aclTensorList* tensorListOutput = aclCreateTensorList(tempOutput.data(), tempOutput.size());
-
- // 3. 调用CANN算子库API,需要修改为具体的API名称
- uint64_t workspaceSize = 0;
- aclOpExecutor* executor;
- // 调用aclnnForeachAbs第一段接口
- ret = aclnnForeachAbsGetWorkspaceSize(tensorListInput, tensorListOutput, &workspaceSize, &executor);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAbsGetWorkspaceSize failed. ERROR: %d\n", ret); return ret);
- // 根据第一段接口计算出的workspaceSize申请device内存
- void* workspaceAddr = nullptr;
- if (workspaceSize > 0) {
- ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
- }
- // 调用aclnnForeachAbs第二段接口
- ret = aclnnForeachAbs(workspaceAddr, workspaceSize, executor, stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAbs failed. ERROR: %d\n", ret); return ret);
-
- // 4. (固定写法)同步等待任务执行结束
- ret = aclrtSynchronizeStream(stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
-
- // 5. 获取输出的值,将device侧内存上的结果复制至host侧,需要根据具体API的接口定义修改
- auto size = GetShapeSize(outShape1);
- std::vector out1Data(size, 0);
- ret = aclrtMemcpy(out1Data.data(), out1Data.size() * sizeof(out1Data[0]), out1DeviceAddr,
- size * sizeof(out1Data[0]), ACL_MEMCPY_DEVICE_TO_HOST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
- for (int64_t i = 0; i < size; i++) {
- LOG_PRINT("out1 result[%ld] is: %f\n", i, out1Data[i]);
- }
-
- size = GetShapeSize(outShape2);
- std::vector out2Data(size, 0);
- ret = aclrtMemcpy(out2Data.data(), out2Data.size() * sizeof(out2Data[0]), out2DeviceAddr,
- size * sizeof(out2Data[0]), ACL_MEMCPY_DEVICE_TO_HOST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
- for (int64_t i = 0; i < size; i++) {
- LOG_PRINT("out2 result[%ld] is: %f\n", i, out2Data[i]);
- }
-
- // 6. 释放aclTensor,需要根据具体API的接口定义修改
- aclDestroyTensorList(tensorListInput);
- aclDestroyTensorList(tensorListOutput);
-
- // 7.释放device资源,需要根据具体API的接口定义修改
- aclrtFree(input1DeviceAddr);
- aclrtFree(input2DeviceAddr);
- aclrtFree(out1DeviceAddr);
- aclrtFree(out2DeviceAddr);
- if (workspaceSize > 0) {
- aclrtFree(workspaceAddr);
- }
- aclrtDestroyStream(stream);
- aclrtResetDevice(deviceId);
- aclFinalize();
- return 0;
-}
\ No newline at end of file
+int main()
+{
+ // 1. (固定写法)device/stream初始化,参考acl API手册
+ // 根据自己的实际device填写deviceId
+ int32_t deviceId = 0;
+ aclrtStream stream;
+ auto ret = Init(deviceId, &stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
+
+ // 2. 构造输入与输出,需要根据API的接口自定义构造
+ std::vector selfShape1 = {2, 3};
+ std::vector selfShape2 = {1, 3};
+ std::vector outShape1 = {2, 3};
+ std::vector outShape2 = {1, 3};
+ void* input1DeviceAddr = nullptr;
+ void* input2DeviceAddr = nullptr;
+ void* out1DeviceAddr = nullptr;
+ void* out2DeviceAddr = nullptr;
+ aclTensor* input1 = nullptr;
+ aclTensor* input2 = nullptr;
+ aclTensor* out1 = nullptr;
+ aclTensor* out2 = nullptr;
+ std::vector input1HostData = {1, 2, 3, 4, 5, 6};
+ std::vector input2HostData = {7, 8, 9};
+ std::vector out1HostData(6, 0);
+ std::vector out2HostData(3, 0);
+
+ // 创建input1 aclTensor
+ ret = CreateAclTensor(input1HostData, selfShape1, &input1DeviceAddr, aclDataType::ACL_FLOAT, &input1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+
+ // 创建input2 aclTensor
+ ret = CreateAclTensor(input2HostData, selfShape2, &input2DeviceAddr, aclDataType::ACL_FLOAT, &input2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+
+ // 创建out1 aclTensor
+ ret = CreateAclTensor(out1HostData, outShape1, &out1DeviceAddr, aclDataType::ACL_FLOAT, &out1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+
+ // 创建out2 aclTensor
+ ret = CreateAclTensor(out2HostData, outShape2, &out2DeviceAddr, aclDataType::ACL_FLOAT, &out2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+
+ std::vector tempInput{input1, input2};
+ aclTensorList* tensorListInput = aclCreateTensorList(tempInput.data(), tempInput.size());
+ std::vector tempOutput{out1, out2};
+ aclTensorList* tensorListOutput = aclCreateTensorList(tempOutput.data(), tempOutput.size());
+
+ // 3. 调用CANN算子库API,需要修改为具体的API名称
+ uint64_t workspaceSize = 0;
+ aclOpExecutor* executor;
+ // 调用aclnnForeachAbs第一段接口
+ ret = aclnnForeachAbsGetWorkspaceSize(tensorListInput, tensorListOutput, &workspaceSize, &executor);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAbsGetWorkspaceSize failed. ERROR: %d\n", ret); return ret);
+ // 根据第一段接口计算出的workspaceSize申请device内存
+ void* workspaceAddr = nullptr;
+ if (workspaceSize > 0) {
+ ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
+ }
+ // 调用aclnnForeachAbs第二段接口
+ ret = aclnnForeachAbs(workspaceAddr, workspaceSize, executor, stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAbs failed. ERROR: %d\n", ret); return ret);
+
+ // 4. (固定写法)同步等待任务执行结束
+ ret = aclrtSynchronizeStream(stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
+
+ // 5. 获取输出的值,将device侧内存上的结果复制至host侧,需要根据具体API的接口定义修改
+ auto size = GetShapeSize(outShape1);
+ std::vector out1Data(size, 0);
+ ret = aclrtMemcpy(
+ out1Data.data(), out1Data.size() * sizeof(out1Data[0]), out1DeviceAddr, size * sizeof(out1Data[0]),
+ ACL_MEMCPY_DEVICE_TO_HOST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
+ for (int64_t i = 0; i < size; i++) {
+ LOG_PRINT("out1 result[%ld] is: %f\n", i, out1Data[i]);
+ }
+
+ size = GetShapeSize(outShape2);
+ std::vector out2Data(size, 0);
+ ret = aclrtMemcpy(
+ out2Data.data(), out2Data.size() * sizeof(out2Data[0]), out2DeviceAddr, size * sizeof(out2Data[0]),
+ ACL_MEMCPY_DEVICE_TO_HOST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
+ for (int64_t i = 0; i < size; i++) {
+ LOG_PRINT("out2 result[%ld] is: %f\n", i, out2Data[i]);
+ }
+
+ // 6. 释放aclTensor,需要根据具体API的接口定义修改
+ aclDestroyTensorList(tensorListInput);
+ aclDestroyTensorList(tensorListOutput);
+
+ // 7.释放device资源,需要根据具体API的接口定义修改
+ aclrtFree(input1DeviceAddr);
+ aclrtFree(input2DeviceAddr);
+ aclrtFree(out1DeviceAddr);
+ aclrtFree(out2DeviceAddr);
+ if (workspaceSize > 0) {
+ aclrtFree(workspaceAddr);
+ }
+ aclrtDestroyStream(stream);
+ aclrtResetDevice(deviceId);
+ aclFinalize();
+ return 0;
+}
diff --git a/foreach/foreach_acos/docs/aclnnForeachAcos.md b/foreach/foreach_acos/docs/aclnnForeachAcos.md
index 722cfb45..8ba2fcc8 100644
--- a/foreach/foreach_acos/docs/aclnnForeachAcos.md
+++ b/foreach/foreach_acos/docs/aclnnForeachAcos.md
@@ -17,7 +17,7 @@
- 接口功能:对输入张量列表中的每个张量执行逐元素反余弦运算。
- 计算公式:
-
+
$$
x = [{x_0}, {x_1}, ... {x_{n-1}}]\\
y = [{y_0}, {y_1}, ... {y_{n-1}}]\\
@@ -121,7 +121,7 @@ aclnnStatus aclnnForeachAcos(
aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。
第一段接口完成入参校验,出现以下场景时报错:
-
+
diff --git a/foreach/foreach_acos/examples/test_aclnn_foreach_acos.cpp b/foreach/foreach_acos/examples/test_aclnn_foreach_acos.cpp
index 7745f076..c64e1655 100644
--- a/foreach/foreach_acos/examples/test_aclnn_foreach_acos.cpp
+++ b/foreach/foreach_acos/examples/test_aclnn_foreach_acos.cpp
@@ -14,26 +14,27 @@
#include "aclnnop/aclnn_foreach_acos.h"
#define CHECK_RET(cond, return_expr) \
- do { \
- if (!(cond)) { \
- return_expr; \
- } \
- } while (0)
-
-#define LOG_PRINT(message, ...) \
- do { \
- printf(message, ##__VA_ARGS__); \
- } while (0)
-
-int64_t GetShapeSize(const std::vector& shape) {
- int64_t shapeSize = 1;
- for (auto i : shape) {
- shapeSize *= i;
- }
- return shapeSize;
+ do { \
+ if (!(cond)) { \
+ return_expr; \
+ } \
+ } while (0)
+
+#define LOG_PRINT(message, ...) \
+ do { \
+ printf(message, ##__VA_ARGS__); \
+ } while (0)
+
+int64_t GetShapeSize(const std::vector& shape)
+{
+ int64_t shapeSize = 1;
+ for (auto i : shape) {
+ shapeSize *= i;
+ }
+ return shapeSize;
}
-int Init(int32_t deviceId, aclrtStream *stream)
+int Init(int32_t deviceId, aclrtStream* stream)
{
// 固定写法,资源初始化
auto ret = aclInit(nullptr);
@@ -46,128 +47,134 @@ int Init(int32_t deviceId, aclrtStream *stream)
}
template
-int CreateAclTensor(const std::vector& hostData, const std::vector& shape, void** deviceAddr,
- aclDataType dataType, aclTensor** tensor) {
- auto size = GetShapeSize(shape) * sizeof(T);
- // 调用aclrtMalloc申请device侧内存
- auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
- // 调用aclrtMemcpy将host侧数据复制到device侧内存上
- ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
-
- // 计算连续tensor的strides
- std::vector strides(shape.size(), 1);
- for (int64_t i = shape.size() - 2; i >= 0; i--) {
- strides[i] = shape[i + 1] * strides[i + 1];
- }
-
- // 调用aclCreateTensor接口创建aclTensor
- *tensor = aclCreateTensor(shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND,
- shape.data(), shape.size(), *deviceAddr);
- return 0;
+int CreateAclTensor(
+ const std::vector& hostData, const std::vector& shape, void** deviceAddr, aclDataType dataType,
+ aclTensor** tensor)
+{
+ auto size = GetShapeSize(shape) * sizeof(T);
+ // 调用aclrtMalloc申请device侧内存
+ auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
+ // 调用aclrtMemcpy将host侧数据复制到device侧内存上
+ ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
+
+ // 计算连续tensor的strides
+ std::vector strides(shape.size(), 1);
+ for (int64_t i = shape.size() - 2; i >= 0; i--) {
+ strides[i] = shape[i + 1] * strides[i + 1];
+ }
+
+ // 调用aclCreateTensor接口创建aclTensor
+ *tensor = aclCreateTensor(
+ shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(),
+ *deviceAddr);
+ return 0;
}
-int main() {
- // 1. (固定写法)device/stream初始化,参考acl API手册
- // 根据自己的实际device填写deviceId
- int32_t deviceId = 0;
- aclrtStream stream;
- auto ret = Init(deviceId, &stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
-
- // 2. 构造输入与输出,需要根据API的接口自定义构造
- std::vector selfShape1 = {2, 3};
- std::vector selfShape2 = {1, 3};
- std::vector outShape1 = {2, 3};
- std::vector outShape2 = {1, 3};
- void* input1DeviceAddr = nullptr;
- void* input2DeviceAddr = nullptr;
- void* out1DeviceAddr = nullptr;
- void* out2DeviceAddr = nullptr;
- aclTensor* input1 = nullptr;
- aclTensor* input2 = nullptr;
- aclTensor* out1 = nullptr;
- aclTensor* out2 = nullptr;
- std::vector input1HostData = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6};
- std::vector input2HostData = {0.7, 0.8, 0.9};
- std::vector out1HostData(6, 0);
- std::vector out2HostData(3, 0);
-
- // 创建input1 aclTensor
- ret = CreateAclTensor(input1HostData, selfShape1, &input1DeviceAddr, aclDataType::ACL_FLOAT, &input1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
-
- // 创建input2 aclTensor
- ret = CreateAclTensor(input2HostData, selfShape2, &input2DeviceAddr, aclDataType::ACL_FLOAT, &input2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
-
- // 创建out1 aclTensor
- ret = CreateAclTensor(out1HostData, outShape1, &out1DeviceAddr, aclDataType::ACL_FLOAT, &out1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
-
- // 创建out2 aclTensor
- ret = CreateAclTensor(out2HostData, outShape2, &out2DeviceAddr, aclDataType::ACL_FLOAT, &out2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
-
- std::vector tempInput{input1, input2};
- aclTensorList* tensorListInput = aclCreateTensorList(tempInput.data(), tempInput.size());
- std::vector tempOutput{out1, out2};
- aclTensorList* tensorListOutput = aclCreateTensorList(tempOutput.data(), tempOutput.size());
-
- // 3. 调用CANN算子库API,需要修改为具体的API名称
- uint64_t workspaceSize = 0;
- aclOpExecutor* executor;
- // 调用aclnnForeachAcos第一段接口
- ret = aclnnForeachAcosGetWorkspaceSize(tensorListInput, tensorListOutput, &workspaceSize, &executor);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAcosGetWorkspaceSize failed. ERROR: %d\n", ret); return ret);
- // 根据第一段接口计算出的workspaceSize申请device内存
- void* workspaceAddr = nullptr;
- if (workspaceSize > 0) {
- ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
- }
- // 调用aclnnForeachAcos第二段接口
- ret = aclnnForeachAcos(workspaceAddr, workspaceSize, executor, stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAcos failed. ERROR: %d\n", ret); return ret);
-
- // 4. (固定写法)同步等待任务执行结束
- ret = aclrtSynchronizeStream(stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
-
- // 5. 获取输出的值,将device侧内存上的结果复制至host侧,需要根据具体API的接口定义修改
- auto size = GetShapeSize(outShape1);
- std::vector out1Data(size, 0);
- ret = aclrtMemcpy(out1Data.data(), out1Data.size() * sizeof(out1Data[0]), out1DeviceAddr,
- size * sizeof(out1Data[0]), ACL_MEMCPY_DEVICE_TO_HOST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
- for (int64_t i = 0; i < size; i++) {
- LOG_PRINT("out1 result[%ld] is: %f\n", i, out1Data[i]);
- }
-
- size = GetShapeSize(outShape2);
- std::vector out2Data(size, 0);
- ret = aclrtMemcpy(out2Data.data(), out2Data.size() * sizeof(out2Data[0]), out2DeviceAddr,
- size * sizeof(out2Data[0]), ACL_MEMCPY_DEVICE_TO_HOST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
- for (int64_t i = 0; i < size; i++) {
- LOG_PRINT("out2 result[%ld] is: %f\n", i, out2Data[i]);
- }
-
- // 6. 释放aclTensor,需要根据具体API的接口定义修改
- aclDestroyTensorList(tensorListInput);
- aclDestroyTensorList(tensorListOutput);
-
- // 7.释放device资源,需要根据具体API的接口定义修改
- aclrtFree(input1DeviceAddr);
- aclrtFree(input2DeviceAddr);
- aclrtFree(out1DeviceAddr);
- aclrtFree(out2DeviceAddr);
- if (workspaceSize > 0) {
- aclrtFree(workspaceAddr);
- }
- aclrtDestroyStream(stream);
- aclrtResetDevice(deviceId);
- aclFinalize();
- return 0;
-}
\ No newline at end of file
+int main()
+{
+ // 1. (固定写法)device/stream初始化,参考acl API手册
+ // 根据自己的实际device填写deviceId
+ int32_t deviceId = 0;
+ aclrtStream stream;
+ auto ret = Init(deviceId, &stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
+
+ // 2. 构造输入与输出,需要根据API的接口自定义构造
+ std::vector selfShape1 = {2, 3};
+ std::vector selfShape2 = {1, 3};
+ std::vector outShape1 = {2, 3};
+ std::vector outShape2 = {1, 3};
+ void* input1DeviceAddr = nullptr;
+ void* input2DeviceAddr = nullptr;
+ void* out1DeviceAddr = nullptr;
+ void* out2DeviceAddr = nullptr;
+ aclTensor* input1 = nullptr;
+ aclTensor* input2 = nullptr;
+ aclTensor* out1 = nullptr;
+ aclTensor* out2 = nullptr;
+ std::vector input1HostData = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6};
+ std::vector input2HostData = {0.7, 0.8, 0.9};
+ std::vector out1HostData(6, 0);
+ std::vector out2HostData(3, 0);
+
+ // 创建input1 aclTensor
+ ret = CreateAclTensor(input1HostData, selfShape1, &input1DeviceAddr, aclDataType::ACL_FLOAT, &input1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+
+ // 创建input2 aclTensor
+ ret = CreateAclTensor(input2HostData, selfShape2, &input2DeviceAddr, aclDataType::ACL_FLOAT, &input2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+
+ // 创建out1 aclTensor
+ ret = CreateAclTensor(out1HostData, outShape1, &out1DeviceAddr, aclDataType::ACL_FLOAT, &out1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+
+ // 创建out2 aclTensor
+ ret = CreateAclTensor(out2HostData, outShape2, &out2DeviceAddr, aclDataType::ACL_FLOAT, &out2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+
+ std::vector tempInput{input1, input2};
+ aclTensorList* tensorListInput = aclCreateTensorList(tempInput.data(), tempInput.size());
+ std::vector tempOutput{out1, out2};
+ aclTensorList* tensorListOutput = aclCreateTensorList(tempOutput.data(), tempOutput.size());
+
+ // 3. 调用CANN算子库API,需要修改为具体的API名称
+ uint64_t workspaceSize = 0;
+ aclOpExecutor* executor;
+ // 调用aclnnForeachAcos第一段接口
+ ret = aclnnForeachAcosGetWorkspaceSize(tensorListInput, tensorListOutput, &workspaceSize, &executor);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAcosGetWorkspaceSize failed. ERROR: %d\n", ret); return ret);
+ // 根据第一段接口计算出的workspaceSize申请device内存
+ void* workspaceAddr = nullptr;
+ if (workspaceSize > 0) {
+ ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
+ }
+ // 调用aclnnForeachAcos第二段接口
+ ret = aclnnForeachAcos(workspaceAddr, workspaceSize, executor, stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAcos failed. ERROR: %d\n", ret); return ret);
+
+ // 4. (固定写法)同步等待任务执行结束
+ ret = aclrtSynchronizeStream(stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
+
+ // 5. 获取输出的值,将device侧内存上的结果复制至host侧,需要根据具体API的接口定义修改
+ auto size = GetShapeSize(outShape1);
+ std::vector out1Data(size, 0);
+ ret = aclrtMemcpy(
+ out1Data.data(), out1Data.size() * sizeof(out1Data[0]), out1DeviceAddr, size * sizeof(out1Data[0]),
+ ACL_MEMCPY_DEVICE_TO_HOST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
+ for (int64_t i = 0; i < size; i++) {
+ LOG_PRINT("out1 result[%ld] is: %f\n", i, out1Data[i]);
+ }
+
+ size = GetShapeSize(outShape2);
+ std::vector out2Data(size, 0);
+ ret = aclrtMemcpy(
+ out2Data.data(), out2Data.size() * sizeof(out2Data[0]), out2DeviceAddr, size * sizeof(out2Data[0]),
+ ACL_MEMCPY_DEVICE_TO_HOST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
+ for (int64_t i = 0; i < size; i++) {
+ LOG_PRINT("out2 result[%ld] is: %f\n", i, out2Data[i]);
+ }
+
+ // 6. 释放aclTensor,需要根据具体API的接口定义修改
+ aclDestroyTensorList(tensorListInput);
+ aclDestroyTensorList(tensorListOutput);
+
+ // 7.释放device资源,需要根据具体API的接口定义修改
+ aclrtFree(input1DeviceAddr);
+ aclrtFree(input2DeviceAddr);
+ aclrtFree(out1DeviceAddr);
+ aclrtFree(out2DeviceAddr);
+ if (workspaceSize > 0) {
+ aclrtFree(workspaceAddr);
+ }
+ aclrtDestroyStream(stream);
+ aclrtResetDevice(deviceId);
+ aclFinalize();
+ return 0;
+}
diff --git a/foreach/foreach_add_list/docs/aclnnForeachAddList.md b/foreach/foreach_add_list/docs/aclnnForeachAddList.md
index 5edb9eaa..16cba57e 100644
--- a/foreach/foreach_add_list/docs/aclnnForeachAddList.md
+++ b/foreach/foreach_add_list/docs/aclnnForeachAddList.md
@@ -144,7 +144,7 @@ aclnnStatus aclnnForeachAddList(
aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。
第一段接口完成入参校验,出现以下场景时报错:
-
+
diff --git a/foreach/foreach_add_list/docs/aclnnForeachAddListV2.md b/foreach/foreach_add_list/docs/aclnnForeachAddListV2.md
index 1409a73a..1fa0c375 100644
--- a/foreach/foreach_add_list/docs/aclnnForeachAddListV2.md
+++ b/foreach/foreach_add_list/docs/aclnnForeachAddListV2.md
@@ -139,7 +139,7 @@ aclnnStatus aclnnForeachAddListV2(
- Atlas A2 训练系列产品/Atlas A2 推理系列产品、Atlas A3 训练系列产品/Atlas A3 推理系列产品:
-
+
`scalar`的数据类型与入参`x1`的数据类型具有一定对应关系:
- 当`x1`的数据类型为FLOAT32、BFLOAT16时,数据类型支持FLOAT32、DOUBLE。
- 当`x1`的数据类型为FLOAT16时,数据类型支持FLOAT16、DOUBLE。
@@ -154,7 +154,7 @@ aclnnStatus aclnnForeachAddListV2(
- **返回值**
aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。
-
+
第一段接口完成入参校验,出现以下场景时报错:
diff --git a/foreach/foreach_add_list/examples/test_aclnn_foreach_add_list.cpp b/foreach/foreach_add_list/examples/test_aclnn_foreach_add_list.cpp
index cbe9ebb8..41ad79c2 100644
--- a/foreach/foreach_add_list/examples/test_aclnn_foreach_add_list.cpp
+++ b/foreach/foreach_add_list/examples/test_aclnn_foreach_add_list.cpp
@@ -14,184 +14,194 @@
#include "aclnnop/aclnn_foreach_add_list.h"
#define CHECK_RET(cond, return_expr) \
- do { \
- if (!(cond)) { \
- return_expr; \
- } \
- } while (0)
-
-#define LOG_PRINT(message, ...) \
- do { \
- printf(message, ##__VA_ARGS__); \
- } while (0)
-
-int64_t GetShapeSize(const std::vector& shape) {
- int64_t shapeSize = 1;
- for (auto i : shape) {
- shapeSize *= i;
- }
- return shapeSize;
+ do { \
+ if (!(cond)) { \
+ return_expr; \
+ } \
+ } while (0)
+
+#define LOG_PRINT(message, ...) \
+ do { \
+ printf(message, ##__VA_ARGS__); \
+ } while (0)
+
+int64_t GetShapeSize(const std::vector& shape)
+{
+ int64_t shapeSize = 1;
+ for (auto i : shape) {
+ shapeSize *= i;
+ }
+ return shapeSize;
}
-int Init(int32_t deviceId, aclrtStream* stream) {
- // 固定写法,资源初始化
- auto ret = aclInit(nullptr);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclInit failed. ERROR: %d\n", ret); return ret);
- ret = aclrtSetDevice(deviceId);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSetDevice failed. ERROR: %d\n", ret); return ret);
- ret = aclrtCreateStream(stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtCreateStream failed. ERROR: %d\n", ret); return ret);
- return 0;
+int Init(int32_t deviceId, aclrtStream* stream)
+{
+ // 固定写法,资源初始化
+ auto ret = aclInit(nullptr);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclInit failed. ERROR: %d\n", ret); return ret);
+ ret = aclrtSetDevice(deviceId);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSetDevice failed. ERROR: %d\n", ret); return ret);
+ ret = aclrtCreateStream(stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtCreateStream failed. ERROR: %d\n", ret); return ret);
+ return 0;
}
template
-int CreateAclTensor(const std::vector& hostData, const std::vector& shape, void** deviceAddr,
- aclDataType dataType, aclTensor** tensor) {
- auto size = GetShapeSize(shape) * sizeof(T);
- // 调用aclrtMalloc申请device侧内存
- auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
- // 调用aclrtMemcpy将host侧数据复制到device侧内存上
- ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
-
- // 计算连续tensor的strides
- std::vector strides(shape.size(), 1);
- for (int64_t i = shape.size() - 2; i >= 0; i--) {
- strides[i] = shape[i + 1] * strides[i + 1];
- }
-
- // 调用aclCreateTensor接口创建aclTensor
- *tensor = aclCreateTensor(shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND,
- shape.data(), shape.size(), *deviceAddr);
- return 0;
+int CreateAclTensor(
+ const std::vector& hostData, const std::vector& shape, void** deviceAddr, aclDataType dataType,
+ aclTensor** tensor)
+{
+ auto size = GetShapeSize(shape) * sizeof(T);
+ // 调用aclrtMalloc申请device侧内存
+ auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
+ // 调用aclrtMemcpy将host侧数据复制到device侧内存上
+ ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
+
+ // 计算连续tensor的strides
+ std::vector strides(shape.size(), 1);
+ for (int64_t i = shape.size() - 2; i >= 0; i--) {
+ strides[i] = shape[i + 1] * strides[i + 1];
+ }
+
+ // 调用aclCreateTensor接口创建aclTensor
+ *tensor = aclCreateTensor(
+ shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(),
+ *deviceAddr);
+ return 0;
}
-int main() {
- // 1. (固定写法)device/stream初始化,参考acl API手册
- // 根据自己的实际device填写deviceId
- int32_t deviceId = 0;
- aclrtStream stream;
- auto ret = Init(deviceId, &stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
-
- // 2. 构造输入与输出,需要根据API的接口自定义构造
- std::vector selfShape1 = {2, 3};
- std::vector selfShape2 = {1, 3};
- std::vector otherShape1 = {2, 3};
- std::vector otherShape2 = {1, 3};
- std::vector outShape1 = {2, 3};
- std::vector outShape2 = {1, 3};
- std::vector alphaShape = {1};
- void* input1DeviceAddr = nullptr;
- void* input2DeviceAddr = nullptr;
- void* other1DeviceAddr = nullptr;
- void* other2DeviceAddr = nullptr;
- void* out1DeviceAddr = nullptr;
- void* out2DeviceAddr = nullptr;
- void* alphaDeviceAddr = nullptr;
- aclTensor* input1 = nullptr;
- aclTensor* input2 = nullptr;
- aclTensor* other1 = nullptr;
- aclTensor* other2 = nullptr;
- aclTensor* alpha = nullptr;
- aclTensor* out1 = nullptr;
- aclTensor* out2 = nullptr;
- std::vector input1HostData = {1, 2, 3, 4, 5, 6};
- std::vector input2HostData = {7, 8, 9};
- std::vector other1HostData = {1, 2, 3, 4, 5, 6};
- std::vector other2HostData = {7, 8, 9};
- std::vector out1HostData(6, 0);
- std::vector out2HostData(3, 0);
- std::vector alphaValueHostData = {1.2f};
- float alphaValue = 1.2f;
- // 创建input1 aclTensor
- ret = CreateAclTensor(input1HostData, selfShape1, &input1DeviceAddr, aclDataType::ACL_FLOAT, &input1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建input2 aclTensor
- ret = CreateAclTensor(input2HostData, selfShape2, &input2DeviceAddr, aclDataType::ACL_FLOAT, &input2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建other1 aclTensor
- ret = CreateAclTensor(other1HostData, otherShape1, &other1DeviceAddr, aclDataType::ACL_FLOAT, &other1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建other2 aclTensor
- ret = CreateAclTensor(other2HostData, otherShape2, &other2DeviceAddr, aclDataType::ACL_FLOAT, &other2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建alpha aclTensor
- ret = CreateAclTensor(alphaValueHostData, alphaShape, &alphaDeviceAddr, aclDataType::ACL_FLOAT, &alpha);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建out1 aclTensor
- ret = CreateAclTensor(out1HostData, outShape1, &out1DeviceAddr, aclDataType::ACL_FLOAT, &out1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建out2 aclTensor
- ret = CreateAclTensor(out2HostData, outShape2, &out2DeviceAddr, aclDataType::ACL_FLOAT, &out2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
-
- std::vector tempInput1{input1, input2};
- aclTensorList* tensorListInput1 = aclCreateTensorList(tempInput1.data(), tempInput1.size());
- std::vector tempInput2{other1, other2};
- aclTensorList* tensorListInput2 = aclCreateTensorList(tempInput2.data(), tempInput2.size());
- std::vector tempOutput{out1, out2};
- aclTensorList* tensorListOutput = aclCreateTensorList(tempOutput.data(), tempOutput.size());
-
- // 3. 调用CANN算子库API,需要修改为具体的API名称
- uint64_t workspaceSize = 0;
- aclOpExecutor* executor;
- // 调用aclnnForeachAddList第一段接口
- ret = aclnnForeachAddListGetWorkspaceSize(tensorListInput1, tensorListInput2, alpha, tensorListOutput, &workspaceSize, &executor);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddListGetWorkspaceSize failed. ERROR: %d\n", ret); return ret);
- // 根据第一段接口计算出的workspaceSize申请device内存
- void* workspaceAddr = nullptr;
- if (workspaceSize > 0) {
- ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
- }
- // 调用aclnnForeachAddList第二段接口
- ret = aclnnForeachAddList(workspaceAddr, workspaceSize, executor, stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddList failed. ERROR: %d\n", ret); return ret);
-
- // 4. (固定写法)同步等待任务执行结束
- ret = aclrtSynchronizeStream(stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
-
- // 5. 获取输出的值,将device侧内存上的结果复制至host侧,需要根据具体API的接口定义修改
- auto size = GetShapeSize(outShape1);
- std::vector out1Data(size, 0);
- ret = aclrtMemcpy(out1Data.data(), out1Data.size() * sizeof(out1Data[0]), out1DeviceAddr,
- size * sizeof(out1Data[0]), ACL_MEMCPY_DEVICE_TO_HOST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
- for (int64_t i = 0; i < size; i++) {
- LOG_PRINT("out1 result[%ld] is: %f\n", i, out1Data[i]);
- }
-
- size = GetShapeSize(outShape2);
- std::vector out2Data(size, 0);
- ret = aclrtMemcpy(out2Data.data(), out2Data.size() * sizeof(out2Data[0]), out2DeviceAddr,
- size * sizeof(out2Data[0]), ACL_MEMCPY_DEVICE_TO_HOST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
- for (int64_t i = 0; i < size; i++) {
- LOG_PRINT("out2 result[%ld] is: %f\n", i, out2Data[i]);
- }
-
- // 6. 释放aclTensor,需要根据具体API的接口定义修改
- aclDestroyTensorList(tensorListInput1);
- aclDestroyTensorList(tensorListInput2);
- aclDestroyTensorList(tensorListOutput);
- aclDestroyTensor(alpha);
-
- // 7.释放device资源,需要根据具体API的接口定义修改
- aclrtFree(input1DeviceAddr);
- aclrtFree(input2DeviceAddr);
- aclrtFree(other1DeviceAddr);
- aclrtFree(other2DeviceAddr);
- aclrtFree(out1DeviceAddr);
- aclrtFree(out2DeviceAddr);
- aclrtFree(alphaDeviceAddr);
- if (workspaceSize > 0) {
- aclrtFree(workspaceAddr);
- }
- aclrtDestroyStream(stream);
- aclrtResetDevice(deviceId);
- aclFinalize();
- return 0;
+int main()
+{
+ // 1. (固定写法)device/stream初始化,参考acl API手册
+ // 根据自己的实际device填写deviceId
+ int32_t deviceId = 0;
+ aclrtStream stream;
+ auto ret = Init(deviceId, &stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
+
+ // 2. 构造输入与输出,需要根据API的接口自定义构造
+ std::vector selfShape1 = {2, 3};
+ std::vector selfShape2 = {1, 3};
+ std::vector otherShape1 = {2, 3};
+ std::vector otherShape2 = {1, 3};
+ std::vector outShape1 = {2, 3};
+ std::vector outShape2 = {1, 3};
+ std::vector alphaShape = {1};
+ void* input1DeviceAddr = nullptr;
+ void* input2DeviceAddr = nullptr;
+ void* other1DeviceAddr = nullptr;
+ void* other2DeviceAddr = nullptr;
+ void* out1DeviceAddr = nullptr;
+ void* out2DeviceAddr = nullptr;
+ void* alphaDeviceAddr = nullptr;
+ aclTensor* input1 = nullptr;
+ aclTensor* input2 = nullptr;
+ aclTensor* other1 = nullptr;
+ aclTensor* other2 = nullptr;
+ aclTensor* alpha = nullptr;
+ aclTensor* out1 = nullptr;
+ aclTensor* out2 = nullptr;
+ std::vector input1HostData = {1, 2, 3, 4, 5, 6};
+ std::vector input2HostData = {7, 8, 9};
+ std::vector other1HostData = {1, 2, 3, 4, 5, 6};
+ std::vector other2HostData = {7, 8, 9};
+ std::vector out1HostData(6, 0);
+ std::vector out2HostData(3, 0);
+ std::vector alphaValueHostData = {1.2f};
+ float alphaValue = 1.2f;
+ // 创建input1 aclTensor
+ ret = CreateAclTensor(input1HostData, selfShape1, &input1DeviceAddr, aclDataType::ACL_FLOAT, &input1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建input2 aclTensor
+ ret = CreateAclTensor(input2HostData, selfShape2, &input2DeviceAddr, aclDataType::ACL_FLOAT, &input2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建other1 aclTensor
+ ret = CreateAclTensor(other1HostData, otherShape1, &other1DeviceAddr, aclDataType::ACL_FLOAT, &other1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建other2 aclTensor
+ ret = CreateAclTensor(other2HostData, otherShape2, &other2DeviceAddr, aclDataType::ACL_FLOAT, &other2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建alpha aclTensor
+ ret = CreateAclTensor(alphaValueHostData, alphaShape, &alphaDeviceAddr, aclDataType::ACL_FLOAT, &alpha);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建out1 aclTensor
+ ret = CreateAclTensor(out1HostData, outShape1, &out1DeviceAddr, aclDataType::ACL_FLOAT, &out1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建out2 aclTensor
+ ret = CreateAclTensor(out2HostData, outShape2, &out2DeviceAddr, aclDataType::ACL_FLOAT, &out2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+
+ std::vector tempInput1{input1, input2};
+ aclTensorList* tensorListInput1 = aclCreateTensorList(tempInput1.data(), tempInput1.size());
+ std::vector tempInput2{other1, other2};
+ aclTensorList* tensorListInput2 = aclCreateTensorList(tempInput2.data(), tempInput2.size());
+ std::vector tempOutput{out1, out2};
+ aclTensorList* tensorListOutput = aclCreateTensorList(tempOutput.data(), tempOutput.size());
+
+ // 3. 调用CANN算子库API,需要修改为具体的API名称
+ uint64_t workspaceSize = 0;
+ aclOpExecutor* executor;
+ // 调用aclnnForeachAddList第一段接口
+ ret = aclnnForeachAddListGetWorkspaceSize(
+ tensorListInput1, tensorListInput2, alpha, tensorListOutput, &workspaceSize, &executor);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddListGetWorkspaceSize failed. ERROR: %d\n", ret);
+ return ret);
+ // 根据第一段接口计算出的workspaceSize申请device内存
+ void* workspaceAddr = nullptr;
+ if (workspaceSize > 0) {
+ ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
+ }
+ // 调用aclnnForeachAddList第二段接口
+ ret = aclnnForeachAddList(workspaceAddr, workspaceSize, executor, stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddList failed. ERROR: %d\n", ret); return ret);
+
+ // 4. (固定写法)同步等待任务执行结束
+ ret = aclrtSynchronizeStream(stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
+
+ // 5. 获取输出的值,将device侧内存上的结果复制至host侧,需要根据具体API的接口定义修改
+ auto size = GetShapeSize(outShape1);
+ std::vector out1Data(size, 0);
+ ret = aclrtMemcpy(
+ out1Data.data(), out1Data.size() * sizeof(out1Data[0]), out1DeviceAddr, size * sizeof(out1Data[0]),
+ ACL_MEMCPY_DEVICE_TO_HOST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
+ for (int64_t i = 0; i < size; i++) {
+ LOG_PRINT("out1 result[%ld] is: %f\n", i, out1Data[i]);
+ }
+
+ size = GetShapeSize(outShape2);
+ std::vector out2Data(size, 0);
+ ret = aclrtMemcpy(
+ out2Data.data(), out2Data.size() * sizeof(out2Data[0]), out2DeviceAddr, size * sizeof(out2Data[0]),
+ ACL_MEMCPY_DEVICE_TO_HOST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
+ for (int64_t i = 0; i < size; i++) {
+ LOG_PRINT("out2 result[%ld] is: %f\n", i, out2Data[i]);
+ }
+
+ // 6. 释放aclTensor,需要根据具体API的接口定义修改
+ aclDestroyTensorList(tensorListInput1);
+ aclDestroyTensorList(tensorListInput2);
+ aclDestroyTensorList(tensorListOutput);
+ aclDestroyTensor(alpha);
+
+ // 7.释放device资源,需要根据具体API的接口定义修改
+ aclrtFree(input1DeviceAddr);
+ aclrtFree(input2DeviceAddr);
+ aclrtFree(other1DeviceAddr);
+ aclrtFree(other2DeviceAddr);
+ aclrtFree(out1DeviceAddr);
+ aclrtFree(out2DeviceAddr);
+ aclrtFree(alphaDeviceAddr);
+ if (workspaceSize > 0) {
+ aclrtFree(workspaceAddr);
+ }
+ aclrtDestroyStream(stream);
+ aclrtResetDevice(deviceId);
+ aclFinalize();
+ return 0;
}
diff --git a/foreach/foreach_add_list/examples/test_aclnn_foreach_add_list_v2.cpp b/foreach/foreach_add_list/examples/test_aclnn_foreach_add_list_v2.cpp
index 2a1b82ab..d6a659d5 100644
--- a/foreach/foreach_add_list/examples/test_aclnn_foreach_add_list_v2.cpp
+++ b/foreach/foreach_add_list/examples/test_aclnn_foreach_add_list_v2.cpp
@@ -14,180 +14,190 @@
#include "aclnnop/aclnn_foreach_add_list_v2.h"
#define CHECK_RET(cond, return_expr) \
- do { \
- if (!(cond)) { \
- return_expr; \
- } \
- } while (0)
-
-#define LOG_PRINT(message, ...) \
- do { \
- printf(message, ##__VA_ARGS__); \
- } while (0)
-
-int64_t GetShapeSize(const std::vector& shape) {
- int64_t shapeSize = 1;
- for (auto i : shape) {
- shapeSize *= i;
- }
- return shapeSize;
+ do { \
+ if (!(cond)) { \
+ return_expr; \
+ } \
+ } while (0)
+
+#define LOG_PRINT(message, ...) \
+ do { \
+ printf(message, ##__VA_ARGS__); \
+ } while (0)
+
+int64_t GetShapeSize(const std::vector& shape)
+{
+ int64_t shapeSize = 1;
+ for (auto i : shape) {
+ shapeSize *= i;
+ }
+ return shapeSize;
}
-int Init(int32_t deviceId, aclrtStream* stream) {
- // 固定写法,资源初始化
- auto ret = aclInit(nullptr);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclInit failed. ERROR: %d\n", ret); return ret);
- ret = aclrtSetDevice(deviceId);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSetDevice failed. ERROR: %d\n", ret); return ret);
- ret = aclrtCreateStream(stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtCreateStream failed. ERROR: %d\n", ret); return ret);
- return 0;
+int Init(int32_t deviceId, aclrtStream* stream)
+{
+ // 固定写法,资源初始化
+ auto ret = aclInit(nullptr);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclInit failed. ERROR: %d\n", ret); return ret);
+ ret = aclrtSetDevice(deviceId);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSetDevice failed. ERROR: %d\n", ret); return ret);
+ ret = aclrtCreateStream(stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtCreateStream failed. ERROR: %d\n", ret); return ret);
+ return 0;
}
template
-int CreateAclTensor(const std::vector& hostData, const std::vector& shape, void** deviceAddr,
- aclDataType dataType, aclTensor** tensor) {
- auto size = GetShapeSize(shape) * sizeof(T);
- // 调用aclrtMalloc申请device侧内存
- auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
- // 调用aclrtMemcpy将host侧数据复制到device侧内存上
- ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
-
- // 计算连续tensor的strides
- std::vector strides(shape.size(), 1);
- for (int64_t i = shape.size() - 2; i >= 0; i--) {
- strides[i] = shape[i + 1] * strides[i + 1];
- }
-
- // 调用aclCreateTensor接口创建aclTensor
- *tensor = aclCreateTensor(shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND,
- shape.data(), shape.size(), *deviceAddr);
- return 0;
+int CreateAclTensor(
+ const std::vector& hostData, const std::vector& shape, void** deviceAddr, aclDataType dataType,
+ aclTensor** tensor)
+{
+ auto size = GetShapeSize(shape) * sizeof(T);
+ // 调用aclrtMalloc申请device侧内存
+ auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
+ // 调用aclrtMemcpy将host侧数据复制到device侧内存上
+ ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
+
+ // 计算连续tensor的strides
+ std::vector strides(shape.size(), 1);
+ for (int64_t i = shape.size() - 2; i >= 0; i--) {
+ strides[i] = shape[i + 1] * strides[i + 1];
+ }
+
+ // 调用aclCreateTensor接口创建aclTensor
+ *tensor = aclCreateTensor(
+ shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(),
+ *deviceAddr);
+ return 0;
}
-int main() {
- // 1. (固定写法)device/stream初始化,参考acl API手册
- // 根据自己的实际device填写deviceId
- int32_t deviceId = 0;
- aclrtStream stream;
- auto ret = Init(deviceId, &stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
-
- // 2. 构造输入与输出,需要根据API的接口自定义构造
- std::vector selfShape1 = {2, 3};
- std::vector selfShape2 = {1, 3};
- std::vector otherShape1 = {2, 3};
- std::vector otherShape2 = {1, 3};
- std::vector outShape1 = {2, 3};
- std::vector outShape2 = {1, 3};
- void* input1DeviceAddr = nullptr;
- void* input2DeviceAddr = nullptr;
- void* other1DeviceAddr = nullptr;
- void* other2DeviceAddr = nullptr;
- void* out1DeviceAddr = nullptr;
- void* out2DeviceAddr = nullptr;
- aclTensor* input1 = nullptr;
- aclTensor* input2 = nullptr;
- aclTensor* other1 = nullptr;
- aclTensor* other2 = nullptr;
- aclScalar* alpha = nullptr;
- aclTensor* out1 = nullptr;
- aclTensor* out2 = nullptr;
- std::vector input1HostData = {1, 2, 3, 4, 5, 6};
- std::vector input2HostData = {7, 8, 9};
- std::vector other1HostData = {1, 2, 3, 4, 5, 6};
- std::vector other2HostData = {7, 8, 9};
- std::vector out1HostData(6, 0);
- std::vector out2HostData(3, 0);
- float alphaValue = 1.2f;
- // 创建input1 aclTensor
- ret = CreateAclTensor(input1HostData, selfShape1, &input1DeviceAddr, aclDataType::ACL_FLOAT, &input1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建input2 aclTensor
- ret = CreateAclTensor(input2HostData, selfShape2, &input2DeviceAddr, aclDataType::ACL_FLOAT, &input2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建other1 aclTensor
- ret = CreateAclTensor(other1HostData, otherShape1, &other1DeviceAddr, aclDataType::ACL_FLOAT, &other1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建other2 aclTensor
- ret = CreateAclTensor(other2HostData, otherShape2, &other2DeviceAddr, aclDataType::ACL_FLOAT, &other2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建alpha aclScalar
- alpha = aclCreateScalar(&alphaValue, aclDataType::ACL_FLOAT);
- CHECK_RET(alpha != nullptr, return ret);
- // 创建out1 aclTensor
- ret = CreateAclTensor(out1HostData, outShape1, &out1DeviceAddr, aclDataType::ACL_FLOAT, &out1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建out2 aclTensor
- ret = CreateAclTensor(out2HostData, outShape2, &out2DeviceAddr, aclDataType::ACL_FLOAT, &out2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
-
- std::vector tempInput1{input1, input2};
- aclTensorList* tensorListInput1 = aclCreateTensorList(tempInput1.data(), tempInput1.size());
- std::vector tempInput2{other1, other2};
- aclTensorList* tensorListInput2 = aclCreateTensorList(tempInput2.data(), tempInput2.size());
- std::vector tempOutput{out1, out2};
- aclTensorList* tensorListOutput = aclCreateTensorList(tempOutput.data(), tempOutput.size());
-
- // 3. 调用CANN算子库API,需要修改为具体的API名称
- uint64_t workspaceSize = 0;
- aclOpExecutor* executor;
- // 调用aclnnForeachAddListV2第一段接口
- ret = aclnnForeachAddListV2GetWorkspaceSize(tensorListInput1, tensorListInput2, alpha, tensorListOutput, &workspaceSize, &executor);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddListV2GetWorkspaceSize failed. ERROR: %d\n", ret); return ret);
- // 根据第一段接口计算出的workspaceSize申请device内存
- void* workspaceAddr = nullptr;
- if (workspaceSize > 0) {
- ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
- }
- // 调用aclnnForeachAddListV2第二段接口
- ret = aclnnForeachAddListV2(workspaceAddr, workspaceSize, executor, stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddListV2 failed. ERROR: %d\n", ret); return ret);
-
- // 4. (固定写法)同步等待任务执行结束
- ret = aclrtSynchronizeStream(stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
-
- // 5. 获取输出的值,将device侧内存上的结果复制至host侧,需要根据具体API的接口定义修改
- auto size = GetShapeSize(outShape1);
- std::vector out1Data(size, 0);
- ret = aclrtMemcpy(out1Data.data(), out1Data.size() * sizeof(out1Data[0]), out1DeviceAddr,
- size * sizeof(out1Data[0]), ACL_MEMCPY_DEVICE_TO_HOST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
- for (int64_t i = 0; i < size; i++) {
- LOG_PRINT("out1 result[%ld] is: %f\n", i, out1Data[i]);
- }
-
- size = GetShapeSize(outShape2);
- std::vector out2Data(size, 0);
- ret = aclrtMemcpy(out2Data.data(), out2Data.size() * sizeof(out2Data[0]), out2DeviceAddr,
- size * sizeof(out2Data[0]), ACL_MEMCPY_DEVICE_TO_HOST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
- for (int64_t i = 0; i < size; i++) {
- LOG_PRINT("out2 result[%ld] is: %f\n", i, out2Data[i]);
- }
-
- // 6. 释放aclTensor和aclScalar,需要根据具体API的接口定义修改
- aclDestroyTensorList(tensorListInput1);
- aclDestroyTensorList(tensorListInput2);
- aclDestroyTensorList(tensorListOutput);
- aclDestroyScalar(alpha);
-
- // 7.释放device资源,需要根据具体API的接口定义修改
- aclrtFree(input1DeviceAddr);
- aclrtFree(input2DeviceAddr);
- aclrtFree(other1DeviceAddr);
- aclrtFree(other2DeviceAddr);
- aclrtFree(out1DeviceAddr);
- aclrtFree(out2DeviceAddr);
- if (workspaceSize > 0) {
- aclrtFree(workspaceAddr);
- }
- aclrtDestroyStream(stream);
- aclrtResetDevice(deviceId);
- aclFinalize();
- return 0;
-}
\ No newline at end of file
+int main()
+{
+ // 1. (固定写法)device/stream初始化,参考acl API手册
+ // 根据自己的实际device填写deviceId
+ int32_t deviceId = 0;
+ aclrtStream stream;
+ auto ret = Init(deviceId, &stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
+
+ // 2. 构造输入与输出,需要根据API的接口自定义构造
+ std::vector selfShape1 = {2, 3};
+ std::vector selfShape2 = {1, 3};
+ std::vector otherShape1 = {2, 3};
+ std::vector otherShape2 = {1, 3};
+ std::vector outShape1 = {2, 3};
+ std::vector outShape2 = {1, 3};
+ void* input1DeviceAddr = nullptr;
+ void* input2DeviceAddr = nullptr;
+ void* other1DeviceAddr = nullptr;
+ void* other2DeviceAddr = nullptr;
+ void* out1DeviceAddr = nullptr;
+ void* out2DeviceAddr = nullptr;
+ aclTensor* input1 = nullptr;
+ aclTensor* input2 = nullptr;
+ aclTensor* other1 = nullptr;
+ aclTensor* other2 = nullptr;
+ aclScalar* alpha = nullptr;
+ aclTensor* out1 = nullptr;
+ aclTensor* out2 = nullptr;
+ std::vector input1HostData = {1, 2, 3, 4, 5, 6};
+ std::vector input2HostData = {7, 8, 9};
+ std::vector other1HostData = {1, 2, 3, 4, 5, 6};
+ std::vector other2HostData = {7, 8, 9};
+ std::vector out1HostData(6, 0);
+ std::vector out2HostData(3, 0);
+ float alphaValue = 1.2f;
+ // 创建input1 aclTensor
+ ret = CreateAclTensor(input1HostData, selfShape1, &input1DeviceAddr, aclDataType::ACL_FLOAT, &input1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建input2 aclTensor
+ ret = CreateAclTensor(input2HostData, selfShape2, &input2DeviceAddr, aclDataType::ACL_FLOAT, &input2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建other1 aclTensor
+ ret = CreateAclTensor(other1HostData, otherShape1, &other1DeviceAddr, aclDataType::ACL_FLOAT, &other1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建other2 aclTensor
+ ret = CreateAclTensor(other2HostData, otherShape2, &other2DeviceAddr, aclDataType::ACL_FLOAT, &other2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建alpha aclScalar
+ alpha = aclCreateScalar(&alphaValue, aclDataType::ACL_FLOAT);
+ CHECK_RET(alpha != nullptr, return ret);
+ // 创建out1 aclTensor
+ ret = CreateAclTensor(out1HostData, outShape1, &out1DeviceAddr, aclDataType::ACL_FLOAT, &out1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建out2 aclTensor
+ ret = CreateAclTensor(out2HostData, outShape2, &out2DeviceAddr, aclDataType::ACL_FLOAT, &out2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+
+ std::vector tempInput1{input1, input2};
+ aclTensorList* tensorListInput1 = aclCreateTensorList(tempInput1.data(), tempInput1.size());
+ std::vector tempInput2{other1, other2};
+ aclTensorList* tensorListInput2 = aclCreateTensorList(tempInput2.data(), tempInput2.size());
+ std::vector tempOutput{out1, out2};
+ aclTensorList* tensorListOutput = aclCreateTensorList(tempOutput.data(), tempOutput.size());
+
+ // 3. 调用CANN算子库API,需要修改为具体的API名称
+ uint64_t workspaceSize = 0;
+ aclOpExecutor* executor;
+ // 调用aclnnForeachAddListV2第一段接口
+ ret = aclnnForeachAddListV2GetWorkspaceSize(
+ tensorListInput1, tensorListInput2, alpha, tensorListOutput, &workspaceSize, &executor);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddListV2GetWorkspaceSize failed. ERROR: %d\n", ret);
+ return ret);
+ // 根据第一段接口计算出的workspaceSize申请device内存
+ void* workspaceAddr = nullptr;
+ if (workspaceSize > 0) {
+ ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
+ }
+ // 调用aclnnForeachAddListV2第二段接口
+ ret = aclnnForeachAddListV2(workspaceAddr, workspaceSize, executor, stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddListV2 failed. ERROR: %d\n", ret); return ret);
+
+ // 4. (固定写法)同步等待任务执行结束
+ ret = aclrtSynchronizeStream(stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
+
+ // 5. 获取输出的值,将device侧内存上的结果复制至host侧,需要根据具体API的接口定义修改
+ auto size = GetShapeSize(outShape1);
+ std::vector out1Data(size, 0);
+ ret = aclrtMemcpy(
+ out1Data.data(), out1Data.size() * sizeof(out1Data[0]), out1DeviceAddr, size * sizeof(out1Data[0]),
+ ACL_MEMCPY_DEVICE_TO_HOST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
+ for (int64_t i = 0; i < size; i++) {
+ LOG_PRINT("out1 result[%ld] is: %f\n", i, out1Data[i]);
+ }
+
+ size = GetShapeSize(outShape2);
+ std::vector out2Data(size, 0);
+ ret = aclrtMemcpy(
+ out2Data.data(), out2Data.size() * sizeof(out2Data[0]), out2DeviceAddr, size * sizeof(out2Data[0]),
+ ACL_MEMCPY_DEVICE_TO_HOST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
+ for (int64_t i = 0; i < size; i++) {
+ LOG_PRINT("out2 result[%ld] is: %f\n", i, out2Data[i]);
+ }
+
+ // 6. 释放aclTensor和aclScalar,需要根据具体API的接口定义修改
+ aclDestroyTensorList(tensorListInput1);
+ aclDestroyTensorList(tensorListInput2);
+ aclDestroyTensorList(tensorListOutput);
+ aclDestroyScalar(alpha);
+
+ // 7.释放device资源,需要根据具体API的接口定义修改
+ aclrtFree(input1DeviceAddr);
+ aclrtFree(input2DeviceAddr);
+ aclrtFree(other1DeviceAddr);
+ aclrtFree(other2DeviceAddr);
+ aclrtFree(out1DeviceAddr);
+ aclrtFree(out2DeviceAddr);
+ if (workspaceSize > 0) {
+ aclrtFree(workspaceAddr);
+ }
+ aclrtDestroyStream(stream);
+ aclrtResetDevice(deviceId);
+ aclFinalize();
+ return 0;
+}
diff --git a/foreach/foreach_add_scalar/docs/aclnnForeachAddScalar.md b/foreach/foreach_add_scalar/docs/aclnnForeachAddScalar.md
index 9a79c778..35b9eb76 100644
--- a/foreach/foreach_add_scalar/docs/aclnnForeachAddScalar.md
+++ b/foreach/foreach_add_scalar/docs/aclnnForeachAddScalar.md
@@ -129,7 +129,7 @@ aclnnStatus aclnnForeachAddScalar(
- Atlas A2 训练系列产品/Atlas A2 推理系列产品、Atlas A3 训练系列产品/Atlas A3 推理系列产品:
-
+
参数`scalar`数据类型与入参`x`的数据类型具有一定对应关系:
- 当`x`的数据类型为FLOAT32、FLOAT16、INT32时,数据类型与`x`的数据类型保持一致。
- 当`x`的数据类型为BFLOAT16时,数据类型支持FLOAT32。
@@ -145,7 +145,7 @@ aclnnStatus aclnnForeachAddScalar(
aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。
第一段接口完成入参校验,出现以下场景时报错:
-
+
diff --git a/foreach/foreach_add_scalar/docs/aclnnForeachAddScalarV2.md b/foreach/foreach_add_scalar/docs/aclnnForeachAddScalarV2.md
index 43925000..4ab008c1 100644
--- a/foreach/foreach_add_scalar/docs/aclnnForeachAddScalarV2.md
+++ b/foreach/foreach_add_scalar/docs/aclnnForeachAddScalarV2.md
@@ -17,7 +17,7 @@
- 接口功能:将指定的标量值加到张量列表中的每个张量中。本接口相较于[aclnnForeachAddScalar](aclnnForeachAddScalar.md),修改入参scalar的结构类型aclTensor为aclScalar,请根据实际情况选择合适的接口。
- 计算公式:
-
+
$$
x = [{x_0}, {x_1}, ... {x_{n-1}}]\\
y = [{y_0}, {y_1}, ... {y_{n-1}}]\\
@@ -145,7 +145,7 @@ aclnnStatus aclnnForeachAddScalarV2(
- **返回值**
aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。
-
+
第一段接口完成入参校验,出现以下场景时报错:
@@ -171,7 +171,7 @@ aclnnStatus aclnnForeachAddScalarV2(
| 161002 |
- | x、scalar和out的数据类型不在支持的范围之内。 |
+ x、scalar和out的数据类型不在支持的范围之内。 |
| x和out的数据类型不一致。 |
diff --git a/foreach/foreach_add_scalar/examples/test_aclnn_foreach_add_scalar.cpp b/foreach/foreach_add_scalar/examples/test_aclnn_foreach_add_scalar.cpp
index 8efc70ce..a1bc95c3 100644
--- a/foreach/foreach_add_scalar/examples/test_aclnn_foreach_add_scalar.cpp
+++ b/foreach/foreach_add_scalar/examples/test_aclnn_foreach_add_scalar.cpp
@@ -14,163 +14,172 @@
#include "aclnnop/aclnn_foreach_add_scalar.h"
#define CHECK_RET(cond, return_expr) \
- do { \
- if (!(cond)) { \
- return_expr; \
- } \
- } while (0)
-
-#define LOG_PRINT(message, ...) \
- do { \
- printf(message, ##__VA_ARGS__); \
- } while (0)
-
-int64_t GetShapeSize(const std::vector& shape) {
- int64_t shapeSize = 1;
- for (auto i : shape) {
- shapeSize *= i;
- }
- return shapeSize;
+ do { \
+ if (!(cond)) { \
+ return_expr; \
+ } \
+ } while (0)
+
+#define LOG_PRINT(message, ...) \
+ do { \
+ printf(message, ##__VA_ARGS__); \
+ } while (0)
+
+int64_t GetShapeSize(const std::vector& shape)
+{
+ int64_t shapeSize = 1;
+ for (auto i : shape) {
+ shapeSize *= i;
+ }
+ return shapeSize;
}
-int Init(int32_t deviceId, aclrtStream* stream) {
- // 固定写法,资源初始化
- auto ret = aclInit(nullptr);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclInit failed. ERROR: %d\n", ret); return ret);
- ret = aclrtSetDevice(deviceId);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSetDevice failed. ERROR: %d\n", ret); return ret);
- ret = aclrtCreateStream(stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtCreateStream failed. ERROR: %d\n", ret); return ret);
- return 0;
+int Init(int32_t deviceId, aclrtStream* stream)
+{
+ // 固定写法,资源初始化
+ auto ret = aclInit(nullptr);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclInit failed. ERROR: %d\n", ret); return ret);
+ ret = aclrtSetDevice(deviceId);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSetDevice failed. ERROR: %d\n", ret); return ret);
+ ret = aclrtCreateStream(stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtCreateStream failed. ERROR: %d\n", ret); return ret);
+ return 0;
}
template
-int CreateAclTensor(const std::vector& hostData, const std::vector& shape, void** deviceAddr,
- aclDataType dataType, aclTensor** tensor) {
- auto size = GetShapeSize(shape) * sizeof(T);
- // 调用aclrtMalloc申请device侧内存
- auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
- // 调用aclrtMemcpy将host侧数据复制到device侧内存上
- ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
-
- // 计算连续tensor的strides
- std::vector strides(shape.size(), 1);
- for (int64_t i = shape.size() - 2; i >= 0; i--) {
- strides[i] = shape[i + 1] * strides[i + 1];
- }
-
- // 调用aclCreateTensor接口创建aclTensor
- *tensor = aclCreateTensor(shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND,
- shape.data(), shape.size(), *deviceAddr);
- return 0;
+int CreateAclTensor(
+ const std::vector& hostData, const std::vector& shape, void** deviceAddr, aclDataType dataType,
+ aclTensor** tensor)
+{
+ auto size = GetShapeSize(shape) * sizeof(T);
+ // 调用aclrtMalloc申请device侧内存
+ auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
+ // 调用aclrtMemcpy将host侧数据复制到device侧内存上
+ ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
+
+ // 计算连续tensor的strides
+ std::vector strides(shape.size(), 1);
+ for (int64_t i = shape.size() - 2; i >= 0; i--) {
+ strides[i] = shape[i + 1] * strides[i + 1];
+ }
+
+ // 调用aclCreateTensor接口创建aclTensor
+ *tensor = aclCreateTensor(
+ shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(),
+ *deviceAddr);
+ return 0;
}
-int main() {
- // 1. (固定写法)device/stream初始化,参考acl API手册
- // 根据自己的实际device填写deviceId
- int32_t deviceId = 0;
- aclrtStream stream;
- auto ret = Init(deviceId, &stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
-
- // 2. 构造输入与输出,需要根据API的接口自定义构造
- std::vector selfShape1 = {2, 3};
- std::vector selfShape2 = {1, 3};
- std::vector outShape1 = {2, 3};
- std::vector outShape2 = {1, 3};
- std::vector alphaShape = {1};
- void* input1DeviceAddr = nullptr;
- void* input2DeviceAddr = nullptr;
- void* out1DeviceAddr = nullptr;
- void* out2DeviceAddr = nullptr;
- void* alphaDeviceAddr = nullptr;
- aclTensor* input1 = nullptr;
- aclTensor* input2 = nullptr;
- aclTensor* alpha = nullptr;
- aclTensor* out1 = nullptr;
- aclTensor* out2 = nullptr;
- std::vector input1HostData = {1, 2, 3, 4, 5, 6};
- std::vector input2HostData = {7, 8, 9};
- std::vector out1HostData(6, 0);
- std::vector out2HostData(3, 0);
- std::vector alphaValueHostData = {1.2f};
- // 创建input1 aclTensor
- ret = CreateAclTensor(input1HostData, selfShape1, &input1DeviceAddr, aclDataType::ACL_FLOAT, &input1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建input2 aclTensor
- ret = CreateAclTensor(input2HostData, selfShape2, &input2DeviceAddr, aclDataType::ACL_FLOAT, &input2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建alpha aclTensor
- ret = CreateAclTensor(alphaValueHostData, alphaShape, &alphaDeviceAddr, aclDataType::ACL_FLOAT, &alpha);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建out1 aclTensor
- ret = CreateAclTensor(out1HostData, outShape1, &out1DeviceAddr, aclDataType::ACL_FLOAT, &out1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建out2 aclTensor
- ret = CreateAclTensor(out2HostData, outShape2, &out2DeviceAddr, aclDataType::ACL_FLOAT, &out2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- std::vector tempInput{input1, input2};
- aclTensorList* tensorListInput = aclCreateTensorList(tempInput.data(), tempInput.size());
- std::vector tempOutput{out1, out2};
- aclTensorList* tensorListOutput = aclCreateTensorList(tempOutput.data(), tempOutput.size());
-
- // 3. 调用CANN算子库API,需要修改为具体的API名称
- uint64_t workspaceSize = 0;
- aclOpExecutor* executor;
- // 调用aclnnForeachAddScalar第一段接口
- ret = aclnnForeachAddScalarGetWorkspaceSize(tensorListInput, alpha, tensorListOutput, &workspaceSize, &executor);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddScalarGetWorkspaceSize failed. ERROR: %d\n", ret); return ret);
- // 根据第一段接口计算出的workspaceSize申请device内存
- void* workspaceAddr = nullptr;
- if (workspaceSize > 0) {
- ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
- }
- // 调用aclnnForeachAddScalar第二段接口
- ret = aclnnForeachAddScalar(workspaceAddr, workspaceSize, executor, stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddScalar failed. ERROR: %d\n", ret); return ret);
-
- // 4. (固定写法)同步等待任务执行结束
- ret = aclrtSynchronizeStream(stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
-
- // 5. 获取输出的值,将device侧内存上的结果复制至host侧,需要根据具体API的接口定义修改
- auto size = GetShapeSize(outShape1);
- std::vector out1Data(size, 0);
- ret = aclrtMemcpy(out1Data.data(), out1Data.size() * sizeof(out1Data[0]), out1DeviceAddr,
- size * sizeof(out1Data[0]), ACL_MEMCPY_DEVICE_TO_HOST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
- for (int64_t i = 0; i < size; i++) {
- LOG_PRINT("out1 result[%ld] is: %f\n", i, out1Data[i]);
- }
-
- size = GetShapeSize(outShape2);
- std::vector out2Data(size, 0);
- ret = aclrtMemcpy(out2Data.data(), out2Data.size() * sizeof(out2Data[0]), out2DeviceAddr,
- size * sizeof(out2Data[0]), ACL_MEMCPY_DEVICE_TO_HOST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
- for (int64_t i = 0; i < size; i++) {
- LOG_PRINT("out2 result[%ld] is: %f\n", i, out2Data[i]);
- }
-
- // 6. 释放aclTensor,需要根据具体API的接口定义修改
- aclDestroyTensorList(tensorListInput);
- aclDestroyTensorList(tensorListOutput);
- aclDestroyTensor(alpha);
-
- // 7.释放device资源,需要根据具体API的接口定义修改
- aclrtFree(input1DeviceAddr);
- aclrtFree(input2DeviceAddr);
- aclrtFree(out1DeviceAddr);
- aclrtFree(out2DeviceAddr);
- aclrtFree(alphaDeviceAddr);
- if (workspaceSize > 0) {
- aclrtFree(workspaceAddr);
- }
- aclrtDestroyStream(stream);
- aclrtResetDevice(deviceId);
- aclFinalize();
- return 0;
-}
\ No newline at end of file
+int main()
+{
+ // 1. (固定写法)device/stream初始化,参考acl API手册
+ // 根据自己的实际device填写deviceId
+ int32_t deviceId = 0;
+ aclrtStream stream;
+ auto ret = Init(deviceId, &stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
+
+ // 2. 构造输入与输出,需要根据API的接口自定义构造
+ std::vector selfShape1 = {2, 3};
+ std::vector selfShape2 = {1, 3};
+ std::vector outShape1 = {2, 3};
+ std::vector outShape2 = {1, 3};
+ std::vector alphaShape = {1};
+ void* input1DeviceAddr = nullptr;
+ void* input2DeviceAddr = nullptr;
+ void* out1DeviceAddr = nullptr;
+ void* out2DeviceAddr = nullptr;
+ void* alphaDeviceAddr = nullptr;
+ aclTensor* input1 = nullptr;
+ aclTensor* input2 = nullptr;
+ aclTensor* alpha = nullptr;
+ aclTensor* out1 = nullptr;
+ aclTensor* out2 = nullptr;
+ std::vector input1HostData = {1, 2, 3, 4, 5, 6};
+ std::vector input2HostData = {7, 8, 9};
+ std::vector out1HostData(6, 0);
+ std::vector out2HostData(3, 0);
+ std::vector alphaValueHostData = {1.2f};
+ // 创建input1 aclTensor
+ ret = CreateAclTensor(input1HostData, selfShape1, &input1DeviceAddr, aclDataType::ACL_FLOAT, &input1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建input2 aclTensor
+ ret = CreateAclTensor(input2HostData, selfShape2, &input2DeviceAddr, aclDataType::ACL_FLOAT, &input2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建alpha aclTensor
+ ret = CreateAclTensor(alphaValueHostData, alphaShape, &alphaDeviceAddr, aclDataType::ACL_FLOAT, &alpha);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建out1 aclTensor
+ ret = CreateAclTensor(out1HostData, outShape1, &out1DeviceAddr, aclDataType::ACL_FLOAT, &out1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建out2 aclTensor
+ ret = CreateAclTensor(out2HostData, outShape2, &out2DeviceAddr, aclDataType::ACL_FLOAT, &out2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ std::vector tempInput{input1, input2};
+ aclTensorList* tensorListInput = aclCreateTensorList(tempInput.data(), tempInput.size());
+ std::vector tempOutput{out1, out2};
+ aclTensorList* tensorListOutput = aclCreateTensorList(tempOutput.data(), tempOutput.size());
+
+ // 3. 调用CANN算子库API,需要修改为具体的API名称
+ uint64_t workspaceSize = 0;
+ aclOpExecutor* executor;
+ // 调用aclnnForeachAddScalar第一段接口
+ ret = aclnnForeachAddScalarGetWorkspaceSize(tensorListInput, alpha, tensorListOutput, &workspaceSize, &executor);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddScalarGetWorkspaceSize failed. ERROR: %d\n", ret);
+ return ret);
+ // 根据第一段接口计算出的workspaceSize申请device内存
+ void* workspaceAddr = nullptr;
+ if (workspaceSize > 0) {
+ ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
+ }
+ // 调用aclnnForeachAddScalar第二段接口
+ ret = aclnnForeachAddScalar(workspaceAddr, workspaceSize, executor, stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddScalar failed. ERROR: %d\n", ret); return ret);
+
+ // 4. (固定写法)同步等待任务执行结束
+ ret = aclrtSynchronizeStream(stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
+
+ // 5. 获取输出的值,将device侧内存上的结果复制至host侧,需要根据具体API的接口定义修改
+ auto size = GetShapeSize(outShape1);
+ std::vector out1Data(size, 0);
+ ret = aclrtMemcpy(
+ out1Data.data(), out1Data.size() * sizeof(out1Data[0]), out1DeviceAddr, size * sizeof(out1Data[0]),
+ ACL_MEMCPY_DEVICE_TO_HOST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
+ for (int64_t i = 0; i < size; i++) {
+ LOG_PRINT("out1 result[%ld] is: %f\n", i, out1Data[i]);
+ }
+
+ size = GetShapeSize(outShape2);
+ std::vector out2Data(size, 0);
+ ret = aclrtMemcpy(
+ out2Data.data(), out2Data.size() * sizeof(out2Data[0]), out2DeviceAddr, size * sizeof(out2Data[0]),
+ ACL_MEMCPY_DEVICE_TO_HOST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
+ for (int64_t i = 0; i < size; i++) {
+ LOG_PRINT("out2 result[%ld] is: %f\n", i, out2Data[i]);
+ }
+
+ // 6. 释放aclTensor,需要根据具体API的接口定义修改
+ aclDestroyTensorList(tensorListInput);
+ aclDestroyTensorList(tensorListOutput);
+ aclDestroyTensor(alpha);
+
+ // 7.释放device资源,需要根据具体API的接口定义修改
+ aclrtFree(input1DeviceAddr);
+ aclrtFree(input2DeviceAddr);
+ aclrtFree(out1DeviceAddr);
+ aclrtFree(out2DeviceAddr);
+ aclrtFree(alphaDeviceAddr);
+ if (workspaceSize > 0) {
+ aclrtFree(workspaceAddr);
+ }
+ aclrtDestroyStream(stream);
+ aclrtResetDevice(deviceId);
+ aclFinalize();
+ return 0;
+}
diff --git a/foreach/foreach_add_scalar/examples/test_aclnn_foreach_add_scalar_v2.cpp b/foreach/foreach_add_scalar/examples/test_aclnn_foreach_add_scalar_v2.cpp
index c7661324..f1bb3133 100644
--- a/foreach/foreach_add_scalar/examples/test_aclnn_foreach_add_scalar_v2.cpp
+++ b/foreach/foreach_add_scalar/examples/test_aclnn_foreach_add_scalar_v2.cpp
@@ -14,160 +14,169 @@
#include "aclnnop/aclnn_foreach_add_scalar_v2.h"
#define CHECK_RET(cond, return_expr) \
- do { \
- if (!(cond)) { \
- return_expr; \
- } \
- } while (0)
-
-#define LOG_PRINT(message, ...) \
- do { \
- printf(message, ##__VA_ARGS__); \
- } while (0)
-
-int64_t GetShapeSize(const std::vector& shape) {
- int64_t shapeSize = 1;
- for (auto i : shape) {
- shapeSize *= i;
- }
- return shapeSize;
+ do { \
+ if (!(cond)) { \
+ return_expr; \
+ } \
+ } while (0)
+
+#define LOG_PRINT(message, ...) \
+ do { \
+ printf(message, ##__VA_ARGS__); \
+ } while (0)
+
+int64_t GetShapeSize(const std::vector& shape)
+{
+ int64_t shapeSize = 1;
+ for (auto i : shape) {
+ shapeSize *= i;
+ }
+ return shapeSize;
}
-int Init(int32_t deviceId, aclrtStream* stream) {
- // 固定写法,资源初始化
- auto ret = aclInit(nullptr);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclInit failed. ERROR: %d\n", ret); return ret);
- ret = aclrtSetDevice(deviceId);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSetDevice failed. ERROR: %d\n", ret); return ret);
- ret = aclrtCreateStream(stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtCreateStream failed. ERROR: %d\n", ret); return ret);
- return 0;
+int Init(int32_t deviceId, aclrtStream* stream)
+{
+ // 固定写法,资源初始化
+ auto ret = aclInit(nullptr);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclInit failed. ERROR: %d\n", ret); return ret);
+ ret = aclrtSetDevice(deviceId);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSetDevice failed. ERROR: %d\n", ret); return ret);
+ ret = aclrtCreateStream(stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtCreateStream failed. ERROR: %d\n", ret); return ret);
+ return 0;
}
template
-int CreateAclTensor(const std::vector& hostData, const std::vector& shape, void** deviceAddr,
- aclDataType dataType, aclTensor** tensor) {
- auto size = GetShapeSize(shape) * sizeof(T);
- // 调用aclrtMalloc申请device侧内存
- auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
- // 调用aclrtMemcpy将host侧数据复制到device侧内存上
- ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
-
- // 计算连续tensor的strides
- std::vector strides(shape.size(), 1);
- for (int64_t i = shape.size() - 2; i >= 0; i--) {
- strides[i] = shape[i + 1] * strides[i + 1];
- }
-
- // 调用aclCreateTensor接口创建aclTensor
- *tensor = aclCreateTensor(shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND,
- shape.data(), shape.size(), *deviceAddr);
- return 0;
+int CreateAclTensor(
+ const std::vector& hostData, const std::vector& shape, void** deviceAddr, aclDataType dataType,
+ aclTensor** tensor)
+{
+ auto size = GetShapeSize(shape) * sizeof(T);
+ // 调用aclrtMalloc申请device侧内存
+ auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
+ // 调用aclrtMemcpy将host侧数据复制到device侧内存上
+ ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
+
+ // 计算连续tensor的strides
+ std::vector strides(shape.size(), 1);
+ for (int64_t i = shape.size() - 2; i >= 0; i--) {
+ strides[i] = shape[i + 1] * strides[i + 1];
+ }
+
+ // 调用aclCreateTensor接口创建aclTensor
+ *tensor = aclCreateTensor(
+ shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(),
+ *deviceAddr);
+ return 0;
}
-int main() {
- // 1. (固定写法)device/stream初始化,参考acl API手册
- // 根据自己的实际device填写deviceId
- int32_t deviceId = 0;
- aclrtStream stream;
- auto ret = Init(deviceId, &stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
-
- // 2. 构造输入与输出,需要根据API的接口自定义构造
- std::vector selfShape1 = {2, 3};
- std::vector selfShape2 = {1, 3};
- std::vector outShape1 = {2, 3};
- std::vector outShape2 = {1, 3};
- void* input1DeviceAddr = nullptr;
- void* input2DeviceAddr = nullptr;
- void* out1DeviceAddr = nullptr;
- void* out2DeviceAddr = nullptr;
- aclTensor* input1 = nullptr;
- aclTensor* input2 = nullptr;
- aclScalar* alpha = nullptr;
- aclTensor* out1 = nullptr;
- aclTensor* out2 = nullptr;
- std::vector input1HostData = {1, 2, 3, 4, 5, 6};
- std::vector input2HostData = {7, 8, 9};
- std::vector out1HostData(6, 0);
- std::vector out2HostData(3, 0);
- float alphaValue = 1.2f;
- // 创建input1 aclTensor
- ret = CreateAclTensor(input1HostData, selfShape1, &input1DeviceAddr, aclDataType::ACL_FLOAT, &input1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建input2 aclTensor
- ret = CreateAclTensor(input2HostData, selfShape2, &input2DeviceAddr, aclDataType::ACL_FLOAT, &input2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建alpha aclScalar
- alpha = aclCreateScalar(&alphaValue, aclDataType::ACL_FLOAT);
- CHECK_RET(alpha != nullptr, return ret);
- // 创建out1 aclTensor
- ret = CreateAclTensor(out1HostData, outShape1, &out1DeviceAddr, aclDataType::ACL_FLOAT, &out1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建out2 aclTensor
- ret = CreateAclTensor(out2HostData, outShape2, &out2DeviceAddr, aclDataType::ACL_FLOAT, &out2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- std::vector tempInput{input1, input2};
- aclTensorList* tensorListInput = aclCreateTensorList(tempInput.data(), tempInput.size());
- std::vector tempOutput{out1, out2};
- aclTensorList* tensorListOutput = aclCreateTensorList(tempOutput.data(), tempOutput.size());
-
- // 3. 调用CANN算子库API,需要修改为具体的API名称
- uint64_t workspaceSize = 0;
- aclOpExecutor* executor;
- // 调用aclnnForeachAddScalarV2第一段接口
- ret = aclnnForeachAddScalarV2GetWorkspaceSize(tensorListInput, alpha, tensorListOutput, &workspaceSize, &executor);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddScalarV2GetWorkspaceSize failed. ERROR: %d\n", ret); return ret);
- // 根据第一段接口计算出的workspaceSize申请device内存
- void* workspaceAddr = nullptr;
- if (workspaceSize > 0) {
- ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
- }
- // 调用aclnnForeachAddScalarV2第二段接口
- ret = aclnnForeachAddScalarV2(workspaceAddr, workspaceSize, executor, stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddScalarV2 failed. ERROR: %d\n", ret); return ret);
-
- // 4. (固定写法)同步等待任务执行结束
- ret = aclrtSynchronizeStream(stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
-
- // 5. 获取输出的值,将device侧内存上的结果复制至host侧,需要根据具体API的接口定义修改
- auto size = GetShapeSize(outShape1);
- std::vector out1Data(size, 0);
- ret = aclrtMemcpy(out1Data.data(), out1Data.size() * sizeof(out1Data[0]), out1DeviceAddr,
- size * sizeof(out1Data[0]), ACL_MEMCPY_DEVICE_TO_HOST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
- for (int64_t i = 0; i < size; i++) {
- LOG_PRINT("out1 result[%ld] is: %f\n", i, out1Data[i]);
- }
-
- size = GetShapeSize(outShape2);
- std::vector out2Data(size, 0);
- ret = aclrtMemcpy(out2Data.data(), out2Data.size() * sizeof(out2Data[0]), out2DeviceAddr,
- size * sizeof(out2Data[0]), ACL_MEMCPY_DEVICE_TO_HOST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
- for (int64_t i = 0; i < size; i++) {
- LOG_PRINT("out2 result[%ld] is: %f\n", i, out2Data[i]);
- }
-
- // 6. 释放aclTensor和aclScalar,需要根据具体API的接口定义修改
- aclDestroyTensorList(tensorListInput);
- aclDestroyTensorList(tensorListOutput);
- aclDestroyScalar(alpha);
-
- // 7.释放device资源,需要根据具体API的接口定义修改
- aclrtFree(input1DeviceAddr);
- aclrtFree(input2DeviceAddr);
- aclrtFree(out1DeviceAddr);
- aclrtFree(out2DeviceAddr);
- if (workspaceSize > 0) {
- aclrtFree(workspaceAddr);
- }
- aclrtDestroyStream(stream);
- aclrtResetDevice(deviceId);
- aclFinalize();
- return 0;
-}
\ No newline at end of file
+int main()
+{
+ // 1. (固定写法)device/stream初始化,参考acl API手册
+ // 根据自己的实际device填写deviceId
+ int32_t deviceId = 0;
+ aclrtStream stream;
+ auto ret = Init(deviceId, &stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
+
+ // 2. 构造输入与输出,需要根据API的接口自定义构造
+ std::vector selfShape1 = {2, 3};
+ std::vector selfShape2 = {1, 3};
+ std::vector outShape1 = {2, 3};
+ std::vector outShape2 = {1, 3};
+ void* input1DeviceAddr = nullptr;
+ void* input2DeviceAddr = nullptr;
+ void* out1DeviceAddr = nullptr;
+ void* out2DeviceAddr = nullptr;
+ aclTensor* input1 = nullptr;
+ aclTensor* input2 = nullptr;
+ aclScalar* alpha = nullptr;
+ aclTensor* out1 = nullptr;
+ aclTensor* out2 = nullptr;
+ std::vector input1HostData = {1, 2, 3, 4, 5, 6};
+ std::vector input2HostData = {7, 8, 9};
+ std::vector out1HostData(6, 0);
+ std::vector out2HostData(3, 0);
+ float alphaValue = 1.2f;
+ // 创建input1 aclTensor
+ ret = CreateAclTensor(input1HostData, selfShape1, &input1DeviceAddr, aclDataType::ACL_FLOAT, &input1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建input2 aclTensor
+ ret = CreateAclTensor(input2HostData, selfShape2, &input2DeviceAddr, aclDataType::ACL_FLOAT, &input2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建alpha aclScalar
+ alpha = aclCreateScalar(&alphaValue, aclDataType::ACL_FLOAT);
+ CHECK_RET(alpha != nullptr, return ret);
+ // 创建out1 aclTensor
+ ret = CreateAclTensor(out1HostData, outShape1, &out1DeviceAddr, aclDataType::ACL_FLOAT, &out1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建out2 aclTensor
+ ret = CreateAclTensor(out2HostData, outShape2, &out2DeviceAddr, aclDataType::ACL_FLOAT, &out2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ std::vector tempInput{input1, input2};
+ aclTensorList* tensorListInput = aclCreateTensorList(tempInput.data(), tempInput.size());
+ std::vector tempOutput{out1, out2};
+ aclTensorList* tensorListOutput = aclCreateTensorList(tempOutput.data(), tempOutput.size());
+
+ // 3. 调用CANN算子库API,需要修改为具体的API名称
+ uint64_t workspaceSize = 0;
+ aclOpExecutor* executor;
+ // 调用aclnnForeachAddScalarV2第一段接口
+ ret = aclnnForeachAddScalarV2GetWorkspaceSize(tensorListInput, alpha, tensorListOutput, &workspaceSize, &executor);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddScalarV2GetWorkspaceSize failed. ERROR: %d\n", ret);
+ return ret);
+ // 根据第一段接口计算出的workspaceSize申请device内存
+ void* workspaceAddr = nullptr;
+ if (workspaceSize > 0) {
+ ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
+ }
+ // 调用aclnnForeachAddScalarV2第二段接口
+ ret = aclnnForeachAddScalarV2(workspaceAddr, workspaceSize, executor, stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddScalarV2 failed. ERROR: %d\n", ret); return ret);
+
+ // 4. (固定写法)同步等待任务执行结束
+ ret = aclrtSynchronizeStream(stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
+
+ // 5. 获取输出的值,将device侧内存上的结果复制至host侧,需要根据具体API的接口定义修改
+ auto size = GetShapeSize(outShape1);
+ std::vector out1Data(size, 0);
+ ret = aclrtMemcpy(
+ out1Data.data(), out1Data.size() * sizeof(out1Data[0]), out1DeviceAddr, size * sizeof(out1Data[0]),
+ ACL_MEMCPY_DEVICE_TO_HOST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
+ for (int64_t i = 0; i < size; i++) {
+ LOG_PRINT("out1 result[%ld] is: %f\n", i, out1Data[i]);
+ }
+
+ size = GetShapeSize(outShape2);
+ std::vector out2Data(size, 0);
+ ret = aclrtMemcpy(
+ out2Data.data(), out2Data.size() * sizeof(out2Data[0]), out2DeviceAddr, size * sizeof(out2Data[0]),
+ ACL_MEMCPY_DEVICE_TO_HOST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
+ for (int64_t i = 0; i < size; i++) {
+ LOG_PRINT("out2 result[%ld] is: %f\n", i, out2Data[i]);
+ }
+
+ // 6. 释放aclTensor和aclScalar,需要根据具体API的接口定义修改
+ aclDestroyTensorList(tensorListInput);
+ aclDestroyTensorList(tensorListOutput);
+ aclDestroyScalar(alpha);
+
+ // 7.释放device资源,需要根据具体API的接口定义修改
+ aclrtFree(input1DeviceAddr);
+ aclrtFree(input2DeviceAddr);
+ aclrtFree(out1DeviceAddr);
+ aclrtFree(out2DeviceAddr);
+ if (workspaceSize > 0) {
+ aclrtFree(workspaceAddr);
+ }
+ aclrtDestroyStream(stream);
+ aclrtResetDevice(deviceId);
+ aclFinalize();
+ return 0;
+}
diff --git a/foreach/foreach_add_scalar_list/docs/aclnnForeachAddScalarList.md b/foreach/foreach_add_scalar_list/docs/aclnnForeachAddScalarList.md
index 5e34c05a..5be4136d 100644
--- a/foreach/foreach_add_scalar_list/docs/aclnnForeachAddScalarList.md
+++ b/foreach/foreach_add_scalar_list/docs/aclnnForeachAddScalarList.md
@@ -134,7 +134,7 @@ aclnnStatus aclnnForeachAddScalarList(
aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。
第一段接口完成入参校验,出现以下场景时报错:
-
+
@@ -214,14 +214,14 @@ aclnnStatus aclnnForeachAddScalarList(
- **返回值**
-
+
aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。
## 约束说明
- 确定性计算:
- aclnnForeachAddScalarList默认确定性实现。
-
+
## 调用示例
示例代码如下,仅供参考,具体编译和执行过程请参考[编译与运行样例](../../../docs/zh/context/编译与运行样例.md)。
diff --git a/foreach/foreach_add_scalar_list/examples/test_aclnn_foreach_add_scalar_list.cpp b/foreach/foreach_add_scalar_list/examples/test_aclnn_foreach_add_scalar_list.cpp
index 2cd89b37..063ccb72 100644
--- a/foreach/foreach_add_scalar_list/examples/test_aclnn_foreach_add_scalar_list.cpp
+++ b/foreach/foreach_add_scalar_list/examples/test_aclnn_foreach_add_scalar_list.cpp
@@ -14,167 +14,177 @@
#include "aclnnop/aclnn_foreach_add_scalar_list.h"
#define CHECK_RET(cond, return_expr) \
- do { \
- if (!(cond)) { \
- return_expr; \
- } \
- } while (0)
-
-#define LOG_PRINT(message, ...) \
- do { \
- printf(message, ##__VA_ARGS__); \
- } while (0)
-
-int64_t GetShapeSize(const std::vector& shape) {
- int64_t shapeSize = 1;
- for (auto i : shape) {
- shapeSize *= i;
- }
- return shapeSize;
+ do { \
+ if (!(cond)) { \
+ return_expr; \
+ } \
+ } while (0)
+
+#define LOG_PRINT(message, ...) \
+ do { \
+ printf(message, ##__VA_ARGS__); \
+ } while (0)
+
+int64_t GetShapeSize(const std::vector& shape)
+{
+ int64_t shapeSize = 1;
+ for (auto i : shape) {
+ shapeSize *= i;
+ }
+ return shapeSize;
}
-int Init(int32_t deviceId, aclrtStream* stream) {
- // 固定写法,资源初始化
- auto ret = aclInit(nullptr);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclInit failed. ERROR: %d\n", ret); return ret);
- ret = aclrtSetDevice(deviceId);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSetDevice failed. ERROR: %d\n", ret); return ret);
- ret = aclrtCreateStream(stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtCreateStream failed. ERROR: %d\n", ret); return ret);
- return 0;
+int Init(int32_t deviceId, aclrtStream* stream)
+{
+ // 固定写法,资源初始化
+ auto ret = aclInit(nullptr);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclInit failed. ERROR: %d\n", ret); return ret);
+ ret = aclrtSetDevice(deviceId);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSetDevice failed. ERROR: %d\n", ret); return ret);
+ ret = aclrtCreateStream(stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtCreateStream failed. ERROR: %d\n", ret); return ret);
+ return 0;
}
template
-int CreateAclTensor(const std::vector& hostData, const std::vector& shape, void** deviceAddr,
- aclDataType dataType, aclTensor** tensor) {
- auto size = GetShapeSize(shape) * sizeof(T);
- // 调用aclrtMalloc申请device侧内存
- auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
- // 调用aclrtMemcpy将host侧数据复制到device侧内存上
- ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
-
- // 计算连续tensor的strides
- std::vector strides(shape.size(), 1);
- for (int64_t i = shape.size() - 2; i >= 0; i--) {
- strides[i] = shape[i + 1] * strides[i + 1];
- }
-
- // 调用aclCreateTensor接口创建aclTensor
- *tensor = aclCreateTensor(shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND,
- shape.data(), shape.size(), *deviceAddr);
- return 0;
+int CreateAclTensor(
+ const std::vector& hostData, const std::vector& shape, void** deviceAddr, aclDataType dataType,
+ aclTensor** tensor)
+{
+ auto size = GetShapeSize(shape) * sizeof(T);
+ // 调用aclrtMalloc申请device侧内存
+ auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
+ // 调用aclrtMemcpy将host侧数据复制到device侧内存上
+ ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
+
+ // 计算连续tensor的strides
+ std::vector strides(shape.size(), 1);
+ for (int64_t i = shape.size() - 2; i >= 0; i--) {
+ strides[i] = shape[i + 1] * strides[i + 1];
+ }
+
+ // 调用aclCreateTensor接口创建aclTensor
+ *tensor = aclCreateTensor(
+ shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(),
+ *deviceAddr);
+ return 0;
}
-int main() {
- // 1. (固定写法)device/stream初始化,参考acl API手册
- // 根据自己的实际device填写deviceId
- int32_t deviceId = 0;
- aclrtStream stream;
- auto ret = Init(deviceId, &stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
-
- // 2. 构造输入与输出,需要根据API的接口自定义构造
- std::vector selfShape1 = {2, 3};
- std::vector selfShape2 = {1, 3};
- std::vector outShape1 = {2, 3};
- std::vector outShape2 = {1, 3};
- void* input1DeviceAddr = nullptr;
- void* input2DeviceAddr = nullptr;
- void* out1DeviceAddr = nullptr;
- void* out2DeviceAddr = nullptr;
- aclTensor* input1 = nullptr;
- aclTensor* input2 = nullptr;
- aclScalar* alpha1 = nullptr;
- aclScalar* alpha2 = nullptr;
- aclTensor* out1 = nullptr;
- aclTensor* out2 = nullptr;
- std::vector input1HostData = {1, 2, 3, 4, 5, 6};
- std::vector input2HostData = {7, 8, 9};
- std::vector out1HostData(6, 0);
- std::vector out2HostData(3, 0);
- float alpha1Value = 1.2f;
- float alpha2Value = 2.2f;
- // 创建input1 aclTensor
- ret = CreateAclTensor(input1HostData, selfShape1, &input1DeviceAddr, aclDataType::ACL_FLOAT, &input1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建input2 aclTensor
- ret = CreateAclTensor(input2HostData, selfShape2, &input2DeviceAddr, aclDataType::ACL_FLOAT, &input2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建alpha1 aclScalar
- alpha1 = aclCreateScalar(&alpha1Value, aclDataType::ACL_FLOAT);
- CHECK_RET(alpha1 != nullptr, return ret);
- // 创建alpha2 aclScalar
- alpha2 = aclCreateScalar(&alpha2Value, aclDataType::ACL_FLOAT);
- CHECK_RET(alpha2 != nullptr, return ret);
- // 创建out1 aclTensor
- ret = CreateAclTensor(out1HostData, outShape1, &out1DeviceAddr, aclDataType::ACL_FLOAT, &out1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建out2 aclTensor
- ret = CreateAclTensor(out2HostData, outShape2, &out2DeviceAddr, aclDataType::ACL_FLOAT, &out2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- std::vector tempInput{input1, input2};
- aclTensorList* tensorListInput = aclCreateTensorList(tempInput.data(), tempInput.size());
- std::vector tempOutput{out1, out2};
- aclTensorList* tensorListOutput = aclCreateTensorList(tempOutput.data(), tempOutput.size());
- std::vector tempscalar{alpha1, alpha2};
- aclScalarList* scalarlist = aclCreateScalarList(tempscalar.data(), tempscalar.size());
-
- // 3. 调用CANN算子库API,需要修改为具体的API名称
- uint64_t workspaceSize = 0;
- aclOpExecutor* executor;
- // 调用aclnnForeachAddScalarList第一段接口
- ret = aclnnForeachAddScalarListGetWorkspaceSize(tensorListInput, scalarlist, tensorListOutput, &workspaceSize, &executor);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddScalarListGetWorkspaceSize failed. ERROR: %d\n", ret); return ret);
- // 根据第一段接口计算出的workspaceSize申请device内存
- void* workspaceAddr = nullptr;
- if (workspaceSize > 0) {
- ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
- }
- // 调用aclnnForeachAddScalarList第二段接口
- ret = aclnnForeachAddScalarList(workspaceAddr, workspaceSize, executor, stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddScalarList failed. ERROR: %d\n", ret); return ret);
-
- // 4. (固定写法)同步等待任务执行结束
- ret = aclrtSynchronizeStream(stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
-
- // 5. 获取输出的值,将device侧内存上的结果复制至host侧,需要根据具体API的接口定义修改
- auto size = GetShapeSize(outShape1);
- std::vector out1Data(size, 0);
- ret = aclrtMemcpy(out1Data.data(), out1Data.size() * sizeof(out1Data[0]), out1DeviceAddr,
- size * sizeof(out1Data[0]), ACL_MEMCPY_DEVICE_TO_HOST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
- for (int64_t i = 0; i < size; i++) {
- LOG_PRINT("out1 result[%ld] is: %f\n", i, out1Data[i]);
- }
-
- size = GetShapeSize(outShape2);
- std::vector out2Data(size, 0);
- ret = aclrtMemcpy(out2Data.data(), out2Data.size() * sizeof(out2Data[0]), out2DeviceAddr,
- size * sizeof(out2Data[0]), ACL_MEMCPY_DEVICE_TO_HOST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
- for (int64_t i = 0; i < size; i++) {
- LOG_PRINT("out2 result[%ld] is: %f\n", i, out2Data[i]);
- }
-
- // 6. 释放aclTensor和aclScalar,需要根据具体API的接口定义修改
- aclDestroyTensorList(tensorListInput);
- aclDestroyTensorList(tensorListOutput);
- aclDestroyScalarList(scalarlist);
-
- // 7.释放device资源,需要根据具体API的接口定义修改
- aclrtFree(input1DeviceAddr);
- aclrtFree(input2DeviceAddr);
- aclrtFree(out1DeviceAddr);
- aclrtFree(out2DeviceAddr);
- if (workspaceSize > 0) {
- aclrtFree(workspaceAddr);
- }
- aclrtDestroyStream(stream);
- aclrtResetDevice(deviceId);
- aclFinalize();
- return 0;
-}
\ No newline at end of file
+int main()
+{
+ // 1. (固定写法)device/stream初始化,参考acl API手册
+ // 根据自己的实际device填写deviceId
+ int32_t deviceId = 0;
+ aclrtStream stream;
+ auto ret = Init(deviceId, &stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
+
+ // 2. 构造输入与输出,需要根据API的接口自定义构造
+ std::vector selfShape1 = {2, 3};
+ std::vector selfShape2 = {1, 3};
+ std::vector outShape1 = {2, 3};
+ std::vector outShape2 = {1, 3};
+ void* input1DeviceAddr = nullptr;
+ void* input2DeviceAddr = nullptr;
+ void* out1DeviceAddr = nullptr;
+ void* out2DeviceAddr = nullptr;
+ aclTensor* input1 = nullptr;
+ aclTensor* input2 = nullptr;
+ aclScalar* alpha1 = nullptr;
+ aclScalar* alpha2 = nullptr;
+ aclTensor* out1 = nullptr;
+ aclTensor* out2 = nullptr;
+ std::vector input1HostData = {1, 2, 3, 4, 5, 6};
+ std::vector input2HostData = {7, 8, 9};
+ std::vector out1HostData(6, 0);
+ std::vector out2HostData(3, 0);
+ float alpha1Value = 1.2f;
+ float alpha2Value = 2.2f;
+ // 创建input1 aclTensor
+ ret = CreateAclTensor(input1HostData, selfShape1, &input1DeviceAddr, aclDataType::ACL_FLOAT, &input1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建input2 aclTensor
+ ret = CreateAclTensor(input2HostData, selfShape2, &input2DeviceAddr, aclDataType::ACL_FLOAT, &input2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建alpha1 aclScalar
+ alpha1 = aclCreateScalar(&alpha1Value, aclDataType::ACL_FLOAT);
+ CHECK_RET(alpha1 != nullptr, return ret);
+ // 创建alpha2 aclScalar
+ alpha2 = aclCreateScalar(&alpha2Value, aclDataType::ACL_FLOAT);
+ CHECK_RET(alpha2 != nullptr, return ret);
+ // 创建out1 aclTensor
+ ret = CreateAclTensor(out1HostData, outShape1, &out1DeviceAddr, aclDataType::ACL_FLOAT, &out1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建out2 aclTensor
+ ret = CreateAclTensor(out2HostData, outShape2, &out2DeviceAddr, aclDataType::ACL_FLOAT, &out2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ std::vector tempInput{input1, input2};
+ aclTensorList* tensorListInput = aclCreateTensorList(tempInput.data(), tempInput.size());
+ std::vector tempOutput{out1, out2};
+ aclTensorList* tensorListOutput = aclCreateTensorList(tempOutput.data(), tempOutput.size());
+ std::vector tempscalar{alpha1, alpha2};
+ aclScalarList* scalarlist = aclCreateScalarList(tempscalar.data(), tempscalar.size());
+
+ // 3. 调用CANN算子库API,需要修改为具体的API名称
+ uint64_t workspaceSize = 0;
+ aclOpExecutor* executor;
+ // 调用aclnnForeachAddScalarList第一段接口
+ ret = aclnnForeachAddScalarListGetWorkspaceSize(
+ tensorListInput, scalarlist, tensorListOutput, &workspaceSize, &executor);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddScalarListGetWorkspaceSize failed. ERROR: %d\n", ret);
+ return ret);
+ // 根据第一段接口计算出的workspaceSize申请device内存
+ void* workspaceAddr = nullptr;
+ if (workspaceSize > 0) {
+ ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
+ }
+ // 调用aclnnForeachAddScalarList第二段接口
+ ret = aclnnForeachAddScalarList(workspaceAddr, workspaceSize, executor, stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddScalarList failed. ERROR: %d\n", ret); return ret);
+
+ // 4. (固定写法)同步等待任务执行结束
+ ret = aclrtSynchronizeStream(stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
+
+ // 5. 获取输出的值,将device侧内存上的结果复制至host侧,需要根据具体API的接口定义修改
+ auto size = GetShapeSize(outShape1);
+ std::vector out1Data(size, 0);
+ ret = aclrtMemcpy(
+ out1Data.data(), out1Data.size() * sizeof(out1Data[0]), out1DeviceAddr, size * sizeof(out1Data[0]),
+ ACL_MEMCPY_DEVICE_TO_HOST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
+ for (int64_t i = 0; i < size; i++) {
+ LOG_PRINT("out1 result[%ld] is: %f\n", i, out1Data[i]);
+ }
+
+ size = GetShapeSize(outShape2);
+ std::vector out2Data(size, 0);
+ ret = aclrtMemcpy(
+ out2Data.data(), out2Data.size() * sizeof(out2Data[0]), out2DeviceAddr, size * sizeof(out2Data[0]),
+ ACL_MEMCPY_DEVICE_TO_HOST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
+ for (int64_t i = 0; i < size; i++) {
+ LOG_PRINT("out2 result[%ld] is: %f\n", i, out2Data[i]);
+ }
+
+ // 6. 释放aclTensor和aclScalar,需要根据具体API的接口定义修改
+ aclDestroyTensorList(tensorListInput);
+ aclDestroyTensorList(tensorListOutput);
+ aclDestroyScalarList(scalarlist);
+
+ // 7.释放device资源,需要根据具体API的接口定义修改
+ aclrtFree(input1DeviceAddr);
+ aclrtFree(input2DeviceAddr);
+ aclrtFree(out1DeviceAddr);
+ aclrtFree(out2DeviceAddr);
+ if (workspaceSize > 0) {
+ aclrtFree(workspaceAddr);
+ }
+ aclrtDestroyStream(stream);
+ aclrtResetDevice(deviceId);
+ aclFinalize();
+ return 0;
+}
diff --git a/foreach/foreach_addcdiv_list/docs/aclnnForeachAddcdivList.md b/foreach/foreach_addcdiv_list/docs/aclnnForeachAddcdivList.md
index 6265d8db..80aafabd 100644
--- a/foreach/foreach_addcdiv_list/docs/aclnnForeachAddcdivList.md
+++ b/foreach/foreach_addcdiv_list/docs/aclnnForeachAddcdivList.md
@@ -17,9 +17,9 @@
- 接口功能:对多个张量进行逐元素加、乘、除操作,$x2_{i}$和$x3_{i}$进行逐元素相除,并将结果乘以scalars,再与$x1_{i}$相加。
- 计算公式:
-
+
$$
- x1 = [{x1_0}, {x1_1}, ... {x1_{n-1}}], x2 = [{x2_0}, {x2_1}, ... {x2_{n-1}}], x3 = [{x3_0}, {x3_1}, ... {x3_{n-1}}]\\
+ x1 = [{x1_0}, {x1_1}, ... {x1_{n-1}}], x2 = [{x2_0}, {x2_1}, ... {x2_{n-1}}], x3 = [{x3_0}, {x3_1}, ... {x3_{n-1}}]\\
y = [{y_0}, {y_1}, ... {y_{n-1}}]\\
$$
@@ -154,7 +154,7 @@ aclnnStatus aclnnForeachAddcdivList(
aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。
第一段接口完成入参校验,出现以下场景时报错:
-
+
diff --git a/foreach/foreach_addcdiv_list/examples/test_aclnn_foreach_addcdiv_list.cpp b/foreach/foreach_addcdiv_list/examples/test_aclnn_foreach_addcdiv_list.cpp
index dcc5c0fa..d8d494af 100644
--- a/foreach/foreach_addcdiv_list/examples/test_aclnn_foreach_addcdiv_list.cpp
+++ b/foreach/foreach_addcdiv_list/examples/test_aclnn_foreach_addcdiv_list.cpp
@@ -14,26 +14,27 @@
#include "aclnnop/aclnn_foreach_addcdiv_list.h"
#define CHECK_RET(cond, return_expr) \
- do { \
- if (!(cond)) { \
- return_expr; \
- } \
- } while (0)
-
-#define LOG_PRINT(message, ...) \
- do { \
- printf(message, ##__VA_ARGS__); \
- } while (0)
-
-int64_t GetShapeSize(const std::vector& shape) {
- int64_t shapeSize = 1;
- for (auto i : shape) {
- shapeSize *= i;
- }
- return shapeSize;
+ do { \
+ if (!(cond)) { \
+ return_expr; \
+ } \
+ } while (0)
+
+#define LOG_PRINT(message, ...) \
+ do { \
+ printf(message, ##__VA_ARGS__); \
+ } while (0)
+
+int64_t GetShapeSize(const std::vector& shape)
+{
+ int64_t shapeSize = 1;
+ for (auto i : shape) {
+ shapeSize *= i;
+ }
+ return shapeSize;
}
-int Init(int32_t deviceId, aclrtStream *stream)
+int Init(int32_t deviceId, aclrtStream* stream)
{
// 固定写法,资源初始化
auto ret = aclInit(nullptr);
@@ -46,171 +47,179 @@ int Init(int32_t deviceId, aclrtStream *stream)
}
template
-int CreateAclTensor(const std::vector& hostData, const std::vector& shape, void** deviceAddr,
- aclDataType dataType, aclTensor** tensor) {
- auto size = GetShapeSize(shape) * sizeof(T);
- // 调用aclrtMalloc申请device侧内存
- auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
- // 调用aclrtMemcpy将host侧数据复制到device侧内存上
- ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
-
- // 计算连续tensor的strides
- std::vector strides(shape.size(), 1);
- for (int64_t i = shape.size() - 2; i >= 0; i--) {
- strides[i] = shape[i + 1] * strides[i + 1];
- }
-
- // 调用aclCreateTensor接口创建aclTensor
- *tensor = aclCreateTensor(shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND,
- shape.data(), shape.size(), *deviceAddr);
- return 0;
+int CreateAclTensor(
+ const std::vector& hostData, const std::vector& shape, void** deviceAddr, aclDataType dataType,
+ aclTensor** tensor)
+{
+ auto size = GetShapeSize(shape) * sizeof(T);
+ // 调用aclrtMalloc申请device侧内存
+ auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
+ // 调用aclrtMemcpy将host侧数据复制到device侧内存上
+ ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
+
+ // 计算连续tensor的strides
+ std::vector strides(shape.size(), 1);
+ for (int64_t i = shape.size() - 2; i >= 0; i--) {
+ strides[i] = shape[i + 1] * strides[i + 1];
+ }
+
+ // 调用aclCreateTensor接口创建aclTensor
+ *tensor = aclCreateTensor(
+ shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(),
+ *deviceAddr);
+ return 0;
}
-int main() {
- // 1. (固定写法)device/stream初始化,参考acl API手册
- // 根据自己的实际device填写deviceId
- int32_t deviceId = 0;
- aclrtStream stream;
- auto ret = Init(deviceId, &stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
-
- // 2. 构造输入与输出,需要根据API的接口自定义构造
- std::vector selfShape1 = {2, 3};
- std::vector selfShape2 = {1, 3};
- std::vector scalarShape = {1, 2};
- std::vector otherShape1 = {2, 3};
- std::vector otherShape2 = {1, 3};
- std::vector anotherShape1 = {2, 3};
- std::vector anotherShape2 = {1, 3};
- std::vector outShape1 = {2, 3};
- std::vector outShape2 = {1, 3};
- void* input1DeviceAddr = nullptr;
- void* input2DeviceAddr = nullptr;
- void* other1DeviceAddr = nullptr;
- void* other2DeviceAddr = nullptr;
- void* another1DeviceAddr = nullptr;
- void* another2DeviceAddr = nullptr;
- void* scalarDeviceAddr = nullptr;
- void* out1DeviceAddr = nullptr;
- void* out2DeviceAddr = nullptr;
- aclTensor* input1 = nullptr;
- aclTensor* input2 = nullptr;
- aclTensor* other1 = nullptr;
- aclTensor* other2 = nullptr;
- aclTensor* another1 = nullptr;
- aclTensor* another2 = nullptr;
- aclTensor* scalar = nullptr;
- aclTensor* out1 = nullptr;
- aclTensor* out2 = nullptr;
- std::vector input1HostData = {1, 2, 3, 4, 5, 6};
- std::vector input2HostData = {7, 8, 9};
- std::vector other1HostData = {4, 3, 8, 9, 3, 5};
- std::vector other2HostData = {5, 6, 7};
- std::vector another1HostData = {1, 2, 3, 4, 5, 6};
- std::vector another2HostData = {7, 8, 9};
- std::vector scalarHostData = {1, 2};
- std::vector out1HostData(6, 0);
- std::vector out2HostData(3, 0);
- // 创建input1 aclTensor
- ret = CreateAclTensor(input1HostData, selfShape1, &input1DeviceAddr, aclDataType::ACL_FLOAT, &input1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建input2 aclTensor
- ret = CreateAclTensor(input2HostData, selfShape2, &input2DeviceAddr, aclDataType::ACL_FLOAT, &input2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建scalar aclTensor
- ret = CreateAclTensor(scalarHostData, scalarShape, &scalarDeviceAddr, aclDataType::ACL_FLOAT, &scalar);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建other1 aclTensor
- ret = CreateAclTensor(other1HostData, otherShape1, &other1DeviceAddr, aclDataType::ACL_FLOAT, &other1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建other2 aclTensor
- ret = CreateAclTensor(other2HostData, otherShape2, &other2DeviceAddr, aclDataType::ACL_FLOAT, &other2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建another1 aclTensor
- ret = CreateAclTensor(another1HostData, anotherShape1, &another1DeviceAddr, aclDataType::ACL_FLOAT, &another1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建another2 aclTensor
- ret = CreateAclTensor(another2HostData, anotherShape2, &another2DeviceAddr, aclDataType::ACL_FLOAT, &another2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建out1 aclTensor
- ret = CreateAclTensor(out1HostData, outShape1, &out1DeviceAddr, aclDataType::ACL_FLOAT, &out1);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
- // 创建out2 aclTensor
- ret = CreateAclTensor(out2HostData, outShape2, &out2DeviceAddr, aclDataType::ACL_FLOAT, &out2);
- CHECK_RET(ret == ACL_SUCCESS, return ret);
-
- std::vector tempInput1{input1, input2};
- aclTensorList* tensorListInput1 = aclCreateTensorList(tempInput1.data(), tempInput1.size());
- std::vector tempInput2{other1, other2};
- aclTensorList* tensorListInput2 = aclCreateTensorList(tempInput2.data(), tempInput2.size());
- std::vector tempAnother{another1, another2};
- aclTensorList* tensorListAnother = aclCreateTensorList(tempAnother.data(), tempAnother.size());
- std::vector tempOutput{out1, out2};
- aclTensorList* tensorListOutput = aclCreateTensorList(tempOutput.data(), tempOutput.size());
-
- // 3. 调用CANN算子库API,需要修改为具体的API名称
- uint64_t workspaceSize = 0;
- aclOpExecutor* executor;
- // 调用aclnnForeachAddcdivList第一段接口
- ret = aclnnForeachAddcdivListGetWorkspaceSize(tensorListInput1, tensorListInput2, tensorListAnother, scalar, tensorListOutput, &workspaceSize, &executor);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddcdivListGetWorkspaceSize failed. ERROR: %d\n", ret); return ret);
- // 根据第一段接口计算出的workspaceSize申请device内存
- void* workspaceAddr = nullptr;
- if (workspaceSize > 0) {
- ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
- }
- // 调用aclnnForeachAddcdivList第二段接口
- ret = aclnnForeachAddcdivList(workspaceAddr, workspaceSize, executor, stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddcdivList failed. ERROR: %d\n", ret); return ret);
-
- // 4. (固定写法)同步等待任务执行结束
- ret = aclrtSynchronizeStream(stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
-
- // 5. 获取输出的值,将device侧内存上的结果复制至host侧,需要根据具体API的接口定义修改
- auto size = GetShapeSize(outShape1);
- std::vector out1Data(size, 0);
- ret = aclrtMemcpy(out1Data.data(), out1Data.size() * sizeof(out1Data[0]), out1DeviceAddr,
- size * sizeof(out1Data[0]), ACL_MEMCPY_DEVICE_TO_HOST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
- for (int64_t i = 0; i < size; i++) {
- LOG_PRINT("out1 result[%ld] is: %f\n", i, out1Data[i]);
- }
-
- size = GetShapeSize(outShape2);
- std::vector out2Data(size, 0);
- ret = aclrtMemcpy(out2Data.data(), out2Data.size() * sizeof(out2Data[0]), out2DeviceAddr,
- size * sizeof(out2Data[0]), ACL_MEMCPY_DEVICE_TO_HOST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
- for (int64_t i = 0; i < size; i++) {
- LOG_PRINT("out2 result[%ld] is: %f\n", i, out2Data[i]);
- }
-
- // 6. 释放aclTensor,需要根据具体API的接口定义修改
- aclDestroyTensorList(tensorListInput1);
- aclDestroyTensorList(tensorListInput2);
- aclDestroyTensorList(tensorListAnother);
- aclDestroyTensor(scalar);
- aclDestroyTensorList(tensorListOutput);
-
- // 7.释放device资源,需要根据具体API的接口定义修改
- aclrtFree(input1DeviceAddr);
- aclrtFree(input2DeviceAddr);
- aclrtFree(other1DeviceAddr);
- aclrtFree(other2DeviceAddr);
- aclrtFree(another1DeviceAddr);
- aclrtFree(another2DeviceAddr);
- aclrtFree(scalarDeviceAddr);
- aclrtFree(out1DeviceAddr);
- aclrtFree(out2DeviceAddr);
- if (workspaceSize > 0) {
- aclrtFree(workspaceAddr);
- }
- aclrtDestroyStream(stream);
- aclrtResetDevice(deviceId);
- aclFinalize();
- return 0;
-}
\ No newline at end of file
+int main()
+{
+ // 1. (固定写法)device/stream初始化,参考acl API手册
+ // 根据自己的实际device填写deviceId
+ int32_t deviceId = 0;
+ aclrtStream stream;
+ auto ret = Init(deviceId, &stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
+
+ // 2. 构造输入与输出,需要根据API的接口自定义构造
+ std::vector selfShape1 = {2, 3};
+ std::vector selfShape2 = {1, 3};
+ std::vector scalarShape = {1, 2};
+ std::vector otherShape1 = {2, 3};
+ std::vector otherShape2 = {1, 3};
+ std::vector anotherShape1 = {2, 3};
+ std::vector anotherShape2 = {1, 3};
+ std::vector outShape1 = {2, 3};
+ std::vector outShape2 = {1, 3};
+ void* input1DeviceAddr = nullptr;
+ void* input2DeviceAddr = nullptr;
+ void* other1DeviceAddr = nullptr;
+ void* other2DeviceAddr = nullptr;
+ void* another1DeviceAddr = nullptr;
+ void* another2DeviceAddr = nullptr;
+ void* scalarDeviceAddr = nullptr;
+ void* out1DeviceAddr = nullptr;
+ void* out2DeviceAddr = nullptr;
+ aclTensor* input1 = nullptr;
+ aclTensor* input2 = nullptr;
+ aclTensor* other1 = nullptr;
+ aclTensor* other2 = nullptr;
+ aclTensor* another1 = nullptr;
+ aclTensor* another2 = nullptr;
+ aclTensor* scalar = nullptr;
+ aclTensor* out1 = nullptr;
+ aclTensor* out2 = nullptr;
+ std::vector input1HostData = {1, 2, 3, 4, 5, 6};
+ std::vector input2HostData = {7, 8, 9};
+ std::vector other1HostData = {4, 3, 8, 9, 3, 5};
+ std::vector other2HostData = {5, 6, 7};
+ std::vector another1HostData = {1, 2, 3, 4, 5, 6};
+ std::vector another2HostData = {7, 8, 9};
+ std::vector scalarHostData = {1, 2};
+ std::vector out1HostData(6, 0);
+ std::vector out2HostData(3, 0);
+ // 创建input1 aclTensor
+ ret = CreateAclTensor(input1HostData, selfShape1, &input1DeviceAddr, aclDataType::ACL_FLOAT, &input1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建input2 aclTensor
+ ret = CreateAclTensor(input2HostData, selfShape2, &input2DeviceAddr, aclDataType::ACL_FLOAT, &input2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建scalar aclTensor
+ ret = CreateAclTensor(scalarHostData, scalarShape, &scalarDeviceAddr, aclDataType::ACL_FLOAT, &scalar);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建other1 aclTensor
+ ret = CreateAclTensor(other1HostData, otherShape1, &other1DeviceAddr, aclDataType::ACL_FLOAT, &other1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建other2 aclTensor
+ ret = CreateAclTensor(other2HostData, otherShape2, &other2DeviceAddr, aclDataType::ACL_FLOAT, &other2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建another1 aclTensor
+ ret = CreateAclTensor(another1HostData, anotherShape1, &another1DeviceAddr, aclDataType::ACL_FLOAT, &another1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建another2 aclTensor
+ ret = CreateAclTensor(another2HostData, anotherShape2, &another2DeviceAddr, aclDataType::ACL_FLOAT, &another2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建out1 aclTensor
+ ret = CreateAclTensor(out1HostData, outShape1, &out1DeviceAddr, aclDataType::ACL_FLOAT, &out1);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+ // 创建out2 aclTensor
+ ret = CreateAclTensor(out2HostData, outShape2, &out2DeviceAddr, aclDataType::ACL_FLOAT, &out2);
+ CHECK_RET(ret == ACL_SUCCESS, return ret);
+
+ std::vector tempInput1{input1, input2};
+ aclTensorList* tensorListInput1 = aclCreateTensorList(tempInput1.data(), tempInput1.size());
+ std::vector tempInput2{other1, other2};
+ aclTensorList* tensorListInput2 = aclCreateTensorList(tempInput2.data(), tempInput2.size());
+ std::vector tempAnother{another1, another2};
+ aclTensorList* tensorListAnother = aclCreateTensorList(tempAnother.data(), tempAnother.size());
+ std::vector tempOutput{out1, out2};
+ aclTensorList* tensorListOutput = aclCreateTensorList(tempOutput.data(), tempOutput.size());
+
+ // 3. 调用CANN算子库API,需要修改为具体的API名称
+ uint64_t workspaceSize = 0;
+ aclOpExecutor* executor;
+ // 调用aclnnForeachAddcdivList第一段接口
+ ret = aclnnForeachAddcdivListGetWorkspaceSize(
+ tensorListInput1, tensorListInput2, tensorListAnother, scalar, tensorListOutput, &workspaceSize, &executor);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddcdivListGetWorkspaceSize failed. ERROR: %d\n", ret);
+ return ret);
+ // 根据第一段接口计算出的workspaceSize申请device内存
+ void* workspaceAddr = nullptr;
+ if (workspaceSize > 0) {
+ ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret);
+ }
+ // 调用aclnnForeachAddcdivList第二段接口
+ ret = aclnnForeachAddcdivList(workspaceAddr, workspaceSize, executor, stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnForeachAddcdivList failed. ERROR: %d\n", ret); return ret);
+
+ // 4. (固定写法)同步等待任务执行结束
+ ret = aclrtSynchronizeStream(stream);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
+
+ // 5. 获取输出的值,将device侧内存上的结果复制至host侧,需要根据具体API的接口定义修改
+ auto size = GetShapeSize(outShape1);
+ std::vector out1Data(size, 0);
+ ret = aclrtMemcpy(
+ out1Data.data(), out1Data.size() * sizeof(out1Data[0]), out1DeviceAddr, size * sizeof(out1Data[0]),
+ ACL_MEMCPY_DEVICE_TO_HOST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
+ for (int64_t i = 0; i < size; i++) {
+ LOG_PRINT("out1 result[%ld] is: %f\n", i, out1Data[i]);
+ }
+
+ size = GetShapeSize(outShape2);
+ std::vector out2Data(size, 0);
+ ret = aclrtMemcpy(
+ out2Data.data(), out2Data.size() * sizeof(out2Data[0]), out2DeviceAddr, size * sizeof(out2Data[0]),
+ ACL_MEMCPY_DEVICE_TO_HOST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret);
+ for (int64_t i = 0; i < size; i++) {
+ LOG_PRINT("out2 result[%ld] is: %f\n", i, out2Data[i]);
+ }
+
+ // 6. 释放aclTensor,需要根据具体API的接口定义修改
+ aclDestroyTensorList(tensorListInput1);
+ aclDestroyTensorList(tensorListInput2);
+ aclDestroyTensorList(tensorListAnother);
+ aclDestroyTensor(scalar);
+ aclDestroyTensorList(tensorListOutput);
+
+ // 7.释放device资源,需要根据具体API的接口定义修改
+ aclrtFree(input1DeviceAddr);
+ aclrtFree(input2DeviceAddr);
+ aclrtFree(other1DeviceAddr);
+ aclrtFree(other2DeviceAddr);
+ aclrtFree(another1DeviceAddr);
+ aclrtFree(another2DeviceAddr);
+ aclrtFree(scalarDeviceAddr);
+ aclrtFree(out1DeviceAddr);
+ aclrtFree(out2DeviceAddr);
+ if (workspaceSize > 0) {
+ aclrtFree(workspaceAddr);
+ }
+ aclrtDestroyStream(stream);
+ aclrtResetDevice(deviceId);
+ aclFinalize();
+ return 0;
+}
diff --git a/foreach/foreach_addcdiv_scalar/docs/aclnnForeachAddcdivScalar.md b/foreach/foreach_addcdiv_scalar/docs/aclnnForeachAddcdivScalar.md
index 47fa49b3..09212c48 100644
--- a/foreach/foreach_addcdiv_scalar/docs/aclnnForeachAddcdivScalar.md
+++ b/foreach/foreach_addcdiv_scalar/docs/aclnnForeachAddcdivScalar.md
@@ -155,7 +155,7 @@ aclnnStatus aclnnForeachAddcdivScalar(
aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。
第一段接口完成入参校验,出现以下场景时报错:
-
+
diff --git a/foreach/foreach_addcdiv_scalar/docs/aclnnForeachAddcdivScalarV2.md b/foreach/foreach_addcdiv_scalar/docs/aclnnForeachAddcdivScalarV2.md
index 7a17a7e7..740724b0 100644
--- a/foreach/foreach_addcdiv_scalar/docs/aclnnForeachAddcdivScalarV2.md
+++ b/foreach/foreach_addcdiv_scalar/docs/aclnnForeachAddcdivScalarV2.md
@@ -17,7 +17,7 @@
- 接口功能:对多个张量进行逐元素加、乘、除操作,$x2_{i}$和$x3_{i}$进行逐元素相除,并将结果乘以scalar,再与$x1_{i}$相加。本接口相较于[aclnnForeachAddcdivScalar](aclnnForeachAddcdivScalar.md),修改入参scalar的结构类型aclTensor为aclScalar,请根据实际情况选择合适的接口。
- 计算公式:
-
+
$$
x1 = [{x1_0}, {x1_1}, ... {x1_{n-1}}], x2 = [{x2_0}, {x2_1}, ... {x2_{n-1}}], x3 = [{x3_0}, {x3_1}, ... {x3_{n-1}}]\\
y = [{y_0}, {y_1}, ... {y_{n-1}}]\\
@@ -148,11 +148,11 @@ aclnnStatus aclnnForeachAddcdivScalarV2(
-
+
- **返回值**
aclnnStatus:返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。
-
+
第一段接口完成入参校验,出现以下场景时报错:
diff --git a/foreach/foreach_addcdiv_scalar/examples/test_aclnn_foreach_addcdiv_scalar.cpp b/foreach/foreach_addcdiv_scalar/examples/test_aclnn_foreach_addcdiv_scalar.cpp
index 0aa6b899..30c387e7 100644
--- a/foreach/foreach_addcdiv_scalar/examples/test_aclnn_foreach_addcdiv_scalar.cpp
+++ b/foreach/foreach_addcdiv_scalar/examples/test_aclnn_foreach_addcdiv_scalar.cpp
@@ -14,26 +14,27 @@
#include "aclnnop/aclnn_foreach_addcdiv_scalar.h"
#define CHECK_RET(cond, return_expr) \
- do { \
- if (!(cond)) { \
- return_expr; \
- } \
- } while (0)
-
-#define LOG_PRINT(message, ...) \
- do { \
- printf(message, ##__VA_ARGS__); \
- } while (0)
-
-int64_t GetShapeSize(const std::vector& shape) {
- int64_t shapeSize = 1;
- for (auto i : shape) {
- shapeSize *= i;
- }
- return shapeSize;
+ do { \
+ if (!(cond)) { \
+ return_expr; \
+ } \
+ } while (0)
+
+#define LOG_PRINT(message, ...) \
+ do { \
+ printf(message, ##__VA_ARGS__); \
+ } while (0)
+
+int64_t GetShapeSize(const std::vector& shape)
+{
+ int64_t shapeSize = 1;
+ for (auto i : shape) {
+ shapeSize *= i;
+ }
+ return shapeSize;
}
-int Init(int32_t deviceId, aclrtStream *stream)
+int Init(int32_t deviceId, aclrtStream* stream)
{
// 固定写法,资源初始化
auto ret = aclInit(nullptr);
@@ -46,171 +47,179 @@ int Init(int32_t deviceId, aclrtStream *stream)
}
template
-int CreateAclTensor(const std::vector& hostData, const std::vector& shape, void** deviceAddr,
- aclDataType dataType, aclTensor** tensor) {
- auto size = GetShapeSize(shape) * sizeof(T);
- // 调用aclrtMalloc申请device侧内存
- auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
- // 调用aclrtMemcpy将host侧数据复制到device侧内存上
- ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
-
- // 计算连续tensor的strides
- std::vector strides(shape.size(), 1);
- for (int64_t i = shape.size() - 2; i >= 0; i--) {
- strides[i] = shape[i + 1] * strides[i + 1];
- }
-
- // 调用aclCreateTensor接口创建aclTensor
- *tensor = aclCreateTensor(shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND,
- shape.data(), shape.size(), *deviceAddr);
- return 0;
+int CreateAclTensor(
+ const std::vector& hostData, const std::vector& shape, void** deviceAddr, aclDataType dataType,
+ aclTensor** tensor)
+{
+ auto size = GetShapeSize(shape) * sizeof(T);
+ // 调用aclrtMalloc申请device侧内存
+ auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret);
+ // 调用aclrtMemcpy将host侧数据复制到device侧内存上
+ ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE);
+ CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret);
+
+ // 计算连续tensor的strides
+ std::vector strides(shape.size(), 1);
+ for (int64_t i = shape.size() - 2; i >= 0; i--) {
+ strides[i] = shape[i + 1] * strides[i + 1];
+ }
+
+ // 调用aclCreateTensor接口创建aclTensor
+ *tensor = aclCreateTensor(
+ shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(),
+ *deviceAddr);
+ return 0;
}
-int main() {
- // 1. (固定写法)device/stream初始化,参考acl API手册
- // 根据自己的实际device填写deviceId
- int32_t deviceId = 0;
- aclrtStream stream;
- auto ret = Init(deviceId, &stream);
- CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
-
- // 2. 构造输入与输出,需要根据API的接口自定义构造
- std::vector selfShape1 = {2, 3};
- std::vector selfShape2 = {1, 3};
- std::vector otherShape1 = {2, 3};
- std::vector otherShape2 = {1, 3};
- std::vector