Jak zjistit jader procesoru, vytížení procesoru nebo teplotu CPU? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak zjistit jader procesoru, vytížení procesoru nebo teplotu CPU? – C / C++ – Fórum – Programujte.comJak zjistit jader procesoru, vytížení procesoru nebo teplotu CPU? – C / C++ – Fórum – Programujte.com

 

oxidián0
Grafoman
25. 2. 2015   #1
-
0
-

Našel jsem na netu tento kód na zjištění počtu jader procesoru, ale ukazuje mi to pouze počet threadů:

http://www.cprogramming.com/snippets/source-code/find-the-number-of-cpu-cores-for-windows-mac-or-linux

Tak se ptám jestli existuje ještě nějaký lepší kód nebo knihovna který by dokázal zjistit skutečný počet jader. A vrámci toho by se mi hodila i funkce na zjištění vytížení jádra. Chci pracovat s knihovnou pthread a chtěl bych zabránit tomu aby počítač byl příliš vytížený když spustím více procesů najednou (aby mi nezamrzla jiná aplikace), takže bych tam chtěl mít možnost zjistit nakolik procent je procesor vytížený nebo jestli se nepřehřívá procesor (to by byl další bonus).

Dodám že jedu na x86, Windows XP 32 bit, ale nejlépe by bylo použít přenosné řešení.

Nahlásit jako SPAM
IP: 78.45.199.–
25. 2. 2015   #2
-
0
-
Nahlásit jako SPAM
IP: 195.178.67.–
oxidián0
Grafoman
25. 2. 2015   #3
-
0
-

To není odpověď, ale ignorance! OIčividně ses na ten link ani nepodíval, že to sem předhazuješ znova :-( a ještě navíc když jsem říkal, že to vrací počet threadů a ne počet jader! Když nevíš nebo se ti nechce tak radši nic nepiš! Google používat umím taky. Ptal jsem se na funční kód nebo knihovnu, která pojede aspoň na Windows. Pokud nemáš praktické zkušenosti tak to není odpověď na moji otázku.

Nahlásit jako SPAM
IP: 78.45.199.–
25. 2. 2015   #4
-
+1
-
Zajímavé

Ty knihovno, když chceš nějakou informaci od OS, použij jeho API. Jestli si myslíš, že mi tu v počítači běží jen 2 thready, tak jseš na omylu. Kdybys uměl používat Google jak se chvástáš, tak si to v dokumentaci WinAPI najdeš sám. 

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:d01a:9c...–
PiranhaGreg0
Stálý člen
25. 2. 2015   #5
-
0
-

Ahoj, celkový počet vláken, které mohou najednou běžet udává statická proměnná std::thread::hardware_concurrency (C++11).

Počet jader bys neměl moc potřebovat. Třeba některé IBM procesory mají myslím 8 threadů na jedno jádro. To by ses pak hodně omezoval. Samozřejmě držme se při zemi. I Intel má ve svých procesorech standardně dvojnásobek threadů.

A využití CPU bych neřešil. Tohle by si měl pohlídat OS. Třeba Windows si běžně nějakou údržbou těch 100% procesoru klidně vezme, ale jakmile se začne nějaká jiná aplikace zajímat o procesorový čas, přestane to dělat.

Nahlásit jako SPAM
IP: 109.81.210.–
peter
~ Anonymní uživatel
3981 příspěvků
25. 2. 2015   #6
-
+1
-
Zajímavé

http://www.hwinfo.com/ - ten program umi o hw zjistit more veci. Treba by se jich dalo zeptat, pripadne hledat forka zabyvajici se c++ a hw. Ve zdejsi komunite mozna najdes 1-2 lidi a sance, ze si prectou zrovna tvuj prispevek, je dost mala.

google = hw info in c++
google = hw info in c++ cpu

http://stackoverflow.com/questions/850774/how-to-determine-the-hardware-cpu-and-ram-on-a-machine
-> https://msdn.microsoft.com/…S.85%29.aspx

https://answers.yahoo.com/question/index?qid=20111101060643AAAgyWJ
-> BIOS -> https://msdn.microsoft.com/…s.85%29.aspx
-> PROCESSOR -> http://msdn.microsoft.com/…top/aa394373(v=VS.85).aspx
-> MOTHERBOARD DEVICES -> http://msdn.microsoft.com/…top/aa394204(v=VS.85).aspx

Ja vim, ja vim, je to trapne to hledat googlem. Ale, kdyz ono to funguje :)

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:bc89:b9...–
oxidián0
Grafoman
25. 2. 2015   #7
-
0
-

PiranhaGreg:

