CPU škrcení v jazyce C ++

hlasů
39

Jen by mě zajímalo, jestli tam je elegantní způsob, jak nastavit maximální zatížení procesoru pro konkrétní nití dělá intenzivní výpočty.

Právě teď jsem se nachází časově nejnáročnější smyčku v závitu (to dělá jen komprese) a pomocí softwaru GetTickCount()a Sleep()s pevně hodnoty. Dbá na to, že smyčka pokračuje po určitou dobu a pak spí po určitou minimální dobu. To víceméně dělá práci tedy zaručuje, že nit nebude používat více než 50% výkonu procesoru.
Nicméně chování je závislé na počtu procesorových jader (obrovské nevýhodě) a prostě ošklivé (menší nevýhodu :)).
Nějaké nápady?

Položena 05/08/2008 v 08:11
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
17

Nejsem si vědom žádných API dělat dostat plánovač operačního systému, aby to, co chcete (i když váš vlákno je nečinný prioritou, pokud nejsou vyšší prioritou připravené závity, bude váš běh). Nicméně, myslím, že můžete improvizovat docela elegantní funkce škrticí založený na tom, co už dělají. V podstatě (I nemají dev stroj Windows šikovný):

Vyberte si výchozí množství času nit bude spát každou iteraci. Poté na každé iteraci (nebo na každou n-tou iteraci, takže funkce škrticí není sama stala významným zatížení CPU),

  1. Spočítat množství procesorového času vaší vlákno použité od posledního vaše škrcení funkce byla volána (zavolám tento dCPU). Můžete použít GetThreadTimes () API získat množství času, vaše vlákno bylo provádění.
  2. Počítat částky reálném čase, která uplynula od posledního vaše škrcení funkce byla volána (zavolám tento dCLOCK).
  3. dCPU / dCLOCK je využití CPU procenta (z jednoho procesoru). Pokud je vyšší, než chcete, zvýšit svůj čas spánku, pokud je nižší, zkrátit dobu spánku.
  4. Vyjádřete svůj závit spát vypočtenou dobu.

V závislosti na tom, jak váš hlídač počítá využití procesoru, možná budete chtít použít GetProcessAffinityMask () zjistit, kolik CPU má systém. dCPU / (dCLOCK * CPU) je procento celkového času CPU k dispozici.

Stále budete muset vybrat magické číslo pro počáteční doby spánku a množství přírůstek / odečítání, ale myslím, že tento algoritmus mohl být naladěn, aby vlákno běží na poměrně blízko rozhodčí procent procesoru.

Odpovězeno 06/09/2008 v 00:33
zdroj uživatelem

hlasů
4

Na Linuxu můžete změnit plánovací prioritu závitu s pěkným ().

Odpovězeno 05/08/2008 v 09:03
zdroj uživatelem

hlasů
2

Problém je v tom, že to není normální, že chce nechat běžet na volnoběh procesoru, zatímco vy nějakou práci. Za normálních okolností byste za úkol pozadí IDLE priority, a nechat OS zvládnout naplánováním to po celou dobu procesoru, který není používán interaktivními úkoly.

Zní mi to jako problém je proces watchdog.

Pokud je vaše pozadí úkol je CPU-vázán pak chcete, aby přijaly veškerá nevyužitou procesorového času ke splnění svých úkolů.

Možná byste se měli podívat na upevnění program watchdog?

Odpovězeno 06/09/2008 v 10:01
zdroj uživatelem

hlasů
2

Já si nemyslím, že jakékoliv křížové platformě způsobem to, co chcete (nebo jakýkoli garantovaný postup tečce), ale používáte GetTickCount snad nejste zájem o multiplatformní :)

Já bych použít komunikace mezi procesy a nastavit náročné procesy pěkné úrovně se dostat to, co budete potřebovat, ale nejsem si jistý, že je vhodná pro danou situaci.

EDIT: Souhlasím s Bernardem , což je důvod, proč si myslím, že proces spíše než vlákno může být vhodnější, ale prostě nemusí vyhovovat vašim účelům.

Odpovězeno 05/08/2008 v 08:23
zdroj uživatelem

hlasů
0

Můžete být schopni změnit prioritu niti, ale měnící se maximální využití by buď vyžadují dotazování a hacky omezit, kolik věcí se vyskytují, nebo s použitím OS nástroje, které lze nastavit maximální využití procesu. Nicméně nevidím žádnou okolnost, kam by chtěl dělat.

Odpovězeno 03/01/2018 v 18:06
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more