CPU struping i C ++

stemmer
39

Jeg bare lurte på om det er en elegant måte å sette maksimal CPU-belastning for en bestemt tråd gjør intensive beregninger.

Akkurat nå har jeg funnet den mest tidkrevende løkke i tråden (det gjør bare komprimering) og bruk GetTickCount()og Sleep()med hardkodede verdier. Det gjør at løkken fortsetter i en viss tid og enn sover for en viss minimal tid. Det mer eller mindre gjør jobben dvs garanterer at tråden ikke vil bruke mer enn 50% av CPU.
Men problemet er avhengig av antall CPU-kjerner (stor ulempe) og rett og slett stygg (mindre ulempe :)).
Noen ideer?

Publisert på 05/08/2008 klokken 07:11
kilden bruker
På andre språk...                            


5 svar

stemmer
17

Jeg er ikke kjent med noen API for å gjøre få OS er planleggeren til å gjøre hva du vil (selv om tråden er idle-prioritet, hvis det er ikke høyere prioritet klare tråder, vil din kjøre). Imidlertid tror jeg du kan improvisere en ganske elegant strupefunksjonen basert på hva du allerede gjør. Hovedsak (jeg har ikke en Windows dev maskin hendig):

Plukk en standard mengde tid tråden vil sove hver iterasjon. Deretter, på hver iterasjon (eller på hver n'te iterasjon, slik at strupefunksjonen ikke selv bli en betydelig CPU-belastning),

  1. Beregn hvor mye CPU-tid tråden brukt siden forrige gang du struping funksjonen ble kalt (jeg vil kalle dette dCPU). Du kan bruke GetThreadTimes () API for å få tiden til tråden har vært utførende.
  2. Beregn hvor mye sanntid gått siden siste gang du struping funksjonen ble kalt (jeg vil kalle dette DCLOCK).
  3. dCPU / DCLOCK er den prosent av CPU (av en CPU). Hvis det er høyere enn du ønsker, kan du øke din sove tid, dersom lavere, redusere sove tid.
  4. Ha tråd søvn for den beregnede tid.

Avhengig av hvordan vaktbikkje beregner CPU-bruk, kan det være lurt å bruke GetProcessAffinityMask () for å finne ut hvor mange CPUer systemet har. dCPU / (DCLOCK * CPUer) er prosentandelen av total CPU tid tilgjengelig.

Du vil fortsatt ha til å plukke noen magiske tall for den første hviletiden og øke / redusere beløpet, men jeg tror denne algoritmen kan være innstilt til å holde en rød tråd i det ganske nær en bestemt prosent av CPU.

Svarte 05/09/2008 kl. 23:33
kilden bruker

stemmer
4

På linux, kan du endre planlegging prioritet av en tråd med fin ().

Svarte 05/08/2008 kl. 08:03
kilden bruker

stemmer
2

Problemet er at det er ikke normalt å ønske å forlate CPU tomgang mens du har arbeid å gjøre. Normalt du angi et bakgrunns oppgave å IDLE prioritet, og la OS håndtere planlegging det hele CPU-tid som ikke brukes av interaktive oppgaver.

Det høres for meg ut som problemet er vaktbikkje prosessen.

Hvis bakgrunnen oppgave er CPU-bundet da du vil at den skal ta alle de ubrukte CPU tid for sin oppgave.

Kanskje du bør se på å fikse vaktbikkje programmet?

Svarte 06/09/2008 kl. 09:01
kilden bruker

stemmer
2

Jeg kan ikke tenke på noen cross platform veien for hva du ønsker (eller noen garantert måte punktum), men som du bruker GetTickCount kanskje du ikke er interessert i å kryss-plattform :)

Jeg vil bruke interprosess kommunikasjon og sette den intensive prosesser fine nivåer for å få det du trenger, men jeg er ikke sikker på at er riktig for din situasjon.

EDIT: Jeg er enig med Bernard og det er derfor jeg tror en prosess heller enn en tråd kan være mer hensiktsmessig, men det er bare kanskje ikke passer ditt formål.

Svarte 05/08/2008 kl. 07:23
kilden bruker

stemmer
0

Du kan være i stand til å endre prioriteten til en tråd, men endrer maksimal utnyttelse vil enten kreve polling og hacks for å begrense hvor mange ting forekommer, eller ved hjelp av OS verktøy som kan sette maksimal utnyttelse av en prosess. Men jeg kan ikke se noen omstendighet der du ønsker å gjøre dette.

Svarte 03/01/2018 kl. 18:06
kilden bruker

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