প্রোগ্রামিয়ালি কোনও মেশিনে কোরের সংখ্যা সন্ধান করুন


464

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


4
আপনি যদি এটি ব্যবহার করতে চান তবে কয়টি থ্রেড শুরু করতে হবে তা দয়া করে প্রাথমিক পরিমাপ হিসাবে NUMBER_OF_PROCESSORS ব্যবহার করুন use আমি কেন এটিকে আরও ভাল (যদি লোকেরা এটি আরও বেশি ব্যবহার করে) তবে হার্ডওয়্যার কোর ব্যবহার করে এটি আপনার কাছে একটি সংক্ষিপ্তসার হিসাবে রেখেছি। আপনার প্রোগ্রামটি কতটা কোর সম্পর্কিত এটি একটি পরিবেশগত সমস্যা!
লোথার

নোট করুন যে std::thread::hardware_concurrencyশারীরিক সিপিইউ কোরগুলির সংখ্যা ফেরত দেয় তবে nprocলিনাক্সে কেবলমাত্র বর্তমান প্রসেসটি চলতে পারে এমন সিপিইউ কোরের সংখ্যা দেখায়, যা দিয়ে নিয়ন্ত্রণ করা যায় sched_setaffinity। : আমি পেতে পরিবর্তে মান সি ++ থেকে :, দেখতে যেমন পাইথন মধ্যে একটি উপায় খুঁজে পেলাম না stackoverflow.com/questions/1006289/...
সিরো Santilli郝海东冠状病六四事件法轮功

উত্তর:


706

সি ++ 11

#include <thread>

//may return 0 when not able to detect
const auto processor_count = std::thread::hardware_concurrency();

রেফারেন্স: স্টাড :: থ্রেড :: হার্ডওয়্যার_কনকেন্সি


সি ++ এ সি ++ 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 বা আইওএস)

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

5
@ এমকানড্রে: পাঠকের পক্ষে এটি অনুশীলন হিসাবে ছেড়ে গেছে। যদি আমি বাস্তবায়ন করতাম তবে আমি সম্ভবত টেমপ্লেট-নীতি পদ্ধতির ব্যবহার করতাম যেখানে প্রিপ্রসেসর নির্দেশিকায় নীতিটি সংজ্ঞায়িত করা হত। বা ... আপনি বুস্ট থ্রেড ব্যবহার করতে পারেন :: হার্ডওয়্যার_কেনসি ()।
paxos1977

3
স্পষ্টকরণের পয়েন্ট হিসাবে উইন 32 সমাধান মোট দেহ সংখ্যা (যা জিজ্ঞাসা করা হয়েছিল) মোট শারীরিক সিপিইউর সংখ্যা নয় returns
এরিক 17

1
লিনাক্স / সোলারিস / এআইএক্স উপায়টিও ফ্রিবিএসডি-তে কাজ করে এবং কমপক্ষে ২০০ 2006 সাল থেকে এটি কাজ করে Also "_SC_NPROCESSORS_CONF" সহ সিসকনফ কল করে মোট কনফিগার করা সিপিইউ ফিরে আসবে।
ক্রিস এস

3
সচেতন হতে কয়েকটি জিনিস। HW_NCPUউপর OS X এর উইন্ডোজ অবচিত GetSystemInfoযদি আপনার সিস্টেমে 32 লজিক্যাল প্রসেসর বা তার কম, ব্যবহার হয়েছে শুধুমাত্র দরকারী GetLogicalProcessorInformationসিস্টেম আছে যে বেশী 32 লজিক্যাল প্রসেসর জন্য।

1
@ ট্রেজকাজ ডকুমেন্টনে স্পষ্টতই "যৌক্তিক" বলা হয়েছে - যা সর্বদা এইচটি কোরের শব্দ হিসাবে গণনা করা হয় "শারীরিক" শব্দটি সর্বদা BIOS / UEFI দ্বারা রিপোর্ট করা অনুকরণ / ভার্চুয়ালাইজড হতে পারে। আপনি উদাহরণস্বরূপ, গেটলজিকালপ্রসেসর ইনফরমেশন এর মতো ফাংশনগুলির সাথে এইচটি / নন-এইচটি কোরের মধ্যে পার্থক্য করতে পারেন । ! নোট: এইচ টি = এমুলেশন বা ভার্চুয়ালাইজেশন, একটি thats বড় পার্থক্য, এইচটি একটি হার্ডওয়্যার অপ্টিমাইজেশান, তাই কথা বলা হয়
specializt

202

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

#include <thread>

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

