diff --git a/src/inference/dev_api/openvino/runtime/system_conf.hpp b/src/inference/dev_api/openvino/runtime/system_conf.hpp index c2e0cc37fd9..c4525265c23 100644 --- a/src/inference/dev_api/openvino/runtime/system_conf.hpp +++ b/src/inference/dev_api/openvino/runtime/system_conf.hpp @@ -260,6 +260,24 @@ OPENVINO_RUNTIME_API void set_cpu_used(const std::vector& cpu_ids, const in */ OPENVINO_RUNTIME_API int get_socket_by_numa_node(int numa_node_id); +/** + * @brief Get original socket id by current socket id, the input socket id is recalculated after filtering (like + * numactl), while the original socket id is the original id before filtering + * @ingroup ie_dev_api_system_conf + * @param[in] socket_id socket id + * @return socket id + */ +OPENVINO_RUNTIME_API int get_org_socket_id(int socket_id); + +/** + * @brief Get original numa node id by current numa node id, the input numa node id is recalculated after filtering + * (like numactl), while the original numa node id is the original id before filtering + * @ingroup ie_dev_api_system_conf + * @param[in] numa_node_id numa node id + * @return numa node id + */ +OPENVINO_RUNTIME_API int get_org_numa_id(int numa_node_id); + /** * @enum ColumnOfCPUMappingTable * @brief This enum contains definition of each columns in CPU mapping table which use processor id as index. diff --git a/src/inference/src/dev/threading/cpu_streams_executor.cpp b/src/inference/src/dev/threading/cpu_streams_executor.cpp index 0a4719854ab..eb706a37192 100644 --- a/src/inference/src/dev/threading/cpu_streams_executor.cpp +++ b/src/inference/src/dev/threading/cpu_streams_executor.cpp @@ -144,7 +144,7 @@ struct CPUStreamsExecutor::Impl { .set_max_threads_per_core(max_threads_per_core)}); } else if (stream_type == STREAM_WITH_NUMA_ID) { _taskArena.reset(new custom::task_arena{custom::task_arena::constraints{} - .set_numa_id(_numaNodeId) + .set_numa_id(get_org_numa_id(_numaNodeId)) .set_max_concurrency(concurrency) .set_max_threads_per_core(max_threads_per_core)}); } else if (stream_type == STREAM_WITH_CORE_TYPE) { diff --git a/src/inference/src/dev/threading/istreams_executor.cpp b/src/inference/src/dev/threading/istreams_executor.cpp index e77a9256c6f..891de30aba6 100644 --- a/src/inference/src/dev/threading/istreams_executor.cpp +++ b/src/inference/src/dev/threading/istreams_executor.cpp @@ -563,6 +563,10 @@ void IStreamsExecutor::Config::update_executor_config(int stream_nums, return; } + if (proc_type_table.size() > 1) { + core_type = ov::threading::IStreamsExecutor::Config::ANY; + } + // IStreamsExecutor::Config config = initial; const auto total_num_cores = proc_type_table[0][ALL_PROC]; const auto total_num_big_cores = proc_type_table[0][MAIN_CORE_PROC] + proc_type_table[0][HYPER_THREADING_PROC]; diff --git a/src/inference/src/os/cpu_map_info.hpp b/src/inference/src/os/cpu_map_info.hpp index 88606a846c3..b1360bc571f 100644 --- a/src/inference/src/os/cpu_map_info.hpp +++ b/src/inference/src/os/cpu_map_info.hpp @@ -27,6 +27,8 @@ public: std::vector> _org_proc_type_table; std::vector> _proc_type_table; std::vector> _cpu_mapping_table; + std::map _socketid_mapping_table; + std::map _numaid_mapping_table; std::mutex _cpu_mutex; int _socket_idx = 0; }; diff --git a/src/inference/src/os/lin/lin_system_conf.cpp b/src/inference/src/os/lin/lin_system_conf.cpp index 2cfb12a7826..81ec9cb4af3 100644 --- a/src/inference/src/os/lin/lin_system_conf.cpp +++ b/src/inference/src/os/lin/lin_system_conf.cpp @@ -169,10 +169,16 @@ CPU::CPU() { } } for (size_t i = 0; i < valid_cpu_mapping_table.size(); i++) { - valid_cpu_mapping_table[i][CPU_MAP_NUMA_NODE_ID] = - numa_node_map.at(valid_cpu_mapping_table[i][CPU_MAP_NUMA_NODE_ID]); - valid_cpu_mapping_table[i][CPU_MAP_SOCKET_ID] = - sockets_map.at(valid_cpu_mapping_table[i][CPU_MAP_SOCKET_ID]); + auto new_numa_id = numa_node_map.at(valid_cpu_mapping_table[i][CPU_MAP_NUMA_NODE_ID]); + auto new_socket_id = sockets_map.at(valid_cpu_mapping_table[i][CPU_MAP_SOCKET_ID]); + if (_numaid_mapping_table.find(new_numa_id) == _numaid_mapping_table.end()) { + _numaid_mapping_table.insert({new_numa_id, valid_cpu_mapping_table[i][CPU_MAP_NUMA_NODE_ID]}); + } + if (_socketid_mapping_table.find(new_socket_id) == _socketid_mapping_table.end()) { + _socketid_mapping_table.insert({new_socket_id, valid_cpu_mapping_table[i][CPU_MAP_SOCKET_ID]}); + } + valid_cpu_mapping_table[i][CPU_MAP_NUMA_NODE_ID] = new_numa_id; + valid_cpu_mapping_table[i][CPU_MAP_SOCKET_ID] = new_socket_id; } } @@ -265,12 +271,13 @@ CPU::CPU() { _cores); } } - _org_proc_type_table = _proc_type_table; std::vector>().swap(system_info_table); if (check_valid_cpu() < 0) { OPENVINO_THROW("CPU affinity check failed. No CPU is eligible to run inference."); }; + + _org_proc_type_table = _proc_type_table; } void parse_node_info_linux(const std::vector node_info_table, diff --git a/src/inference/src/system_conf.cpp b/src/inference/src/system_conf.cpp index b4fded633ff..7b048accbaf 100644 --- a/src/inference/src/system_conf.cpp +++ b/src/inference/src/system_conf.cpp @@ -215,6 +215,14 @@ int get_socket_by_numa_node(int numa_node_id) { return -1; }; +int get_org_socket_id(int socket_id) { + return -1; +} + +int get_org_numa_id(int numa_node_id) { + return -1; +} + #elif defined(__APPLE__) // for Linux and Windows the getNumberOfCPUCores (that accounts only for physical cores) implementation is OS-specific // (see cpp files in corresponding folders), for __APPLE__ it is default : @@ -267,6 +275,24 @@ int get_socket_by_numa_node(int numa_node_id) { return -1; }; +int get_org_socket_id(int socket_id) { + CPU& cpu = cpu_info(); + auto iter = cpu._socketid_mapping_table.find(socket_id); + if (iter != cpu._socketid_mapping_table.end()) { + return iter->second; + } + return -1; +} + +int get_org_numa_id(int numa_node_id) { + CPU& cpu = cpu_info(); + auto iter = cpu._numaid_mapping_table.find(numa_node_id); + if (iter != cpu._numaid_mapping_table.end()) { + return iter->second; + } + return -1; +} + #else # ifndef _WIN32 @@ -417,6 +443,25 @@ int get_number_of_logical_cpu_cores(bool bigCoresOnly) { # endif return logical_cores; } + +int get_org_socket_id(int socket_id) { + CPU& cpu = cpu_info(); + auto iter = cpu._socketid_mapping_table.find(socket_id); + if (iter != cpu._socketid_mapping_table.end()) { + return iter->second; + } + return -1; +} + +int get_org_numa_id(int numa_node_id) { + CPU& cpu = cpu_info(); + auto iter = cpu._numaid_mapping_table.find(numa_node_id); + if (iter != cpu._numaid_mapping_table.end()) { + return iter->second; + } + return -1; +} + #endif #if ((OV_THREAD == OV_THREAD_TBB) || (OV_THREAD == OV_THREAD_TBB_AUTO))