Můj program je v C, ne v C++. Chceš snad říct, že počet procesorů nehraje roli? Já to potřebuju kvůli tomu, že chci zjistit kolik obrázků je optimální zpracovávat. Myslím si, že když bych zpracovával 8 obrázků najednou tak to potrvá dvakrát déle než když budu zpracovávat 4, protože mám 4 jádra. Tedy 8 obrázků není optimální počet. Ale kdo má 8 jader pro něj by 8 bylo optimální. Moji domněnku mám založenou na tom že když v programu Format Factory dám konvertovat více videí než 4 tak program více než 4 dělat nebude. Když jsem měl dual core CPU tak to zase byly jen dvě videa co se mi nakonvertovali v přibližně stejném čase.

To WinAPI zjišťuje počet vláken a ne threadů což špatně. Ale nějak to jít musí když HW Info, HW monitor takové věci zjistit umí...

Peter:

Zapomněl jsem zmínit že hledám kód pro C, ne C++. A zase bych byl nerad kdyby uživatel musel instalovat další program na kterém by byl závislý (HW Info).

Edit:

Smiřuji se s tím že jednoduché řešení neexistuje. Takže to udělám tak že defaultně podělím počet threadů dvěma a pokud s tím nebude uživatel spokojen, tak si to překonfiguruje argumentem -cpu 2

Nahlásit jako SPAM
IP: 78.45.199.–
PiranhaGreg0
Stálý člen
25. 2. 2015   #8
-
0
-

#7 oxidián
Já si naopak myslím, že je lepší využít všechna logická jádra. Jestli už máš tu aplikaci napsanou, tak schválně zkus zpracovat 8 obrázků najednou a pak 4 obrázky + další 4 obrázky. Co bude rychlejší ;-). Mě třeba snad všechny aplikace běží na 4 vláknech, i když mám fyzicky jen 2 jádra...

Nahlásit jako SPAM
IP: 109.81.210.–
oxidián0
Grafoman
25. 2. 2015   #9
-
0
-

Teď to předělávám, takže to nemohu otestovat. Mimoto, pthread mám připravené, ale ještě s nimi neumím pracovat takže to zabere nějaký čas než se to naučím.

Nahlásit jako SPAM
IP: 78.45.199.–
oxidián0
Grafoman
25. 2. 2015   #10
-
0
-

Víte jak rozjet tenhle kód na WIndows XP a v C? Má se includovat WinBase.h ale stejně to hlásí neznámé typy. https://msdn.microsoft.com/en-us/library/windows/desktop/ms683194%28v=vs.85%29.aspx

unknown type SYSTEM_LOGICAL_PROCESSOR_INFORMATION

PCACHE_DESCRIPTOR

error: 'RelationNumaNode' undeclared (first use in this function)

error: invalid type argument of '->' (have 'int')

atak dále a tak dále

// #include <WinDef.h>
#include <windows.h#include <WinBase.h>
#include <WinNT.h>
#include <malloc.h>
#include <stdio.h>

typedef DWORD *PDWORD;
typedef SYSTEM_LOGICAL_PROCESSOR_INFORMATION *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION;

typedef BOOL (WINAPI *LPFN_GLPI)(
    PSYSTEM_LOGICAL_PROCESSOR_INFORMATION,
    PDWORD);


// Helper function to count set bits in the processor mask.
DWORD CountSetBits(ULONG_PTR bitMask)
{
    DWORD LSHIFT = sizeof(ULONG_PTR)*8 - 1;
    DWORD bitSetCount = 0;
    ULONG_PTR bitTest = (ULONG_PTR)1 << LSHIFT;
    DWORD i;

    for (i = 0; i <= LSHIFT; ++i)
    {
        bitSetCount += ((bitMask & bitTest)?1:0);
        bitTest/=2;
    }

    return bitSetCount;
}

