已合并
[perf]Svd l0 cancel alloc tensor when computeUV is false #1739
FengHaozhan创建于 3月18日
[perf]Svd l0 cancel alloc tensor when computeUV is false #1739
已合并
共 2 个文件变更+29-16
| @@ -26,7 +26,8 @@ OP_TYPE_REGISTER(Svd); | |||
| 26 | 26 | ||
| 27 | static constexpr int32_t MIN_X_DIM = 2; | 27 | static constexpr int32_t MIN_X_DIM = 2; |
| 28 | 28 | ||
| 29 | -static std::tuple<aclTensor*, aclTensor*, aclTensor*> allocOutTensor(const aclTensor *x, const bool fullMatrices, aclOpExecutor *executor) | 29 | +static std::tuple<aclTensor*, aclTensor*, aclTensor*> |
| 30 | + allocOutTensor(const aclTensor *x, const bool fullMatrices, aclOpExecutor *executor, const bool computeUV) | ||
| 30 | { | 31 | { |
| 31 | int64_t xDim = x->GetViewShape().GetDimNum(); | 32 | int64_t xDim = x->GetViewShape().GetDimNum(); |
| 32 | op::Shape xShape = x->GetViewShape(); | 33 | op::Shape xShape = x->GetViewShape(); |
| @@ -39,27 +40,30 @@ static std::tuple<aclTensor*, aclTensor*, aclTensor*> allocOutTensor(const aclTe | |||
| 39 | // sigma、u、v与x的前xDim-2维格式相同 | 40 | // sigma、u、v与x的前xDim-2维格式相同 |
| 40 | for (int64_t i = 0; i < xDim - MIN_X_DIM; i++) { | 41 | for (int64_t i = 0; i < xDim - MIN_X_DIM; i++) { |
| 41 | sigmaShape.AppendDim(xShape[i]); | 42 | sigmaShape.AppendDim(xShape[i]); |
| 42 | - uShape.AppendDim(xShape[i]); | 43 | + if(computeUV) { |
| 43 | - vShape.AppendDim(xShape[i]); | 44 | + uShape.AppendDim(xShape[i]); |
| 45 | + vShape.AppendDim(xShape[i]); | ||
| 46 | + } | ||
| 44 | } | 47 | } |
| 45 | /* | 48 | /* |
| 46 | * x:[..., m, n] k = min(m, n) | 49 | * x:[..., m, n] k = min(m, n) |
| 47 | * fullMatrices == true --> u:[..., m, m],(sigma):[..., k],v:[..., n, n],diag(sigma):[..., m, n] | 50 | * fullMatrices == true --> u:[..., m, m],(sigma):[..., k],v:[..., n, n],diag(sigma):[..., m, n] |
| 48 | * fullMatrices == false --> u:[..., m, k],(sigma):[..., k],v:[..., n, k],diag(sigma):[..., k, k] | 51 | * fullMatrices == false --> u:[..., m, k],(sigma):[..., k],v:[..., n, k],diag(sigma):[..., k, k] |
| 49 | */ | 52 | */ |
| 50 | - if (fullMatrices) { | 53 | + if (computeUV) { |
| 51 | - uShape.AppendDim(m); | 54 | + if (fullMatrices) { |
| 52 | - uShape.AppendDim(m); | 55 | + uShape.AppendDim(m); |
| 53 | - sigmaShape.AppendDim(k); | 56 | + uShape.AppendDim(m); |
| 54 | - vShape.AppendDim(n); | 57 | + vShape.AppendDim(n); |
| 55 | - vShape.AppendDim(n); | 58 | + vShape.AppendDim(n); |
| 56 | - } else { | 59 | + } else { |
| 57 | - uShape.AppendDim(m); | 60 | + uShape.AppendDim(m); |
| 58 | - uShape.AppendDim(k); | 61 | + uShape.AppendDim(k); |
| 59 | - sigmaShape.AppendDim(k); | 62 | + vShape.AppendDim(n); |
| 60 | - vShape.AppendDim(n); | 63 | + vShape.AppendDim(k); |
| 61 | - vShape.AppendDim(k); | 64 | + } |
| 62 | } | 65 | } |
| 66 | + sigmaShape.AppendDim(k); | ||
| 63 | auto u = executor->AllocTensor(uShape, x->GetDataType()); | 67 | auto u = executor->AllocTensor(uShape, x->GetDataType()); |
| 64 | auto sigma = executor->AllocTensor(sigmaShape, x->GetDataType()); | 68 | auto sigma = executor->AllocTensor(sigmaShape, x->GetDataType()); |
| 65 | auto v = executor->AllocTensor(vShape, x->GetDataType()); | 69 | auto v = executor->AllocTensor(vShape, x->GetDataType()); |
| @@ -70,7 +74,7 @@ static std::tuple<aclTensor*, aclTensor*, aclTensor*> allocOutTensor(const aclTe | |||
| 70 | const std::tuple<aclTensor*, aclTensor*, aclTensor*> Svd( | 74 | const std::tuple<aclTensor*, aclTensor*, aclTensor*> Svd( |
| 71 | const aclTensor *x, const bool fullMatrices, const bool computeUV, aclOpExecutor *executor) | 75 | const aclTensor *x, const bool fullMatrices, const bool computeUV, aclOpExecutor *executor) |
| 72 | { | 76 | { |
| 73 | - std::tuple<aclTensor*, aclTensor*, aclTensor*> outTensor = allocOutTensor(x, fullMatrices, executor); | 77 | + std::tuple<aclTensor*, aclTensor*, aclTensor*> outTensor = allocOutTensor(x, fullMatrices, executor, computeUV); |
| 74 | aclTensor *sigma = get<0>(outTensor); | 78 | aclTensor *sigma = get<0>(outTensor); |
| 75 | aclTensor *u = get<1>(outTensor); | 79 | aclTensor *u = get<1>(outTensor); |
| 76 | aclTensor *v = get<2>(outTensor); | 80 | aclTensor *v = get<2>(outTensor); |
| @@ -67,3 +67,12 @@ TEST_F(SvdTest, SvdTest_fullMatrices_false_SUCC) { | |||
| 67 | ASSERT_NE(v, nullptr); | 67 | ASSERT_NE(v, nullptr); |
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | +TEST_F(SvdTest, SvdTest_ComputeUV_false_SUCC) { | ||
| 71 | + auto x = CreateAclTensor({2, 3}, ACL_FLOAT); | ||
| 72 | + bool fullMatrices = false; | ||
| 73 | + bool computeUV= false; | ||
| 74 | + auto [sigma, u, v] = l0op::Svd(x, fullMatrices, computeUV, exe); | ||
| 75 | + ASSERT_NE(sigma, nullptr); | ||
| 76 | + ASSERT_NE(u, nullptr); | ||
| 77 | + ASSERT_NE(v, nullptr); | ||
| 78 | +} | ||
math/svd/op_host/op_api/svd.cppif(computeUV) {在`if`关键字和左括号之间添加一个空格,修改为:`if (computeUV) {`。此评论由代码审查工具自动生成