|
|
|
@@ -615,7 +615,7 @@ class PConstant : public PBase<PConstant<T> > { |
|
|
|
return new_vnode; |
|
|
|
} |
|
|
|
// x is not nullptr |
|
|
|
if (x->isa<CNode>()) { |
|
|
|
if (x->isa<CNode>() || x->isa<Parameter>()) { |
|
|
|
if ((x->abstract() == nullptr) || !x->abstract()->isa<abstract::AbstractTensor>()) { |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
@@ -650,8 +650,9 @@ class PConstant : public PBase<PConstant<T> > { |
|
|
|
ret = memcpy_s(data, mem_size, source_data, mem_size); |
|
|
|
} |
|
|
|
if (ret != 0) { |
|
|
|
MS_LOG(EXCEPTION) << "memcpy_s error, errorno " << ret << ", source size " << mem_size << "dest size" |
|
|
|
<< new_tensor_ptr->DataSize(); |
|
|
|
MS_LOG(INFO) << "memcpy_s error, error no " << ret << ", source size " << mem_size << "dest size" |
|
|
|
<< new_tensor_ptr->DataSize(); |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
auto new_vnode = NewValueNode(new_tensor_ptr); |
|
|
|
new_vnode->set_abstract(new_tensor_ptr->ToAbstract()); |
|
|
|
@@ -735,46 +736,60 @@ class PConstant : public PBase<PConstant<T> > { |
|
|
|
|
|
|
|
auto tensor_1_abstract = vnode_1->abstract()->cast<abstract::AbstractTensorPtr>(); |
|
|
|
auto tensor_2_abstract = vnode_1->abstract()->cast<abstract::AbstractTensorPtr>(); |
|
|
|
auto tensor_3_abstract = node_3->abstract()->cast<abstract::AbstractTensorPtr>(); |
|
|
|
|
|
|
|
TypePtr tensor_1_type_ptr = tensor_1_abstract->element()->BuildType(); |
|
|
|
TypePtr tensor_2_type_ptr = tensor_2_abstract->element()->BuildType(); |
|
|
|
TypePtr tensor_3_type_ptr = tensor_3_abstract->element()->BuildType(); |
|
|
|
if ((tensor_1_type_ptr->type_id() != tensor_3_type_ptr->type_id()) || |
|
|
|
(tensor_2_type_ptr->type_id() != tensor_3_type_ptr->type_id())) { |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
|
|
|
|
ShapeVector tensor_out_shape = tensor_3_abstract->shape()->shape(); |
|
|
|
int data_out_size = std::accumulate(tensor_out_shape.begin(), tensor_out_shape.end(), 1, std::multiplies<int>()); |
|
|
|
if ((tensor_ptr_1->DataSize() > 1) && (tensor_ptr_1->DataSize() != data_out_size)) { |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
if ((tensor_ptr_2->DataSize() > 1) && (tensor_ptr_2->DataSize() != data_out_size)) { |
|
|
|
return nullptr; |
|
|
|
ShapeVector tensor_out_shape; |
|
|
|
int data_out_size; |
|
|
|
tensor::TensorPtr new_tensor_ptr; |
|
|
|
|
|
|
|
if ((tensor_1_abstract->shape()->shape() == tensor_2_abstract->shape()->shape()) && |
|
|
|
(tensor_1_type_ptr->type_id() == tensor_2_type_ptr->type_id())) { |
|
|
|
// If two constant nodes have the same shape, then create a new one with this shape |
|
|
|
tensor_out_shape = tensor_1_abstract->shape()->shape(); |
|
|
|
data_out_size = std::accumulate(tensor_out_shape.begin(), tensor_out_shape.end(), 1, std::multiplies<int>()); |
|
|
|
|
|
|
|
new_tensor_ptr = std::make_shared<tensor::Tensor>(tensor_1_type_ptr->type_id(), tensor_out_shape); |
|
|
|
} else { |
|
|
|
// If two constant nodes have different shapes, then create a new one node with the shape of the 3rd node |
|
|
|
auto tensor_3_abstract = node_3->abstract()->cast<abstract::AbstractTensorPtr>(); |
|
|
|
|
|
|
|
TypePtr tensor_3_type_ptr = tensor_3_abstract->element()->BuildType(); |
|
|
|
if ((tensor_1_type_ptr->type_id() != tensor_3_type_ptr->type_id()) || |
|
|
|
(tensor_2_type_ptr->type_id() != tensor_3_type_ptr->type_id())) { |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
tensor_out_shape = tensor_3_abstract->shape()->shape(); |
|
|
|
data_out_size = std::accumulate(tensor_out_shape.begin(), tensor_out_shape.end(), 1, std::multiplies<int>()); |
|
|
|
if ((tensor_ptr_1->DataSize() > 1) && (tensor_ptr_1->DataSize() != data_out_size)) { |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
if ((tensor_ptr_2->DataSize() > 1) && (tensor_ptr_2->DataSize() != data_out_size)) { |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
new_tensor_ptr = std::make_shared<tensor::Tensor>(tensor_3_type_ptr->type_id(), tensor_out_shape); |
|
|
|
} |
|
|
|
|
|
|
|
auto new_tensor_ptr = std::make_shared<tensor::Tensor>(tensor_3_type_ptr->type_id(), tensor_out_shape); |
|
|
|
size_t mem_size = GetTypeByte(tensor_3_type_ptr) * IntToSize(new_tensor_ptr->ElementsNum()); |
|
|
|
size_t mem_size = GetTypeByte(new_tensor_ptr->Dtype()) * IntToSize(new_tensor_ptr->ElementsNum()); |
|
|
|
char *data = reinterpret_cast<char *>(new_tensor_ptr->data_c()); |
|
|
|
|
|
|
|
int ret = 0; |
|
|
|
void *data_out = nullptr; |
|
|
|
if ((tensor_3_type_ptr->type_id() == TypeId::kNumberTypeFloat32) || |
|
|
|
(tensor_3_type_ptr->type_id() == TypeId::kNumberTypeFloat)) { |
|
|
|
if ((new_tensor_ptr->data_type() == TypeId::kNumberTypeFloat32) || |
|
|
|
(new_tensor_ptr->data_type() == TypeId::kNumberTypeFloat)) { |
|
|
|
Multiply<float>(tensor_ptr_1->data_c(), tensor_ptr_1->DataSize(), tensor_ptr_2->data_c(), |
|
|
|
tensor_ptr_2->DataSize(), &data_out, data_out_size); |
|
|
|
ret = memcpy_s(data, mem_size, data_out, mem_size); |
|
|
|
delete[] reinterpret_cast<float *>(data_out); |
|
|
|
} else { |
|
|
|
if (tensor_3_type_ptr->type_id() == TypeId::kNumberTypeFloat64) { |
|
|
|
if (new_tensor_ptr->data_type() == TypeId::kNumberTypeFloat64) { |
|
|
|
Multiply<double>(tensor_ptr_1->data_c(), tensor_ptr_1->DataSize(), tensor_ptr_2->data_c(), |
|
|
|
tensor_ptr_2->DataSize(), &data_out, data_out_size); |
|
|
|
ret = memcpy_s(data, mem_size, data_out, mem_size); |
|
|
|
delete[] reinterpret_cast<double *>(data_out); |
|
|
|
} else { |
|
|
|
if ((tensor_3_type_ptr->type_id() == TypeId::kNumberTypeInt32) || |
|
|
|
(tensor_3_type_ptr->type_id() == TypeId::kNumberTypeInt)) { |
|
|
|
if ((new_tensor_ptr->data_type() == TypeId::kNumberTypeInt32) || |
|
|
|
(new_tensor_ptr->data_type() == TypeId::kNumberTypeInt)) { |
|
|
|
Multiply<int>(tensor_ptr_1->data_c(), tensor_ptr_1->DataSize(), tensor_ptr_2->data_c(), |
|
|
|
tensor_ptr_2->DataSize(), &data_out, data_out_size); |
|
|
|
ret = memcpy_s(data, mem_size, data_out, mem_size); |
|
|
|
|