int test()
{
    LPFN_GLPI glpi;
    BOOL done = FALSE;
    PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = NULL;
    PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr = NULL;
    DWORD returnLength = 0;
    DWORD logicalProcessorCount = 0;
    DWORD numaNodeCount = 0;
    DWORD processorCoreCount = 0;
    DWORD processorL1CacheCount = 0;
    DWORD processorL2CacheCount = 0;
    DWORD processorL3CacheCount = 0;
    DWORD processorPackageCount = 0;
    DWORD byteOffset = 0;
    PCACHE_DESCRIPTOR Cache;

    glpi = (LPFN_GLPI) GetProcAddress(
                            GetModuleHandle(TEXT("kernel32")),
                            "GetLogicalProcessorInformation");
    if (NULL == glpi)
    {
        _tprintf(TEXT("\nGetLogicalProcessorInformation is not supported.\n"));
        return (1);
    }

    while (!done)
    {
        DWORD rc = glpi(buffer, &returnLength);

        if (FALSE == rc)
        {
            if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
            {
                if (buffer)
                    free(buffer);
                buffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)
                            malloc(returnLength);

                if (NULL == buffer)
                {
                    printf("\nError: Allocation failure\n");
                    return (2);
                }
            }
            else
            {
                printf("\nError %d\n", GetLastError());
                return (3);
            }
        }
        else
        {
            done = TRUE;
        }
    }

    ptr = buffer;

    while (byteOffset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= returnLength)
    {
        switch (ptr->Relationship)
        {
        case RelationNumaNode:
            // Non-NUMA systems report a single record of this type.
            numaNodeCount++;
            break;

        case RelationProcessorCore:
            processorCoreCount++;

            // A hyperthreaded core supplies more than one logical processor.
            logicalProcessorCount += CountSetBits(ptr->ProcessorMask);
            break;

        case RelationCache:
            // Cache data is in ptr->Cache, one CACHE_DESCRIPTOR structure for each cache.
            Cache = &ptr->Cache;
            if (Cache->Level == 1)
            {
                processorL1CacheCount++;
            }
            else if (Cache->Level == 2)
            {
                processorL2CacheCount++;
            }
            else if (Cache->Level == 3)
            {
                processorL3CacheCount++;
            }
            break;

        case RelationProcessorPackage:
            // Logical processors share a physical package.
            processorPackageCount++;
            break;

        default:
            printf("\nError: Unsupported LOGICAL_PROCESSOR_RELATIONSHIP value.\n");
            break;
        }
        byteOffset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);
        ptr++;
    }

    printf("\nGetLogicalProcessorInformation results:\n");
    printf("Number of NUMA nodes: %d\n"),
             numaNodeCount);
    printf("Number of physical processor packages: %d\n"),
             processorPackageCount);
    printf("Number of processor cores: %d\n"),
             processorCoreCount);
    printf("Number of logical processors: %d\n"),
             logicalProcessorCount);
    printf("Number of processor L1/L2/L3 caches: %d/%d/%d\n"),
             processorL1CacheCount,
             processorL2CacheCount,
             processorL3CacheCount);

    free(buffer);

    return 0;
}

Mám Windows XP 32-bit SP3 a stejně to nejede ani po includování všech headerů

Windows Vista, Windows XP Professional x64 Edition, Windows XP with SP3 [desktop apps only]

Po kliknutí na stránku:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms684197%28v=vs.85%29.aspx

zjišťuji, že na XP 32-bit není závislost. LOGICAL_PROCESSOR_RELATIONSHIP ... Je to nahov** ty Windowsovské stránky, píšou tam nejdříve že to podporuje XP SP3 a pak po bližším prostudování závislostí zas zjistím že nepodporuje. Hodina v pr**li

Nahlásit jako SPAM
IP: 78.45.199.–
Sath+1
Duch
25. 2. 2015   #11
-
0
-

Pokud by slo spustit prikazovou radku, zjisti to WMI pres prikaz "wmic cpu get" ve sloupci NumberOfCores. Predtim je ale mozna potreba nainstalovat nasledujici hotfix, jinak to vraci stejne jen logicka jadra: http://support.microsoft.com/kb/936235

Jinak ale nevidim duvod nepouzit logicka jadra. CPU jsou schvalne delana tak, aby (az na velikost cache, ktera je mezi logickymi jadry sdilena) opravdu nebyl rozdil mezi logickym a fyzickym jadrem - ten backend se stejne vetsinu casu flaka.

Dost dobre materialy, proc je to vetsinou jedno, jsou treba tady: http://funkcionalne.cz/2015/01/hyper-threading-aneb-jak-sakra-muze-bezet-vic-vlaken-na-jednom-jadre/
Doporucuju i ostatni tamni clanky o CPU, kde pak zjistite, ze vetsina podobnych predcasnych optimalizaci je uplne mimo. Nezbyva nez proste zkouset a merit, protoze CPU jsou docela slozite bestie, a kazde trochu jine.

Nahlásit jako SPAM
IP: 85.71.134.–
oxidián0
Grafoman
25. 2. 2015   #12
-
0
-

Pokud by to ten hotfix opravil tak už bych mohl použít jednodušší metodu na zjištění cores, ale pak zase uživatel ten hotfix nemusí mít nainstalovaný na XP SP3. Radši se smířím s těmi pouze logickými jádry. Napadlo mě ještě dohledat senzory procesoru pokud to jde (HW Monitor to umí ) - ty by měly odpovídat počtu jader, ale co když daný procesor bude mít těch čidel méně nebo dokonce žádné? Nebo porouchané. Na to by pak nemusel být spoleh.

