| 268 | Spinlock CambriconCompNodeImpl::sd_mtx; |
| 269 | |
| 270 | void CambriconCompNodeImpl::init( |
| 271 | const Locator& locator, const Locator& locator_logical) { |
| 272 | m_locator = locator; |
| 273 | m_locator_logical = locator_logical; |
| 274 | m_initialized = true; |
| 275 | #if defined(__linux__) || defined(TARGET_OS_MAC) |
| 276 | FILE* fp; |
| 277 | fp = fopen("/dev/urandom", "r"); |
| 278 | mgb_assert(fread(&m_uid, sizeof(m_uid), 1, fp) == 1); |
| 279 | fclose(fp); |
| 280 | #else |
| 281 | m_uid = std::chrono::duration_cast<std::chrono::nanoseconds>( |
| 282 | std::chrono::system_clock::now().time_since_epoch()) |
| 283 | .count(); |
| 284 | #endif |
| 285 | |
| 286 | auto on_succ = [this](cnrtQueue_t queue) { |
| 287 | auto locator = m_locator; |
| 288 | log_comp_node_created(locator, m_locator_logical); |
| 289 | |
| 290 | MGB_LOCK_GUARD(sd->mtx); |
| 291 | DeviceInfo* dev_info = nullptr; |
| 292 | for (int i = 0; i < sd->nr_dev_used; ++i) { |
| 293 | if (sd->dev_info[i].dev_num == locator.device) { |
| 294 | dev_info = &sd->dev_info[i]; |
| 295 | break; |
| 296 | } |
| 297 | } |
| 298 | |
| 299 | if (!dev_info) { |
| 300 | dev_info = &sd->dev_info[sd->nr_dev_used]; |
| 301 | dev_info->init(m_env); |
| 302 | ++sd->nr_dev_used; |
| 303 | } |
| 304 | m_device_info = dev_info; |
| 305 | m_mem_alloc = dev_info->mem_alloc->add_stream(static_cast<void*>(queue)); |
| 306 | m_dev = m_device_info->dev; |
| 307 | }; |
| 308 | |
| 309 | auto on_error = [this](std::exception&) { |
| 310 | MGB_LOCK_GUARD(sd->mtx); |
| 311 | m_initialized = false; |
| 312 | }; |
| 313 | |
| 314 | m_env.init_cnrt( |
| 315 | locator.device, make_comp_node_from_impl(this), {on_succ, on_error}); |
| 316 | } |
| 317 | |
| 318 | void CambriconCompNodeImpl::fini() { |
| 319 | if (!m_initialized) |
no test coverage detected