পুরানো সংকলকগুলির জন্য, আপনি বুস্ট.ট্রেড লাইব্রেরি ব্যবহার করতে পারেন ।

#include <boost/thread.hpp>

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

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


1
সেকেন্ড ... একটি একক ক্রিয়াকলাপটি প্রকাশ করার জন্য উপরের নমুনা কোড এবং কিছু প্রিপ্রসেসর ম্যাক্রো ব্যবহার করা হচ্ছে, তবে আমার জন্য কঠোর পরিশ্রম করা হয়েছিল।
jkp

উইন 32 এর জন্য, এটি গেটসিস্টেমআইএনফো-তে একটি কল। (বুড়ো সংস্করণ 1.41.0 হিসাবে) কত শ্রমিকের থ্রেড কার্যকর হবে তা নির্ধারণ করতে কি সমস্ত তথ্য ক্যাপচার করে? কোরের সংখ্যা এবং হাইপার-থ্রেডিং উভয় বিবেচনা করা দরকার? স্বাক্ষরবিহীন থ্রেড :: হার্ডওয়্যার_কেনসি () Y SYSTEM_INFO তথ্য = {0}; GetSystemInfo (& তথ্য); ফিরতি তথ্য.ডাব্লু নাম্বারঅফপ্রসেসরগুলি; }
জীভ ড্যাডসন

এমএসডিএন অনুসারে, গেটসিস্টেমআইএনফো () dwNumberOfProcessors এ "ফিজিক্যাল প্রসেসর" এর সংখ্যা প্রদান করে তবে এটি এর অর্থ কী তা নির্ধারণ করে না। বুস্ট ডকুমেন্টেশন দাবি করে বলে মনে হচ্ছে এতে হাইপারথ্রেডিং ইউনিট রয়েছে।
ফেরুক্সিও

দেখতে stackoverflow.com/questions/642348/... হাইপার জন্য
naugtur

57

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

int omp_get_num_procs();

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


কারণ এটি একটি ভুল উত্তর। থেকে gcc.gnu.org/bugzilla/show_bug.cgi?id=37586 ( "omp_get_num_procs) শুধুমাত্র সিস্টেম সিপিইউ সংখ্যার চেয়ে কম সংখ্যা ফিরে আসবে অনলাইন, যদি GOMP_CPU_AFFINITY env Var ব্যবহার করা হয়, অথবা যদি কলিং প্রক্রিয়া এবং / অথবা থ্রেড হয়েছে সিপিইউ অ্যাফিনিটি সিপিইউগুলির একটি উপসেটে সীমাবদ্ধ। সুতরাং যদি আপনি আগে যেমন কল করেন তবে sched_setaffinityএটি কার্যকর হবে না।
অ্যাঞ্জিনিয়ার

7
এই ফাংশনটি কলিং প্রসেসে উপলব্ধ সিপিইউগুলির সংখ্যা প্রদান করে। এটি যাইহোক সবচেয়ে সাধারণ ব্যবহারের কেস নয়? কিছু অকেজো প্রতিবেদনের উদ্দেশ্যে, সিপিইউ হার্ডওয়্যার কোরগুলির প্রকৃত সংখ্যা আপনার প্রাসঙ্গিক নয় যদি আপনি নিজের কোডটিতে সেগুলি নিতে না পারেন।
ম্যাকবার্ডি

@ ইভানটেরান এই প্রশ্নের উদ্দেশ্য ছিল তা ছাড়াও এটি অবশ্যই কার্যকর হতে পারে। উদাহরণস্বরূপ, থ্রেড অ্যাফিনিটি সেট করার উদ্দেশ্যে। বলুন, আমি আমার মেশিনে চারটি প্রথম কোরের পরিবর্তে চারটি শেষ সিপিইউ কোরে আবদ্ধ 4 টি থ্রেড চালাতে চাই। এবং তদ্ব্যতীত, ওপেনএমপি ব্যতীত কোডকে সমান্তরাল করার অন্যান্য উপায় রয়েছে। আমি নিজেই প্রসারিত স্প্যান করতে চাই। এগুলি অবশ্যই উপলভ্য এবং ওপেনএমপি এনভায়রনমেন্ট ভেরিয়েবল দ্বারা সীমাবদ্ধ নয়।
অ্যাঙ্গেইনার

2
এটি যৌক্তিক সিপিইউগুলির সংখ্যা প্রদান করে, কোরের (শারীরিক সিপিইউ) নয়।
মাইকেল Konečný

37

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


4
এটি ডাউনভোট করা হয়েছে কারণ প্রশ্নটি সি ++ হিসাবে ট্যাগ করা হয়েছে এবং এই উত্তরটি নন- x86 আর্কিটেকচারে (এআরএম, পিপিসি, ইত্যাদি) সি ++ চালিত সিস্টেমে প্রযোজ্য নয়। আমি বলছি না যে উত্তরটি হ্রাস করা ভাল কারণ, কেবল একটি সম্ভাবনা।
ফেরুঁচিও

3
আপনি যদি ইন্টেল প্রসেসরের হাইপারথ্রেডিং সনাক্ত করতে সিপিইউইডি ব্যবহার করেন তবে এই পদ্ধতির একটি ক্ষতি হ'ল। আমি আমার ল্যাপটপে এই সমস্যার মধ্যে পড়েছিলাম: আমি মেশিনে যে সিপিইউ রেখেছি হাইপারথ্রেডিং সমর্থন করে (এবং অবশ্যই এটি রিপোর্ট করে যে এটি সিপিইউডির মাধ্যমে করে), বায়োস তা দেয় না। অতএব, আপনার সিপিইউডি পড়ার মাধ্যমে এইচটি ক্ষমতাটি ব্যবহার করার চেষ্টা করা উচিত নয়। যেহেতু আপনি এইচটি সমর্থন সম্পর্কে বিআইওএসকে জিজ্ঞাসা করতে পারবেন না (আমি দেখেছি এমন কোনও উপায় নয়), লজিক্যাল প্রসেসরের গণনা পেতে ওএসকে জিজ্ঞাসা করা উচিত।
চক আর

32

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

#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
}