Nahlásit jako SPAM
IP: 78.45.199.–
26. 2. 2015   #13
-
0
-

V době, kdy na trh mají přijít Windows 10 a Windows XP jsou už asi rok bez podpory, mi připadá zcestné řešit, co se stane na XP a jestli mají instalovaný nějaký hotfix. XP jsou minulost. Nezbývá, než se s tím smířit. 

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:d1a6:7d...–
oxidián0
Grafoman
26. 2. 2015   #14
-
0
-

Nejsou minulost, možná tak pro tebe. Stále značné procento lidí používá XP. Osobně nevidím důvod proč si kupovat nový systém. Je to každého věc a podle potřeby. Nevidím důvod proč bych měl svůj systém omezovat na nejnovější systémy. Záleží k čemu ten systém mám a co na něm dělám. Třeba na internet XP bohatě stačí. Vlastně i na hraní starších her nebo onlinovek. Stejně žádné nové nevlastním. A že mají přijít Windows 10? A kdy, vždyť ještě ani Windows 9 nevyšly, zrovna jsem četl na netu nějaký článek že mají teď v dubnu vyjít Windows 9 a já "Cože? To ještě nevyšly?" Jo ale byl to článek z loňského roku: http://www.dsl.cz/clanek/3034-windows-9-maji-vyjit-v-dubnu-2015-osmicky-jsou-pry-neco-jako-vista

Doporučuji shlédnout:

http://mobilenet.cz/clanky/windows-v-lednu-2015-sedmicky-klesaji-osmicky-a-xp-rostou-18922

Na netu narazíš na dost lidí, kteří s těmi novými Windows nejsou spokojeni.

Nahlásit jako SPAM
IP: 78.45.199.–
Satik0
Stálý člen
26. 2. 2015   #15
-
0
-

Win 9 byly prejmenovany na Win10.

XP uz vazne moc lidi nepouziva a vyvojari uz kompatibilitu s nimi neresi, pokud to neni vylozene produkt urceny pro pocitace, kde XP jeste beha.

Nahlásit jako SPAM
IP: 86.49.188.–
26. 2. 2015   #16
-
0
-

Windows 10 mi byly minulý týden nabídnuty k testování, takže k uvedení na trh už moc daleko není. Co se týče XP a internetu, tam právě neaktualizovaný OS představuje největší riziko pro citlivé údaje uživatele. Internet banku nebo nákup v eshopu bych v tom rozhodně nedělal. Neoblíbenost nového OS - XP to na jejich počátku potkalo taky. Podle prvních zkušeností s Win 7 si myslím, že umí lépe využít vícejádrový procesor než to dělaly XP.

XP byly zdařilý OS, slzičku jsem už zamáčknul, život jde dál. Požadavky jsou dnes jiné - dotykové technologie, 64-bitový HW a OS a výrazně sílí mobilní platforma.

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:b185:66...–
oxidián0
Grafoman
26. 2. 2015   #17
-
0
-

U nás máme 3 PC a na všech jsou XP tak mě nemusíš přesvědčovat. I kdyby šlo jen o 5% tak se to stále vyplatí, protože v cílové komunitě, které je můj program prioritně určen může být 50% t2ch co používají XP. Z tohoto pohledu se na to dívej. I kdyby jeden jediný člověk nemohl kvůli mě použít můj program je to škoda, protože příjdeme o člověka.

Nákupu v eshopu a pohyb na elektornickém bankovnictví (já osobně nepoužívám ani jedno) bych se rozhodně nebál. Všechno dostáváš potvrzené přes mobil. To je jedna věc. Druhá věc je ta, že nesmíš lést na stránky které zavirovávají počítač, takže zůstaneš tam kde je záruka že nehrozí možnost zavirování. Chodíš jen na známá diskusní fora, email a neotvíráš spam a podezřelé přílohy. Používáš google a čteš dokumentace. Z toho se nic nezaviruje. Stejně pokud by ses rozhodl nainstalovat nějaký podezřelý program tak ten ti zaviruje i moderní PC. To s updatama a bezpečností nemá nic společného. Antivirák nepoužívám a zavirované to nemám. Dále, antivirovou kontrolu můžu kdykoliv provést z Windows 8 z jiného disku. Nebudu se přizpůsobovat, moje požadavky jsou jiné než Windows 8 nabízí a tudíž je to jejich rozhdnutí že se výrobci Windows rozhodli mě jakožto cílovou skupinu vynechat. Jejich smůla.

Nahlásit jako SPAM
IP: 78.45.199.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

Podobná vlákna

Využití více jader procesoru — založil Petr Ká

Teplota procesoru — založil michal

Využití procesoru — založil Franceq

Vetracek u procesoru — založil co ja vim

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý