Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 37 additions & 1 deletion common/common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,38 @@ using json = nlohmann::ordered_json;
//
// CPU utils
//
#ifdef _WIN32
int32_t cpu_get_num_cores_win(bool print_physical_core_num) {
DWORD buffer_size = 0;
GetLogicalProcessorInformationEx(RelationProcessorCore, nullptr, &buffer_size);
std::vector<char> buffer(buffer_size);
if (!GetLogicalProcessorInformationEx(RelationProcessorCore, reinterpret_cast<PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX>(buffer.data()), &buffer_size)) {
return 0;
}

int num_cores_win = 0;
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX info = reinterpret_cast<PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX>(buffer.data());
while (buffer_size > 0) {
if (info->Relationship == RelationProcessorCore) {
if (print_physical_core_num) {
num_cores_win += info->Processor.GroupCount;
} else {
for (WORD i = 0; i < info->Processor.GroupCount; ++i) {
#ifdef _MSC_VER
num_cores_win += __popcnt64(info->Processor.GroupMask[i].Mask);
#else
num_cores_win += _popcnt64(info->Processor.GroupMask[i].Mask);
#endif
}
}
}
buffer_size -= info->Size;
info = reinterpret_cast<PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX>(reinterpret_cast<char*>(info) + info->Size);
}

return num_cores_win;
}
#endif

int32_t cpu_get_num_physical_cores() {
#ifdef __linux__
Expand Down Expand Up @@ -111,7 +143,7 @@ int32_t cpu_get_num_physical_cores() {
return num_physical_cores;
}
#elif defined(_WIN32)
//TODO: Implement
return cpu_get_num_cores_win(true);
#endif
unsigned int n_threads = std::thread::hardware_concurrency();
return n_threads > 0 ? (n_threads <= 4 ? n_threads : n_threads / 2) : 4;
Expand Down Expand Up @@ -1716,7 +1748,11 @@ std::string gpt_params_get_system_info(const gpt_params & params) {
if (params.n_threads_batch != -1) {
os << " (n_threads_batch = " << params.n_threads_batch << ")";
}
#ifdef _WIN32
os << " / " << cpu_get_num_cores_win(false) << " | " << llama_print_system_info();
#else
os << " / " << std::thread::hardware_concurrency() << " | " << llama_print_system_info();
#endif

return os.str();
}
Expand Down
4 changes: 3 additions & 1 deletion common/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,9 @@ struct llama_control_vector_load_info;
//
// CPU utils
//

#ifdef _WIN32
int32_t cpu_get_num_cores_win(bool print_physical_core_num);
#endif
int32_t cpu_get_num_physical_cores();
int32_t cpu_get_num_math();

Expand Down