c++ প্রোগ্রামে একটি মেশিনে কোরের সংখ্যা খুঁজে




(16)

hwloc (http://www.open-mpi.org/projects/hwloc/) খুঁজছেন মূল্য। যদিও আপনার কোডে অন্য লাইব্রেরী ইন্টিগ্রেশন দরকার তবে এটি আপনার প্রসেসরের সমস্ত তথ্য সরবরাহ করতে পারে (কোরের সংখ্যা, টোপোলজি ইত্যাদি)

একটি প্ল্যাটফর্ম-স্বাধীন উপায়ে C / C ++ থেকে কোন মেশিনে কতগুলি কোর আছে তা নির্ধারণ করার একটি উপায় আছে? যদি এমন কোন জিনিস থাকে না তবে এটি প্রতি-প্ল্যাটফর্ম (উইন্ডোজ / * নিক্স / ম্যাক) নির্ধারণ সম্পর্কে কী?


Answer #1

উইন্ডোজ (x64 এবং win32) এবং সি ++ 11

একটি প্রসেসর কোর ভাগ যৌক্তিক প্রসেসর দলের সংখ্যা। ( GetLogicalProcessorInformationEx ব্যবহার করে, দেখুন GetLogicalProcessorInformation পাশাপাশি)

size_t NumberOfPhysicalCores() noexcept {

    DWORD length = 0;
    const BOOL result_first = GetLogicalProcessorInformationEx(RelationProcessorCore, nullptr, &length);

    Assert(result_first == FALSE);
    Assert(GetLastError() == ERROR_INSUFFICIENT_BUFFER);

    std::unique_ptr< uint8_t[] > buffer(new uint8_t[length]);
    const PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX info = 
            reinterpret_cast< PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX >(buffer.get());

    const BOOL result_second = GetLogicalProcessorInformationEx(RelationProcessorCore, info, &length);

    Assert(result_second == TRUE);

    size_t nb_physical_cores = 0;
    size_t offset = 0;
    do {
        const PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX current_info =
            reinterpret_cast< PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX >(buffer.get() + offset);
        offset += current_info->Size;
        ++nb_physical_cores;
    } while (offset < length);

    return nb_physical_cores;
}

উল্লেখ্য যে NumberOfPhysicalCores বাস্তবায়ন NumberOfPhysicalCores তুচ্ছ থেকে অনেক দূরে (অর্থাত " GetLogicalProcessorInformation বা GetLogicalProcessorInformationEx ব্যবহার করুন")। পরিবর্তে MSDN এ ডকুমেন্টেশনটি পড়লে ( GetLogicalProcessorInformation এবং স্পষ্টভাবে GetLogicalProcessorInformation জন্য উপস্থিত) পড়লে এটি বরং সূক্ষ্ম।

যৌক্তিক প্রসেসর সংখ্যা। ( GetSystemInfo ব্যবহার করে)

size_t NumberOfSystemCores() noexcept {
    SYSTEM_INFO system_info;
    ZeroMemory(&system_info, sizeof(system_info));

    GetSystemInfo(&system_info);

    return static_cast< size_t >(system_info.dwNumberOfProcessors);
}

উল্লেখ্য যে উভয় পদ্ধতি সহজেই সি / সি ++ 98 / C ++ 03 রূপান্তর করা যেতে পারে।


Answer #2

এই কার্যকারিতাটি সি ++ 11 স্ট্যান্ডার্ডের অংশ।

#include <thread>

unsigned int nthreads = std::thread::hardware_concurrency();

পুরোনো কম্পাইলারগুলির জন্য, আপনি Boost.Thread লাইব্রেরি ব্যবহার করতে পারেন।

#include <boost/thread.hpp>

unsigned int nthreads = boost::thread::hardware_concurrency();

উভয় ক্ষেত্রে, hardware_concurrency() CPU থ্রেড এবং হাইপার-থ্রেডিং ইউনিটের সংখ্যাগুলির উপর ভিত্তি করে হার্ডওয়্যারগুলিকে একযোগে কার্যকর করার জন্য থ্রেডগুলির সংখ্যা প্রদান করে।


Answer #3

Win32 জন্য:

GetLogicalProcessorInformationEx আপনাকে লজিকাল প্রসেসরগুলির সংখ্যা পায়, তবে শারীরিক প্রসেসরের সংখ্যা পেতে GetLogicalProcessorInformationEx ব্যবহার করুন।


Answer #4

ওএস এক্স বিকল্প: ডক্স অনুসারে, [[NSProcessInfo processInfo] প্রসেসর কাউন্ট] এর উপর ভিত্তি করে আগে বর্ণিত সমাধান শুধুমাত্র OS X 10.5.0 এ উপলব্ধ। ওএস এক্স এর আগের সংস্করণগুলির জন্য কার্বন ফাংশন এমপি প্রস্রাসার () ব্যবহার করুন।

যদি আপনি কোকো প্রোগ্রামার হন, তবে এটি কার্বন নয়। আপনার Xcode প্রকল্পে কেবল কার্বন ফ্রেমওয়ার্ক যুক্ত করতে হবে এবং MPProcessors () উপলব্ধ হবে।


Answer #5

যতদূর আমি জানি, লিনাক্সে সেরা প্রোগ্রাম্যাটিক উপায় ব্যবহার করা হয়

sysconf(_SC_NPROCESSORS_CONF)

অথবা

sysconf(_SC_NPROCESSORS_ONLN)

এটি স্ট্যান্ডার্ড নয়, তবে লিনাক্সের জন্য আমার ম্যান পৃষ্ঠাতে রয়েছে।


Answer #6

আপনি সম্ভবত একটি প্ল্যাটফর্ম স্বাধীন ভাবে এটি পেতে সক্ষম হবে না। উইন্ডোজ আপনি প্রসেসর সংখ্যা পেতে।

Win32 সিস্টেম তথ্য


Answer #7

লিনাক্সে, এটি _SC_NPROCESSORS_ONLN ব্যবহার করা নিরাপদ নাও হতে পারে কারণ এটি POSIX স্ট্যান্ডার্ড এবং sysconf ম্যানুয়াল স্টেটগুলির অংশ নয়। সুতরাং একটি সম্ভাবনা আছে যে _SC_NPROCESSORS_ONLN উপস্থিত হতে পারে না:

 These values also exist, but may not be standard.

     [...]     

     - _SC_NPROCESSORS_CONF
              The number of processors configured.   
     - _SC_NPROCESSORS_ONLN
              The number of processors currently online (available).

একটি সহজ পদ্ধতি /proc/stat বা /proc/cpuinfo পড়তে এবং তাদের গণনা করা হবে:

#include<unistd.h>
#include<stdio.h>

int main(void)
{
char str[256];
int procCount = -1; // to offset for the first entry
FILE *fp;

if( (fp = fopen("/proc/stat", "r")) )
{
  while(fgets(str, sizeof str, fp))
  if( !memcmp(str, "cpu", 3) ) procCount++;
}

if ( procCount == -1) 
{ 
printf("Unable to get proc count. Defaulting to 2");
procCount=2;
}

printf("Proc Count:%d\n", procCount);
return 0;
}

/proc/cpuinfo ব্যবহার করে:

#include<unistd.h>
#include<stdio.h>

int main(void)
{
char str[256];
int procCount = 0;
FILE *fp;

if( (fp = fopen("/proc/cpuinfo", "r")) )
{
  while(fgets(str, sizeof str, fp))
  if( !memcmp(str, "processor", 9) ) procCount++;
}

if ( !procCount ) 
{ 
printf("Unable to get proc count. Defaulting to 2");
procCount=2;
}

printf("Proc Count:%d\n", procCount);
return 0;
}

Grep ব্যবহার করে শেল মধ্যে একই পদ্ধতির:

grep -c ^processor /proc/cpuinfo

অথবা

grep -c ^cpu /proc/stat # subtract 1 from the result

Answer #8

আরও একটি উইন্ডোজ রেসিপি: সিস্টেম-ওয়াইড পরিবেশ পরিবর্তনশীল NUMBER_OF_PROCESSORS :

printf("%d\n", atoi(getenv("NUMBER_OF_PROCESSORS")));

Answer #9

যদি আপনার কাছে সমাবেশ-ভাষা অ্যাক্সেস থাকে তবে আপনি সিপিইউআইডি নির্দেশটি সিপিইউ সম্পর্কে সব ধরণের তথ্য পেতে পারেন। এটি অপারেটিং সিস্টেমের মধ্যে পোর্টেবল, যদিও আপনাকে কোরের সংখ্যাটি কীভাবে খুঁজে বের করতে হয় তা নির্ধারণ করতে নির্মাতার-নির্দিষ্ট তথ্য ব্যবহার করতে হবে। এখানে একটি ডকুমেন্ট রয়েছে যা ইন্টেল চিপস এ কীভাবে এটি করে তা বর্ণনা করে এবং এর মধ্যে পৃষ্ঠা 11 এএমডি স্পেসিফিকেশনটি বর্ণনা করে।


Answer #10

সি ++ 11

//may return 0 when not able to detect
unsigned concurentThreadsSupported = std::thread::hardware_concurrency();

রেফারেন্স: std::thread::hardware_concurrency

C ++ এর আগে C ++ 11 তে কোন পোর্টেবল উপায় নেই। পরিবর্তে, আপনাকে নিম্নলিখিত পদ্ধতিগুলির একটি বা আরও বেশি ব্যবহার করতে হবে (যথাযথ #ifdef লাইন দ্বারা সুরক্ষিত):

  • win32

    SYSTEM_INFO sysinfo;
    GetSystemInfo(&sysinfo);
    int numCPU = sysinfo.dwNumberOfProcessors;
  • লিনাক্স, সোলারিস, অক্স এবং ম্যাক ওএস এক্স> = 10.4 (অর্থাৎ বাঘ)

    int numCPU = sysconf(_SC_NPROCESSORS_ONLN);
  • ফ্রিবিএসডি, ম্যাকোএস এক্স, নেটবিএসডি, ওপেনবিএসডি ইত্যাদি।

    int mib[4];
    int numCPU;
    std::size_t len = sizeof(numCPU); 
    
    /* set the mib for hw.ncpu */
    mib[0] = CTL_HW;
    mib[1] = HW_AVAILCPU;  // alternatively, try HW_NCPU;
    
    /* get the number of CPUs from the system */
    sysctl(mib, 2, &numCPU, &len, NULL, 0);
    
    if (numCPU < 1) 
    {
        mib[1] = HW_NCPU;
        sysctl(mib, 2, &numCPU, &len, NULL, 0);
        if (numCPU < 1)
            numCPU = 1;
    }
  • HPUX

    int numCPU = mpctl(MPC_GETNUMSPUS, NULL, NULL);
  • IRIX ব্যবহৃত

    int numCPU = sysconf(_SC_NPROC_ONLN);
  • উদ্দেশ্য-সি (ম্যাক ওএস এক্স> = 10.5 বা iOS)

    NSUInteger a = [[NSProcessInfo processInfo] processorCount];
    NSUInteger b = [[NSProcessInfo processInfo] activeProcessorCount];

Answer #11

লিনাক্সে, আপনি / proc / cpuinfo ফাইলটি পড়তে এবং কোরে গণনা করতে পারেন।


Answer #12

(প্রায়) প্ল্যাটফর্ম সি-কোডে স্বাধীন ফাংশন

#ifdef _WIN32
#include <windows.h>
#elif MACOS
#include <sys/param.h>
#include <sys/sysctl.h>
#else
#include <unistd.h>
#endif

int getNumCores() {
#ifdef WIN32
    SYSTEM_INFO sysinfo;
    GetSystemInfo(&sysinfo);
    return sysinfo.dwNumberOfProcessors;
#elif MACOS
    int nm[2];
    size_t len = 4;
    uint32_t count;

    nm[0] = CTL_HW; nm[1] = HW_AVAILCPU;
    sysctl(nm, 2, &count, &len, NULL, 0);

    if(count < 1) {
        nm[1] = HW_NCPU;
        sysctl(nm, 2, &count, &len, NULL, 0);
        if(count < 1) { count = 1; }
    }
    return count;
#else
    return sysconf(_SC_NPROCESSORS_ONLN);
#endif
}

Answer #13

OpenMP অনেক প্ল্যাটফর্মগুলিতে সমর্থিত (ভিজ্যুয়াল স্টুডিও 2005 সহ) এবং এটি একটি

int omp_get_num_procs();

ফাংশন যে কল সময় উপলব্ধ প্রসেসর / কোর সংখ্যা প্রদান করে।


Answer #14

লিনাক্সে, আপনি dmesg চেক আউট এবং লাইনগুলি ফিল্টার করতে পারেন যেখানে ACPI CPU গুলি শুরু করে, যেমন:

dmesg | grep 'ACPI: Processor dmesg | grep 'ACPI: Processor '

অন্যান্য সম্ভাবনা প্রসেসর তথ্য ফিল্টার করার জন্য dmidecode ব্যবহার করা হয়।


Answer #15

আপনি .net এও WMI ব্যবহার করতে পারেন তবে আপনি WMI পরিষেবা চলমান ইত্যাদি উপর নির্ভরশীল। কখনও কখনও এটি স্থানীয়ভাবে কাজ করে, তবে তারপরেও একই কোডটি সার্ভারগুলিতে চালানো হলে ব্যর্থ হয়। আমি বিশ্বাস করি এটি একটি নামস্থান সমস্যা, "নামগুলি" সম্পর্কিত যার মানগুলি আপনি পড়ছেন।





c