| 1371 | } |
| 1372 | |
| 1373 | OptimizationResult ApplyBackendOptimizations(OptimizedNetworkImpl* optNetObjPtr, |
| 1374 | BackendSettings& backendSettings, |
| 1375 | BackendsMap& backends, |
| 1376 | const ModelOptions& modelOptions, |
| 1377 | Optional<std::vector<std::string>&> errMessages) |
| 1378 | { |
| 1379 | ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_ApplyBackendOptimizations") |
| 1380 | OptimizationResult result; |
| 1381 | |
| 1382 | // Get the optimized graph |
| 1383 | Graph& optGraph = optNetObjPtr->GetGraph(); |
| 1384 | |
| 1385 | // Run backend specific optimizations |
| 1386 | for (auto&& selectedBackend : backendSettings.m_SelectedBackends) |
| 1387 | { |
| 1388 | auto backendObjPtr = backends.find(selectedBackend)->second.get(); |
| 1389 | if (!backendObjPtr) |
| 1390 | { |
| 1391 | throw armnn::NullPointerException("backendObjPtr must not be null."); |
| 1392 | } |
| 1393 | |
| 1394 | |
| 1395 | if (selectedBackend == armnn::Compute::GpuAcc || selectedBackend == armnn::Compute::CpuAcc) |
| 1396 | { |
| 1397 | Optimizer::Pass(optGraph, MakeOptimizations(optimizations::PermuteDepthwiseConv2dWeights())); |
| 1398 | Optimizer::Pass(optGraph, MakeOptimizations(optimizations::FusePermuteIntoConstLayer())); |
| 1399 | Optimizer::Pass(optGraph, MakeOptimizations(optimizations::FoldPadIntoConvolution2d(), |
| 1400 | optimizations::FoldPadIntoDepthwiseConvolution2d(), |
| 1401 | optimizations::FoldPadIntoPooling2d())); |
| 1402 | } |
| 1403 | |
| 1404 | // Select sub-graphs based on backend |
| 1405 | SubgraphViewSelector::Subgraphs subgraphs = |
| 1406 | SubgraphViewSelector::SelectSubgraphs(optGraph, |
| 1407 | // Select layers assigned to the requested backend |
| 1408 | [&backendObjPtr](const Layer& layer) |
| 1409 | { |
| 1410 | |
| 1411 | return layer.GetType() != LayerType::Input && |
| 1412 | layer.GetType() != LayerType::Output && |
| 1413 | layer.GetBackendId() == backendObjPtr->GetId(); |
| 1414 | }); |
| 1415 | if (subgraphs.empty()) |
| 1416 | { |
| 1417 | // No sub-graphs found, try with next selected backend |
| 1418 | continue; |
| 1419 | } |
| 1420 | |
| 1421 | // Try to optimize each sub-graph |
| 1422 | for (auto& subgraph : subgraphs) |
| 1423 | { |
| 1424 | // Try to optimize the current sub-graph |
| 1425 | ARMNN_SCOPED_PROFILING_EVENT(backendObjPtr->GetId(), "Optimizer_OptimizeSubgraph"); |
| 1426 | OptimizationViews optimizationViews = backendObjPtr->OptimizeSubgraphView(*subgraph, modelOptions); |
| 1427 | if (!optimizationViews.Validate(*subgraph)) |
| 1428 | { |
| 1429 | throw armnn::Exception("optimizationViews must have a valid subgraph."); |
| 1430 | } |
no test coverage detected