!427 fix segment fault found by self

From: @zhou_lili
Reviewed-by: @liujunzhu,@youui
Signed-off-by: @liujunzhu
pull/427/MERGE
mindspore-ci-bot 4 years ago committed by Gitee
commit 4c7569f965

@ -964,9 +964,10 @@ Status DavinciModel::InitDataOp(const NodePtr &node, uint32_t &data_op_index, ma
const vector<int64_t> output_size_list = ModelUtils::GetOutputSize(op_desc); const vector<int64_t> output_size_list = ModelUtils::GetOutputSize(op_desc);
const vector<void *> virtual_addr_list = ModelUtils::GetOutputDataAddrs(runtime_param_, op_desc); const vector<void *> virtual_addr_list = ModelUtils::GetOutputDataAddrs(runtime_param_, op_desc);
const vector<int64_t> output_offset_list = op_desc->GetOutputOffset(); const vector<int64_t> output_offset_list = op_desc->GetOutputOffset();
if (output_offset_list.size() != virtual_addr_list.size()) { if (output_size_list.empty() || virtual_addr_list.empty() || (output_size_list.size() != virtual_addr_list.size()) ||
GELOGE(PARAM_INVALID, "virtual_addr size:%zu should be equal to offset size:%zu.", virtual_addr_list.size(), (output_offset_list.size() != virtual_addr_list.size())) {
output_offset_list.size()); GELOGE(PARAM_INVALID, "Data[%s] init failed: output size is %zu, virtual_addr size is %zu, offset size is %zu.",
op_desc->GetName().c_str(), output_size_list.size(), virtual_addr_list.size(), output_offset_list.size());
return PARAM_INVALID; return PARAM_INVALID;
} }
auto data_index = data_op_index; auto data_index = data_op_index;
@ -975,7 +976,9 @@ Status DavinciModel::InitDataOp(const NodePtr &node, uint32_t &data_op_index, ma
} }
bool fusion_flag = false; bool fusion_flag = false;
ZeroCopyOffset zero_copy_offset; ZeroCopyOffset zero_copy_offset;
Status ret = zero_copy_offset.InitInputDataInfo(output_size_list, virtual_addr_list, op_desc, fusion_flag); int64_t data_size = output_size_list[kDataIndex];
void *virtual_addr = virtual_addr_list[kDataIndex];
Status ret = zero_copy_offset.InitInputDataInfo(data_size, virtual_addr, op_desc, fusion_flag);
if (ret != SUCCESS) { if (ret != SUCCESS) {
GELOGE(PARAM_INVALID, "InitDataInfo of input_info %s failed.", op_desc->GetName().c_str()); GELOGE(PARAM_INVALID, "InitDataInfo of input_info %s failed.", op_desc->GetName().c_str());
return PARAM_INVALID; return PARAM_INVALID;

@ -30,18 +30,11 @@ ZeroCopyOffset::ZeroCopyOffset() {}
ZeroCopyOffset::~ZeroCopyOffset() {} ZeroCopyOffset::~ZeroCopyOffset() {}
Status ZeroCopyOffset::InitInputDataInfo(const vector<int64_t> &output_size_list, Status ZeroCopyOffset::InitInputDataInfo(int64_t output_size, void *virtual_addr, const OpDescPtr &op_desc,
const vector<void *> &virtual_addr_list, const OpDescPtr &op_desc,
bool &fusion_flag) { bool &fusion_flag) {
GELOGI("[ZCPY] Start to InitInputDataInfo of %s, total_data_size is %ld, virtual_addr is %p", GELOGI("[ZCPY] Start to InitInputDataInfo of %s, total_data_size is %ld, virtual_addr is %p",
op_desc->GetName().c_str(), output_size_list[kDataIndex], virtual_addr_list[kDataIndex]); op_desc->GetName().c_str(), output_size, virtual_addr);
if (output_size_list.empty() || virtual_addr_list.empty() || (output_size_list.size() != virtual_addr_list.size())) { basic_addr_ = virtual_addr;
GELOGE(PARAM_INVALID, "Data[%s] init failed: Output size is %zu, Output addr is %zu", op_desc->GetName().c_str(),
output_size_list.size(), virtual_addr_list.size());
return PARAM_INVALID;
}
basic_addr_ = virtual_addr_list[kDataIndex];
(void)ge::AttrUtils::GetListInt(op_desc, ATTR_ZERO_COPY_BASIC_OFFSET, zero_copy_basic_offset_); (void)ge::AttrUtils::GetListInt(op_desc, ATTR_ZERO_COPY_BASIC_OFFSET, zero_copy_basic_offset_);
(void)ge::AttrUtils::GetListInt(op_desc, ATTR_ZERO_COPY_RELATIVE_OFFSET, zero_copy_relative_offset_); (void)ge::AttrUtils::GetListInt(op_desc, ATTR_ZERO_COPY_RELATIVE_OFFSET, zero_copy_relative_offset_);
GE_CHK_BOOL_EXEC(zero_copy_basic_offset_.size() == zero_copy_relative_offset_.size(), return PARAM_INVALID, GE_CHK_BOOL_EXEC(zero_copy_basic_offset_.size() == zero_copy_relative_offset_.size(), return PARAM_INVALID,
@ -53,26 +46,23 @@ Status ZeroCopyOffset::InitInputDataInfo(const vector<int64_t> &output_size_list
IsL2Fusion(zero_copy_basic_offset_, virtual_addr_offset, fusion_flag); IsL2Fusion(zero_copy_basic_offset_, virtual_addr_offset, fusion_flag);
uint32_t out_count = 0; uint32_t out_count = 0;
data_size_ = output_size_list[kDataIndex]; data_size_ = output_size;
if (!fusion_flag) { if (!fusion_flag) {
GELOGI("[ZCPY] %s not set l2_fusion.", op_desc->GetName().c_str()); GELOGI("[ZCPY] %s not set l2_fusion.", op_desc->GetName().c_str());
out_count++; out_count++;
data_info_.emplace_back(output_size_list[kDataIndex], virtual_addr_list[kDataIndex]); data_info_.emplace_back(output_size, virtual_addr);
relative_offset_.emplace_back(0); relative_offset_.emplace_back(0);
GELOGI("[ZCPY] %s size is %ld, virtual_addr is %p.", op_desc->GetName().c_str(), output_size_list[kDataIndex], GELOGI("[ZCPY] %s size is %ld, virtual_addr is %p.", op_desc->GetName().c_str(), output_size, virtual_addr);
virtual_addr_list[kDataIndex]);
} else { } else {
GELOGI("[ZCPY] set l2_fusion for %s.", op_desc->GetName().c_str()); GELOGI("[ZCPY] set l2_fusion for %s.", op_desc->GetName().c_str());
for (size_t index = 0; index < zero_copy_basic_offset_.size(); ++index) { for (size_t index = 0; index < zero_copy_basic_offset_.size(); ++index) {
if (zero_copy_basic_offset_.at(index) == virtual_addr_offset) { if (zero_copy_basic_offset_.at(index) == virtual_addr_offset) {
out_count++; out_count++;
uint64_t out_offset = uint64_t out_offset = reinterpret_cast<uint64_t>(virtual_addr) + zero_copy_relative_offset_.at(index);
reinterpret_cast<uint64_t>(virtual_addr_list[kDataIndex]) + zero_copy_relative_offset_.at(index); data_info_.emplace_back(output_size, reinterpret_cast<void *>(static_cast<uintptr_t>(out_offset)));
int64_t real_data_size = ModelUtils::GetOutputSize(op_desc).at(kDataIndex);
data_info_.emplace_back(real_data_size, reinterpret_cast<void *>(static_cast<uintptr_t>(out_offset)));
relative_offset_.emplace_back(zero_copy_relative_offset_.at(index)); relative_offset_.emplace_back(zero_copy_relative_offset_.at(index));
GELOGI("[ZCPY] virtual_addr: %p has been l2-fusion to %lu, need copy data_size is %ld.", basic_addr_, GELOGI("[ZCPY] virtual_addr: %p has been l2-fusion to %lu, need copy data_size is %ld.", basic_addr_,
out_offset, real_data_size); out_offset, output_size);
} }
} }
} }

@ -42,8 +42,7 @@ class ZeroCopyOffset {
ZeroCopyOffset(); ZeroCopyOffset();
~ZeroCopyOffset(); ~ZeroCopyOffset();
Status InitInputDataInfo(const vector<int64_t> &output_size_list, const vector<void *> &virtual_addr_list, Status InitInputDataInfo(int64_t output_size, void *virtual_addr, const OpDescPtr &op_desc, bool &fusion_flag);
const OpDescPtr &op_desc, bool &fusion_flag);
void SetInputOutsideAddrs(const vector<int64_t> &output_offset_list, void *addr, const size_t &index, void SetInputOutsideAddrs(const vector<int64_t> &output_offset_list, void *addr, const size_t &index,
bool fusion_flag, std::set<const void *> &real_virtual_addrs); bool fusion_flag, std::set<const void *> &real_virtual_addrs);

Loading…
Cancel
Save