মনে HW_NCPUহচ্ছে ওএস এক্স উত্স

16

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


তা ছাড়া হাইপারথ্রেডেড বা অন্যান্য এসএমটি সমাধানকে আরও বেশি কোর হিসাবে গণ্য করা হয় ...
jakobengblom2

13
@ আরাফ্যাঙ্গিয়ন: হাইপারথ্রেডিং সত্যিকারের সমান্তরাল সম্পাদন নয়, এটি ওভারহেড প্রসঙ্গে স্যুইচিং হ্রাস করার জন্য একটি প্রযুক্তি। একটি হাইপারথ্রেডেড সিপিইউ একবারে কেবল একটি থ্রেড চালাতে পারে তবে এটি একই সাথে দুটি থ্রেডের আর্কিটেকচারাল স্টেট (রেজিস্টার মান ইত্যাদি) সংরক্ষণ করতে পারে। পারফরম্যান্সের বৈশিষ্ট্য দুটি কোর থাকার থেকে খুব আলাদা।
উইম কয়েনেন

7
@ উইম: এটি সম্পূর্ণ সঠিক নয়। হাইপারথ্রেডিং সহ সিপিইউগুলিতে সাধারণত একাধিক ALU থাকে এবং চক্র প্রতি একাধিক নির্দেশনা প্রেরণ করতে পারে। যদি ডেটা নির্ভরতা এবং স্টলের কারণে, সমস্ত ALU গুলি একটি থ্রেড দ্বারা ব্যস্ত রাখা যায় না, তবে AL সমস্ত ALUs পরিবর্তে দ্বিতীয় হার্ডওয়্যার থ্রেডের যুগপত মৃত্যুর জন্য ব্যবহার করা হবে।
বেন ভয়েগট

11

মনে রাখবেন যে "কোর সংখ্যা" কোনও বিশেষ উপকারী নম্বর নাও হতে পারে, আপনাকে এটি আরও কিছুটা যোগ্যতা অর্জন করতে হতে পারে। আপনি কীভাবে ইন্টেল এইচটি, আইবিএম পাওয়ার 5 এবং পাওয়ার 6 এবং সুনের নায়াগ্রা / আল্ট্রাস্পার্ক টি 1 এবং টি 2 এর মতো মাল্টি-থ্রেডেড সিপিইউগুলি গণনা করতে চান? বা আরও মজার বিষয়, তার দুটি স্তরের হার্ডওয়্যার থ্রেডিং (সুপারভাইজার এবং ব্যবহারকারী-স্তর) সহ এমআইপিএস 1004 কে ... হাইপারভাইসর-সমর্থিত সিস্টেমে চলে গেলে কী ঘটে তা উল্লেখ করার প্রয়োজন নেই যেখানে হার্ডওয়্যারটিতে দশমুটি সিপিইউ থাকতে পারে তবে আপনার নির্দিষ্ট ওএস শুধুমাত্র কয়েক দেখেন।

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


7

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

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

7

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

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


