| 186 | } |
| 187 | |
| 188 | AFSymbolManager::AFSymbolManager() |
| 189 | : defaultHandle(nullptr) |
| 190 | , numBackends(0) |
| 191 | , backendsAvailable(0) |
| 192 | , logger(loggerFactory("unified")) { |
| 193 | // In order of priority. |
| 194 | static const af_backend order[] = {AF_BACKEND_CUDA, AF_BACKEND_ONEAPI, |
| 195 | AF_BACKEND_OPENCL, AF_BACKEND_CPU}; |
| 196 | LibHandle handle = nullptr; |
| 197 | af::Backend backend = AF_BACKEND_DEFAULT; |
| 198 | // Decremeting loop. The last successful backend loaded will be the most |
| 199 | // prefered one. |
| 200 | for (int i = NUM_BACKENDS - 1; i >= 0; i--) { |
| 201 | int bknd_idx = backend_index(order[i]); |
| 202 | bkndHandles[bknd_idx] = openDynLibrary(order[i]); |
| 203 | if (bkndHandles[bknd_idx]) { |
| 204 | handle = bkndHandles[bknd_idx]; |
| 205 | backend = order[i]; |
| 206 | numBackends++; |
| 207 | backendsAvailable += order[i]; |
| 208 | } |
| 209 | } |
| 210 | if (backend) { |
| 211 | AF_TRACE("AF_DEFAULT_BACKEND: {}", getBackendDirectoryName(backend)); |
| 212 | defaultBackend = backend; |
| 213 | } else { |
| 214 | logger->error("Backend was not found"); |
| 215 | defaultBackend = AF_BACKEND_DEFAULT; |
| 216 | } |
| 217 | |
| 218 | // Keep a copy of default order handle inorder to use it in ::setBackend |
| 219 | // when the user passes AF_BACKEND_DEFAULT |
| 220 | defaultHandle = handle; |
| 221 | } |
| 222 | |
| 223 | AFSymbolManager::~AFSymbolManager() { |
| 224 | for (auto& bkndHandle : bkndHandles) { |
nothing calls this directly
no test coverage detected