dławienie CPU w C ++

głosy
39

Zastanawiam się, czy istnieje elegancki sposób, aby ustawić maksymalne obciążenie procesora dla konkretnego wątku robi intensywnych obliczeń.

Teraz ja się najbardziej czasochłonnych pętli w wątku (to nie tylko kompresję) i używać GetTickCount()i Sleep()wartościami zakodowanych. To daje pewność, że pętla trwa przez pewien okres czasu i nie śpi w pewnym minimalnym czasie. To mniej więcej spełnia swoje zadanie czyli gwarantuje, że wątek nie będzie używać więcej niż 50% CPU.
Jednak zachowanie jest zależne od liczby rdzeni procesora (ogromny niekorzyść) i po prostu brzydki (mniejszej niekorzyść :)).
Jakieś pomysły?

Utwórz 05/08/2008 o 08:11
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
17

Nie jestem świadom wszelkich API zrobić dostać planującego system operacyjny, aby robić to, co chcesz (nawet jeśli wątek jest bezczynny priorytetem, jeśli nie ma o wyższym priorytecie gotowe gwinty, będzie prowadzony do ciebie). Myślę jednak, że można improwizować dość eleganckie funkcję ograniczania przepustowości w oparciu o to, co już robisz. Zasadniczo (nie mam maszyny dev systemu Windows poręczny):

Wybierz domyślną ilość czasu nitka będzie spać każdej iteracji. Następnie na każdej iteracji (lub na każdej n-tej iteracji, tak że funkcja dławienia sama nie stać się znaczącym obciążenie CPU),

  1. Obliczyć ilość czasu procesora Twój wątek używanych od czasu ostatniego czynność dławienie nazwano (ja nazywam to dCPU). Można użyć GetThreadTimes () API, aby uzyskać czas Twój wątek został wykonującego.
  2. Obliczyć ilość czasie rzeczywistym, jaki upłynął od ostatniego czynność dławienie nazwano (ja nazywam to dCLOCK).
  3. dCPU / dCLOCK jest stosowanie procent procesora (jednej CPU). Jeśli jest wyższa niż chcesz zwiększyć swój czas uśpienia, jeśli jest niższa, skrócenie czasu snu.
  4. Mieć swój wątek snu po raz komputerowej.

W zależności od sposobu watchdog oblicza zużycie procesora, może chcesz używać GetProcessAffinityMask (), aby dowiedzieć się, ile procesorów system ma. dCPU / (dCLOCK * CPU) jest procent całkowitego czasu procesora dostępne.

Nadal będzie musiał wybrać kilka magicznych liczb na początkowym czasie snu i wysokości góra / dół, ale myślę, że ten algorytm może być dostrojony do utrzymania wątkiem w dość blisko do ustalonej procent CPU.

Odpowiedział 06/09/2008 o 00:33
źródło użytkownik

głosy
4

W systemie Linux można zmienić priorytet planowania gwintu z ładnym ().

Odpowiedział 05/08/2008 o 09:03
źródło użytkownik

głosy
2

Problemem jest to, że nie jest normalne, że chce opuścić bezczynności procesora podczas gdy masz do zrobienia. Normalnie zadanie tła można ustawić priorytet na biegu jałowym, a niech OS obsłużyć planowania to cały czas procesora, który nie jest używany przez interaktywnych zadań.

To brzmi dla mnie jak problem jest proces watchdog.

Jeśli zadanie tła jest CPU-bound to chcesz go wziąć cały niewykorzystany czas procesora dla swojego zadania.

Być może należy spojrzeć na ustalaniu programu watchdog?

Odpowiedział 06/09/2008 o 10:01
źródło użytkownik

głosy
2

Nie mogę myśleć o dowolnej platformie krzyżowego sposób, co chcesz (lub gwarantowane sposób kropką), ale jak używasz GetTickCount być może nie jesteś zainteresowany wieloplatformowym :)

Chciałbym używać połączeń międzyprocesowych i ustawić intensywne procesy ładne poziomów, aby dostać to, czego potrzebują, ale nie jestem pewien, że to odpowiednie dla danej sytuacji.

EDIT: Zgadzam się z Bernardem , dlatego myślę, że to proces raczej niż nitki może być bardziej odpowiednie, ale po prostu nie może spełnić swoje cele.

Odpowiedział 05/08/2008 o 08:23
źródło użytkownik

głosy
0

Możesz być w stanie zmienić priorytet wątku, ale zmieniając maksymalne wykorzystanie będzie wymagać albo odpytywanie i hacki do ograniczenia jak wiele rzeczy mają miejsce, lub za pomocą narzędzi systemu operacyjnego, który można ustawić maksymalne wykorzystanie procesu. Jednak nie widzę żadnych okoliczności gdzie chcesz to zrobić.

Odpowiedział 03/01/2018 o 18:06
źródło użytkownik

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