MCPcopy Create free account
hub / github.com/alibaba/MNN / _RebuildExternalOp

Function _RebuildExternalOp

source/core/OpCommonUtils.cpp:534–664  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

532 }
533}
534static bool _RebuildExternalOp(FileLoader* external, const MNN::Op* origin, flatbuffers::FlatBufferBuilder& builder) {
535 if (nullptr == external) {
536 MNN_ERROR("Can't rebuild external op because external is nullptr\n");
537 return false;
538 }
539 builder.Clear();
540 bool externalTmp = false;
541 if (nullptr != origin->externalPath()) {
542 external = new FileLoader(origin->externalPath()->c_str());
543 externalTmp = true;
544 }
545 flatbuffers::Offset<flatbuffers::String> externalPathFbb = 0;
546 flatbuffers::Offset<flatbuffers::String> opNameFbb = 0;
547 if (nullptr != origin->name()) {
548 opNameFbb = builder.CreateString(origin->name()->str());
549 }
550 flatbuffers::Offset<void> parameterMain;
551 switch (origin->main_type()) {
552 case OpParameter_Scale:
553 {
554 auto scale = origin->main_as_Scale();
555 auto externalInfo = scale->external()->data();
556 auto externalSize = scale->external()->size();
557 int outputCount = static_cast<int>(externalInfo[1] / sizeof(float));
558 std::vector<float> scaleData(outputCount);
559 external->offset(externalInfo[0]);
560 external->read((char*)scaleData.data(), externalInfo[1]);
561 auto scaleFbb = builder.CreateVector(scaleData);
562 flatbuffers::Offset<flatbuffers::Vector<float>> biasFbb = 0;
563 if (externalSize > 2) {
564 std::vector<float> biasData(outputCount);
565 external->read((char*)biasData.data(), externalInfo[2]);
566 biasFbb = builder.CreateVector(biasData);
567 }
568 ScaleBuilder builder_(builder);
569 builder_.add_biasData(biasFbb);
570 builder_.add_scaleData(scaleFbb);
571 builder_.add_channels(scale->channels());
572 parameterMain = builder_.Finish().Union();
573 break;
574 }
575 case OpParameter_LayerNorm:
576 {
577 auto layer_norm_param = origin->main_as_LayerNorm();
578 auto externalInfo = layer_norm_param->external()->data();
579 auto externalSize = layer_norm_param->external()->size();
580 int32_t size = static_cast<int32_t>(externalInfo[1]);
581 std::vector<float> gamma(size / sizeof(float));
582 std::vector<float> beta(size / sizeof(float));
583 external->offset(externalInfo[0]);
584 external->read((char*)gamma.data(), externalInfo[1]);
585 external->read((char*)beta.data(), externalInfo[2]);
586 flatbuffers::Offset<flatbuffers::Vector<int>> axisFbb = 0;
587 if (nullptr != layer_norm_param->axis()) {
588 std::vector<int> axis(layer_norm_param->axis()->size());
589 ::memcpy(axis.data(), layer_norm_param->axis()->data(), layer_norm_param->axis()->size() * sizeof(int));
590 axisFbb = builder.CreateVector(axis);
591 }

Callers 1

Calls 15

add_scaleDataMethod · 0.80
add_useRMSNormMethod · 0.80
add_externalPathMethod · 0.80
ClearMethod · 0.45
c_strMethod · 0.45
nameMethod · 0.45
strMethod · 0.45
dataMethod · 0.45
sizeMethod · 0.45
offsetMethod · 0.45
readMethod · 0.45
add_biasDataMethod · 0.45

Tested by

no test coverage detected