| 257 | Spinlock ROCmCompNodeImpl::sd_mtx; |
| 258 | |
| 259 | void ROCmCompNodeImpl::init(const Locator& locator, const Locator& locator_logical) { |
| 260 | m_locator = locator; |
| 261 | m_locator_logical = locator_logical; |
| 262 | m_initialized = true; |
| 263 | |
| 264 | #if defined(__linux__) || defined(TARGET_OS_MAC) |
| 265 | FILE* fp; |
| 266 | fp = fopen("/dev/urandom", "r"); |
| 267 | mgb_assert(fread(&m_uid, sizeof(m_uid), 1, fp) == 1); |
| 268 | fclose(fp); |
| 269 | #else |
| 270 | m_uid = std::chrono::duration_cast<std::chrono::nanoseconds>( |
| 271 | std::chrono::system_clock::now().time_since_epoch()) |
| 272 | .count(); |
| 273 | #endif |
| 274 | |
| 275 | auto on_succ = [this](hipStream_t stream) { |
| 276 | auto locator = m_locator; |
| 277 | log_comp_node_created(locator, m_locator_logical); |
| 278 | |
| 279 | MGB_LOCK_GUARD(sd->mtx); |
| 280 | DeviceInfo* dev_info = nullptr; |
| 281 | for (int i = 0; i < sd->nr_dev_used; ++i) { |
| 282 | if (sd->dev_info[i].dev_num == locator.device) { |
| 283 | dev_info = &sd->dev_info[i]; |
| 284 | break; |
| 285 | } |
| 286 | } |
| 287 | |
| 288 | if (!dev_info) { |
| 289 | dev_info = &sd->dev_info[sd->nr_dev_used]; |
| 290 | dev_info->init(m_env); |
| 291 | // note: add nr_dev_used only after init succeeds |
| 292 | ++sd->nr_dev_used; |
| 293 | } |
| 294 | m_device_info = dev_info; |
| 295 | m_mem_alloc = dev_info->mem_alloc->add_stream(stream); |
| 296 | }; |
| 297 | |
| 298 | auto on_error = [this](std::exception&) { |
| 299 | MGB_LOCK_GUARD(sd->mtx); |
| 300 | m_initialized = false; |
| 301 | }; |
| 302 | |
| 303 | m_env.init_rocm_async( |
| 304 | locator.device, make_comp_node_from_impl(this), {on_succ, on_error}); |
| 305 | } |
| 306 | |
| 307 | void ROCmCompNodeImpl::fini() { |
| 308 | if (!m_initialized) |
no test coverage detected