1
কেয়ারফুল: হাইপারথ্রেডেড প্রসেসররা বলেন দুটি আছে। সুতরাং আপনার এটিও দেখতে হবে যে প্রসেসর হাইপারথ্রেড সক্ষম কিনা।
মার্টিন ইয়র্ক

6

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

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

size_t NumberOfPhysicalCores() noexcept {

    DWORD length = 0;
    const BOOL result_first = GetLogicalProcessorInformationEx(RelationProcessorCore, nullptr, &length);
    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 != FALSE);

    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তুচ্ছ (যেমন "ব্যবহার GetLogicalProcessorInformationবা GetLogicalProcessorInformationEx") থেকে অনেক দূরে IMHO । পরিবর্তে এটি এমএসডিএন-তে ডকুমেন্টেশন (স্পষ্টভাবে উপস্থাপিত GetLogicalProcessorInformationএবং এর জন্য সুস্পষ্টভাবে উপস্থাপিত) পড়লে এটি সূক্ষ্ম GetLogicalProcessorInformationEx

লজিকাল প্রসেসরের সংখ্যা। ( গেটসিস্টেমইনফো ব্যবহার করে )

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 / সি ++ 03 তে রূপান্তরিত হতে পারে।


1
ধন্যবাদ! আমি GetLogicalProcessorInformationব্যবহৃত বিভিন্ন বাফার মাপের সাথে কাজ না করার কারণে আমি এটি খুঁজছিলাম । তৃপ্তির চেয়েও বেশি! ^^
কীউইউইউএসআর

@ কেবিউইউসর ধন্যবাদ উইন্ডোজ প্রোগ্রামিং তুচ্ছ ও যৌক্তিক থেকে কিছুটা দূরে। মাঝামাঝি সময়ে, আমি কিছুটা আরও আপডেট হওয়া সি ++ 17 সংস্করণ ব্যবহার করি যা কিছু size_tবর্ণের ক্ষেত্রে স্থিতিশীল বিশ্লেষক পিভিএস-স্টুডিও অনুসারে আরও সঠিক । (যদিও, এমএসভিসি ++ ডাব্লু 4 তে অভিযোগ করে না))
ম্যাথিয়াস

5

ওএস এক্সে আরও: sysconf(_SC_NPROCESSORS_ONLN)কেবলমাত্র সংস্করণগুলি পাওয়া যায়> = 10.5, 10.4 নয়।

বিকল্পটি হল HW_AVAILCPU/sysctl()BSD কোড যা সংস্করণে পাওয়া যায়> = 10.2।



4

সি ++ এর সাথে সম্পর্কিত নয়, তবে লিনাক্সে আমি সাধারণত করি:

grep processor /proc/cpuinfo | wc -l

বাশ / পার্ল / পাইথন / রুবির মতো ভাষার স্ক্রিপ্টিংয়ের জন্য সহজ।


4
import multiprocessing print multiprocessing.cpu_count()
অজগরটির

3
এটি অনেক দিন হয়েছে, তবে এন্ট্রি গণনা করার পতাকা grepরয়েছে -c!
ল্যাপশিন দিমিত্রি

3

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


3

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

sysconf(_SC_NPROCESSORS_CONF)

অথবা

sysconf(_SC_NPROCESSORS_ONLN)

এগুলি মানসম্পন্ন নয়, তবে লিনাক্সের জন্য আমার ম্যান পেজে রয়েছে।


3

লিনাক্সে এটি ব্যবহার করা নিরাপদ নাও হতে পারে _SC_NPROCESSORS_ONLNকারণ এটি পসিক্স স্ট্যান্ডার্ডের অংশ নয় এবং সিসকনফ ম্যানুয়াল যতটা বলেছে। সুতরাং একটি সম্ভাবনা রয়েছে যা _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 -c ^processor /proc/cpuinfo

অথবা

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

2

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

আপনি যদি কোকো প্রোগ্রামার হন তবে এটিকে কার্বন বলে এড়িয়ে যাবেন না। আপনার কেবলমাত্র আপনার এক্সকোড প্রকল্পে কার্বন কাঠামো যুক্ত করা দরকার এবং এমপিপ্রসেসরগুলি () উপলব্ধ থাকবে।



-2

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


-3

লিনাক্সে, আপনি ডেসেমেগ চেকআউট করতে পারেন এবং লাইনগুলি যেখানে এসিপিআই সিপিইউগুলি সূচনা করে তা ফিল্টার করতে পারে, এরকম কিছু:

dmesg | grep 'ACPI: Processor'

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.