提交 15d7e8b3 编写于 作者: alinag's avatar alinag

reduce Eigen transformation

test=develop
上级 5cf46e90
...@@ -46,40 +46,40 @@ void ReduceFunctor(const lite::Tensor& input, ...@@ -46,40 +46,40 @@ void ReduceFunctor(const lite::Tensor& input,
lite::Tensor* output, lite::Tensor* output,
const std::vector<int>& dims, const std::vector<int>& dims,
bool keep_dim) { bool keep_dim) {
auto x = EigenTensor<T, D>::From(input); auto te = strstr(typeid(Functor).name(), "SumFunctor");
if (D == 3 && R_D == 1 && te != NULL) {
auto reduce_dim = Eigen::array<int, R_D>(); const lite::DDim& input_dims = input.dims();
auto x_rank = static_cast<int>(x.dimensions().size()); const T* input_data = input.data<T>();
for (size_t i = 0; i < dims.size(); ++i) { T* output_data = output->mutable_data<T>();
if (dims[i] < 0) { for (int i = 0; i < input_dims[0]; i++) {
reduce_dim[i] = x_rank + dims[i]; for (int k = 0; k < input_dims[2]; k++) {
} else { int out_d = i * input_dims[2] + k;
reduce_dim[i] = dims[i]; T output_temp = 0;
for (int j = 0; j < input_dims[1]; j++) {
int input_d =
i * input_dims[1] * input_dims[2] + j * input_dims[2] + k;
output_temp = output_temp + input_data[input_d];
}
output_data[out_d] = output_temp;
}
} }
}
Functor functor;
if (D == 1) {
auto out = EigenScalar<T>::From(output);
functor(&x, &out, reduce_dim);
} else { } else {
auto te = strstr(typeid(Functor).name(), "SumFunctor"); auto x = EigenTensor<T, D>::From(input);
if (D == 3 && R_D == 1 && te != NULL) {
const lite::DDim& input_dims = input.dims(); auto reduce_dim = Eigen::array<int, R_D>();
const T* input_data = input.data<T>(); auto x_rank = static_cast<int>(x.dimensions().size());
T* output_data = output->mutable_data<T>(); for (size_t i = 0; i < dims.size(); ++i) {
for (int i = 0; i < input_dims[0]; i++) { if (dims[i] < 0) {
for (int k = 0; k < input_dims[2]; k++) { reduce_dim[i] = x_rank + dims[i];
int out_d = i * input_dims[2] + k; } else {
T output_temp = 0; reduce_dim[i] = dims[i];
for (int j = 0; j < input_dims[1]; j++) {
int input_d =
i * input_dims[1] * input_dims[2] + j * input_dims[2] + k;
output_temp = output_temp + input_data[input_d];
}
output_data[out_d] = output_temp;
}
} }
}
Functor functor;
if (D == 1) {
auto out = EigenScalar<T>::From(output);
functor(&x, &out, reduce_dim);
} else { } else {
auto out = EigenTensor<T, (D - R_D)>::From(*output, output->dims()); auto out = EigenTensor<T, (D - R_D)>::From(*output, output->dims());
functor(&x, &out, reduce_dim); functor(&x, &out, reduce_dim);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册