003 File Manager
Current Path:
/usr/src/contrib/llvm-project/llvm/lib/Analysis
usr
/
src
/
contrib
/
llvm-project
/
llvm
/
lib
/
Analysis
/
📁
..
📄
AliasAnalysis.cpp
(33.55 KB)
📄
AliasAnalysisEvaluator.cpp
(15.64 KB)
📄
AliasAnalysisSummary.cpp
(3.49 KB)
📄
AliasAnalysisSummary.h
(10.17 KB)
📄
AliasSetTracker.cpp
(25.86 KB)
📄
Analysis.cpp
(5.29 KB)
📄
AssumeBundleQueries.cpp
(7.96 KB)
📄
AssumptionCache.cpp
(10.94 KB)
📄
BasicAliasAnalysis.cpp
(85.81 KB)
📄
BlockFrequencyInfo.cpp
(12.39 KB)
📄
BlockFrequencyInfoImpl.cpp
(28.6 KB)
📄
BranchProbabilityInfo.cpp
(43.48 KB)
📄
CFG.cpp
(9.9 KB)
📄
CFGPrinter.cpp
(11.2 KB)
📄
CFLAndersAliasAnalysis.cpp
(33.01 KB)
📄
CFLGraph.h
(21.23 KB)
📄
CFLSteensAliasAnalysis.cpp
(13.24 KB)
📄
CGSCCPassManager.cpp
(31.2 KB)
📄
CallGraph.cpp
(12.86 KB)
📄
CallGraphSCCPass.cpp
(26.31 KB)
📄
CallPrinter.cpp
(9.48 KB)
📄
CaptureTracking.cpp
(15.38 KB)
📄
CmpInstAnalysis.cpp
(4.63 KB)
📄
CodeMetrics.cpp
(6.99 KB)
📄
ConstantFolding.cpp
(105.15 KB)
📄
CostModel.cpp
(3.87 KB)
📄
DDG.cpp
(11.29 KB)
📄
Delinearization.cpp
(4.49 KB)
📄
DemandedBits.cpp
(16.27 KB)
📄
DependenceAnalysis.cpp
(150.78 KB)
📄
DependenceGraphBuilder.cpp
(19.24 KB)
📄
DivergenceAnalysis.cpp
(15.59 KB)
📄
DomPrinter.cpp
(9.67 KB)
📄
DomTreeUpdater.cpp
(15.21 KB)
📄
DominanceFrontier.cpp
(3.2 KB)
📄
EHPersonalities.cpp
(5.89 KB)
📄
GlobalsModRef.cpp
(41 KB)
📄
GuardUtils.cpp
(3.27 KB)
📄
HeatUtils.cpp
(2.85 KB)
📄
IVDescriptors.cpp
(42.28 KB)
📄
IVUsers.cpp
(16.12 KB)
📄
IndirectCallPromotionAnalysis.cpp
(4.33 KB)
📄
InlineAdvisor.cpp
(15.28 KB)
📄
InlineCost.cpp
(99.47 KB)
📄
InlineFeaturesAnalysis.cpp
(1.59 KB)
📄
InlineSizeEstimatorAnalysis.cpp
(10.95 KB)
📄
InstCount.cpp
(2.45 KB)
📄
InstructionPrecedenceTracking.cpp
(4.8 KB)
📄
InstructionSimplify.cpp
(216.91 KB)
📄
Interval.cpp
(1.78 KB)
📄
IntervalPartition.cpp
(4.5 KB)
📄
LazyBlockFrequencyInfo.cpp
(2.81 KB)
📄
LazyBranchProbabilityInfo.cpp
(2.96 KB)
📄
LazyCallGraph.cpp
(67.33 KB)
📄
LazyValueInfo.cpp
(76.38 KB)
📄
LegacyDivergenceAnalysis.cpp
(14.82 KB)
📄
Lint.cpp
(29.07 KB)
📄
Loads.cpp
(20.6 KB)
📄
LoopAccessAnalysis.cpp
(88.02 KB)
📄
LoopAnalysisManager.cpp
(6.6 KB)
📄
LoopCacheAnalysis.cpp
(23.53 KB)
📄
LoopInfo.cpp
(37.15 KB)
📄
LoopNestAnalysis.cpp
(10.62 KB)
📄
LoopPass.cpp
(12.89 KB)
📄
LoopUnrollAnalyzer.cpp
(7.26 KB)
📄
MLInlineAdvisor.cpp
(11.36 KB)
📄
MemDepPrinter.cpp
(5.13 KB)
📄
MemDerefPrinter.cpp
(2.53 KB)
📄
MemoryBuiltins.cpp
(41.14 KB)
📄
MemoryDependenceAnalysis.cpp
(69.89 KB)
📄
MemoryLocation.cpp
(7.92 KB)
📄
MemorySSA.cpp
(90.16 KB)
📄
MemorySSAUpdater.cpp
(57.9 KB)
📄
ModuleDebugInfoPrinter.cpp
(4.02 KB)
📄
ModuleSummaryAnalysis.cpp
(38.13 KB)
📄
MustExecute.cpp
(31.18 KB)
📄
ObjCARCAliasAnalysis.cpp
(5.81 KB)
📄
ObjCARCAnalysisUtils.cpp
(1.07 KB)
📄
ObjCARCInstKind.cpp
(23.15 KB)
📄
OptimizationRemarkEmitter.cpp
(4.23 KB)
📄
PHITransAddr.cpp
(16.05 KB)
📄
PhiValues.cpp
(8.4 KB)
📄
PostDominators.cpp
(3.59 KB)
📄
ProfileSummaryInfo.cpp
(18.07 KB)
📄
PtrUseVisitor.cpp
(1.28 KB)
📄
RegionInfo.cpp
(6.5 KB)
📄
RegionPass.cpp
(9.23 KB)
📄
RegionPrinter.cpp
(8.61 KB)
📄
ReleaseModeModelRunner.cpp
(2.83 KB)
📄
ScalarEvolution.cpp
(475.26 KB)
📄
ScalarEvolutionAliasAnalysis.cpp
(5.96 KB)
📄
ScalarEvolutionDivision.cpp
(7.51 KB)
📄
ScalarEvolutionNormalization.cpp
(4.59 KB)
📄
ScopedNoAliasAA.cpp
(7.38 KB)
📄
StackLifetime.cpp
(12.22 KB)
📄
StackSafetyAnalysis.cpp
(31.81 KB)
📄
StratifiedSets.h
(18.67 KB)
📄
SyncDependenceAnalysis.cpp
(12.97 KB)
📄
SyntheticCountsUtils.cpp
(3.81 KB)
📄
TFUtils.cpp
(8.99 KB)
📄
TargetLibraryInfo.cpp
(58.98 KB)
📄
TargetTransformInfo.cpp
(48.15 KB)
📄
Trace.cpp
(1.8 KB)
📄
TypeBasedAliasAnalysis.cpp
(26.04 KB)
📄
TypeMetadataUtils.cpp
(5.93 KB)
📄
VFABIDemangling.cpp
(16.46 KB)
📄
ValueLattice.cpp
(1.19 KB)
📄
ValueLatticeUtils.cpp
(1.53 KB)
📄
ValueTracking.cpp
(243.08 KB)
📄
VectorUtils.cpp
(48.57 KB)
📁
models
Editing: TFUtils.cpp
//===- TFUtils.cpp - tensorflow evaluation utilities ----------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file implements utilities for interfacing with tensorflow C APIs. // //===----------------------------------------------------------------------===// #include "llvm/Analysis/Utils/TFUtils.h" #include "llvm/ADT/Twine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/raw_ostream.h" #include "tensorflow/c/c_api.h" #include "tensorflow/c/c_api_experimental.h" #include <cassert> using namespace llvm; namespace { using TFGraphPtr = std::unique_ptr<TF_Graph, decltype(&TF_DeleteGraph)>; using TFSessionOptionsPtr = std::unique_ptr<TF_SessionOptions, decltype(&TF_DeleteSessionOptions)>; using TFStatusPtr = std::unique_ptr<TF_Status, decltype(&TF_DeleteStatus)>; struct TFInitializer { TFInitializer() { assert(!IsInitialized && "TFInitialized should be called only once"); int Argc = 1; const char *Name = ""; const char **NamePtr = &Name; TF_InitMain(Name, &Argc, const_cast<char ***>(&NamePtr)); IsInitialized = true; } bool IsInitialized = false; }; llvm::ManagedStatic<TFInitializer> TFLibInitializer; bool ensureInitTF() { return TFLibInitializer->IsInitialized; } TFGraphPtr createTFGraph() { return TFGraphPtr(TF_NewGraph(), &TF_DeleteGraph); } TFStatusPtr createTFStatus() { return TFStatusPtr(TF_NewStatus(), &TF_DeleteStatus); } TFSessionOptionsPtr createTFSessionOptions() { return TFSessionOptionsPtr(TF_NewSessionOptions(), &TF_DeleteSessionOptions); } } // namespace namespace llvm { class EvaluationResultImpl { public: EvaluationResultImpl(size_t OutputSize) : OutputSize(OutputSize), Output(OutputSize){}; ~EvaluationResultImpl() { for (auto *P : Output) if (P) TF_DeleteTensor(P); } EvaluationResultImpl(const EvaluationResultImpl &) = delete; EvaluationResultImpl(EvaluationResultImpl &&Other) = delete; std::vector<TF_Tensor *> &getOutput() { return Output; } private: const size_t OutputSize; std::vector<TF_Tensor *> Output; }; class TFModelEvaluatorImpl { public: TFModelEvaluatorImpl(StringRef SavedModelPath, const std::vector<std::string> &InputNames, const std::vector<std::string> &OutputNames, const char *Tags); bool isValid() const { return IsValid; } size_t OutputSize() const { return OutputFeed.size(); } void evaluate(TF_Tensor **Output, TF_Status *Status) { TF_SessionRun(Session, nullptr, InputFeed.data(), Input.data(), Input.size(), OutputFeed.data(), Output, OutputFeed.size(), nullptr, 0, nullptr, Status); } void initInput(size_t Index, TF_DataType Type, const std::vector<int64_t> &Dimensions); const std::vector<TF_Tensor *> &getInput() const { return Input; } ~TFModelEvaluatorImpl(); private: /// The objects necessary for carrying out an evaluation of the SavedModel. /// They are expensive to set up, and we maintain them accross all the /// evaluations of the model. TF_Session *Session = nullptr; TFGraphPtr Graph; TFSessionOptionsPtr Options; /// The specification of the input nodes. std::vector<TF_Output> InputFeed; /// The input tensors. They must match by index of the corresponding InputFeed /// value. We set up the tensors once and just mutate theirs scalars before /// each evaluation. The input tensors keep their value after an evaluation. std::vector<TF_Tensor *> Input; /// The specification of the output nodes. When evaluating, the tensors in the /// output tensor vector must match by index the corresponding element in the /// OutputFeed. std::vector<TF_Output> OutputFeed; void invalidate() { IsValid = false; } bool IsValid = true; /// Reusable utility for ensuring we can bind the requested Name to a node in /// the SavedModel Graph. bool checkReportAndInvalidate(const TF_Output &Output, StringRef Name); }; } // namespace llvm TFModelEvaluatorImpl::TFModelEvaluatorImpl( StringRef SavedModelPath, const std::vector<std::string> &InputNames, const std::vector<std::string> &OutputNames, const char *Tags) : Graph(createTFGraph()), Options(createTFSessionOptions()), InputFeed(InputNames.size()), Input(InputNames.size()), OutputFeed(OutputNames.size()) { if (!ensureInitTF()) { errs() << "Tensorflow should have been initialized"; return; } auto Status = createTFStatus(); Session = TF_LoadSessionFromSavedModel(Options.get(), nullptr, SavedModelPath.str().c_str(), &Tags, 1, Graph.get(), nullptr, Status.get()); if (TF_GetCode(Status.get()) != TF_Code::TF_OK) { errs() << TF_Message(Status.get()); invalidate(); } for (size_t I = 0; I < InputNames.size(); ++I) { InputFeed[I] = { TF_GraphOperationByName(Graph.get(), (InputNames[I]).c_str()), 0}; if (!checkReportAndInvalidate(InputFeed[I], InputNames[I])) return; } for (size_t I = 0; I < OutputNames.size(); ++I) { OutputFeed[I] = { TF_GraphOperationByName(Graph.get(), (OutputNames[I]).c_str()), 0}; if (!checkReportAndInvalidate(OutputFeed[I], OutputNames[I])) return; } } TFModelEvaluator::TFModelEvaluator(StringRef SavedModelPath, const std::vector<std::string> &InputNames, const std::vector<std::string> &OutputNames, const char *Tags) : Impl(new TFModelEvaluatorImpl(SavedModelPath, InputNames, OutputNames, Tags)) { if (!Impl->isValid()) Impl.reset(); } TFModelEvaluatorImpl::~TFModelEvaluatorImpl() { for (auto *T : Input) { TF_DeleteTensor(T); } if (Session == nullptr) return; auto Status = createTFStatus(); TF_DeleteSession(Session, Status.get()); Session = nullptr; if (TF_GetCode(Status.get()) != TF_Code::TF_OK) errs() << "Could not delete TF session"; } bool TFModelEvaluatorImpl::checkReportAndInvalidate(const TF_Output &Output, StringRef Name) { if (Output.oper) return true; errs() << "Could not find TF_Output named: " + Name; IsValid = false; return IsValid; } Optional<TFModelEvaluator::EvaluationResult> TFModelEvaluator::evaluate() { if (!isValid()) return None; std::unique_ptr<EvaluationResultImpl> Ret = std::make_unique<EvaluationResultImpl>(Impl->OutputSize()); auto Status = createTFStatus(); Impl->evaluate(Ret->getOutput().data(), Status.get()); if (TF_GetCode(Status.get()) != TF_Code::TF_OK) { errs() << TF_Message(Status.get()); Impl.reset(); return None; } return EvaluationResult(std::move(Ret)); } void TFModelEvaluatorImpl::initInput(size_t Index, TF_DataType Type, const std::vector<int64_t> &Dimensions) { int64_t TotalSize = TF_DataTypeSize(Type); for (auto &D : Dimensions) TotalSize *= D; Input[Index] = TF_AllocateTensor(Type, Dimensions.data(), Dimensions.size(), TotalSize); std::memset(TF_TensorData(Input[Index]), 0, TotalSize); } void *TFModelEvaluator::getUntypedInput(size_t Index) { return TF_TensorData(Impl->getInput()[Index]); } TFModelEvaluator::EvaluationResult::EvaluationResult( std::unique_ptr<EvaluationResultImpl> Impl) : Impl(std::move(Impl)) {} TFModelEvaluator::EvaluationResult::EvaluationResult(EvaluationResult &&Other) : Impl(std::move(Other.Impl)) {} void *TFModelEvaluator::EvaluationResult::getUntypedTensorValue(size_t Index) { return TF_TensorData(Impl->getOutput()[Index]); } void TFModelEvaluator::initInput(size_t Index, int TypeIndex, const std::vector<int64_t> &Dimensions) { Impl->initInput(Index, static_cast<TF_DataType>(TypeIndex), Dimensions); } template <> int TFModelEvaluator::getModelTypeIndex<float>() { return TF_FLOAT; } template <> int TFModelEvaluator::getModelTypeIndex<double>() { return TF_DOUBLE; } template <> int TFModelEvaluator::getModelTypeIndex<int8_t>() { return TF_INT8; } template <> int TFModelEvaluator::getModelTypeIndex<uint8_t>() { return TF_UINT8; } template <> int TFModelEvaluator::getModelTypeIndex<int16_t>() { return TF_INT16; } template <> int TFModelEvaluator::getModelTypeIndex<uint16_t>() { return TF_UINT16; } template <> int TFModelEvaluator::getModelTypeIndex<int32_t>() { return TF_INT32; } template <> int TFModelEvaluator::getModelTypeIndex<uint32_t>() { return TF_UINT32; } template <> int TFModelEvaluator::getModelTypeIndex<int64_t>() { return TF_INT64; } template <> int TFModelEvaluator::getModelTypeIndex<uint64_t>() { return TF_UINT64; } TFModelEvaluator::EvaluationResult::~EvaluationResult() {} TFModelEvaluator::~TFModelEvaluator() {}
Upload File
Create Folder