| 1210 | } |
| 1211 | |
| 1212 | OptimizationResult AssignBackends(OptimizedNetworkImpl* optNetObjPtr, |
| 1213 | BackendSettings& backendSettings, |
| 1214 | Graph::Iterator& firstLayer, |
| 1215 | Graph::Iterator& lastLayer, |
| 1216 | Optional<std::vector<std::string>&> errMessages) |
| 1217 | { |
| 1218 | ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "Optimizer_AssignBackends"); |
| 1219 | OptimizationResult result; |
| 1220 | |
| 1221 | bool restart = false; |
| 1222 | BackendIdVector availablePreferredBackends; |
| 1223 | for (auto it = firstLayer; it != lastLayer; it = (restart ? firstLayer : ++it)) |
| 1224 | { |
| 1225 | if (it == firstLayer) |
| 1226 | { |
| 1227 | availablePreferredBackends = backendSettings.GetAvailablePreferredBackends(); |
| 1228 | if (availablePreferredBackends.empty()) |
| 1229 | { |
| 1230 | ReportError("No preferred backends are available", errMessages); |
| 1231 | result.m_Error = true; |
| 1232 | return result; |
| 1233 | } |
| 1234 | } |
| 1235 | // In the case where we've set restart it must be reset before we continue looking at backends. |
| 1236 | if (restart) |
| 1237 | { |
| 1238 | restart = false; |
| 1239 | } |
| 1240 | AssignBackendsIConnectable(optNetObjPtr, |
| 1241 | *it, |
| 1242 | errMessages, |
| 1243 | result, |
| 1244 | backendSettings, |
| 1245 | availablePreferredBackends, |
| 1246 | restart); |
| 1247 | } |
| 1248 | |
| 1249 | for (auto it = firstLayer; it != lastLayer; ++it) |
| 1250 | { |
| 1251 | auto layer = PolymorphicDowncast<Layer*>(*it); |
| 1252 | std::vector<DataType> inOutDataType = GetLayerInOutDatatype(layer); |
| 1253 | |
| 1254 | // In AttemptBackendAssignment() we check: |
| 1255 | // - if input/output datatypes of the layer are float16 |
| 1256 | // - if the layer is supported with these datatypes |
| 1257 | // If the layer is not supported (failing on ARM_COMPUTE_RETURN_ERROR_ON_CPU_F16_UNSUPPORTED() in clframework), |
| 1258 | // we attempt to insert convertion layers either side of the new fp32 layer. |
| 1259 | bool isFloat16 = false; |
| 1260 | for (auto type : inOutDataType) |
| 1261 | { |
| 1262 | if (type == DataType::Float16) |
| 1263 | { |
| 1264 | isFloat16 = true; |
| 1265 | break; |
| 1266 | } |
| 1267 | } |
| 1268 | |
| 1269 | if (layer->GetBackendId() == "Unknown" || isFloat16) |
no test coverage detected