H!GHGuY schreef op zondag 19 augustus 2007 @ 12:24:
Laten dit dan aub minstens 2 verschillende calls zijn waarbij de ene het aantal cores geeft en de andere de system-load (zoals de load die we kennen van de uptime-tool in linux).
Een programmeur moet er dan maar conclusies uit trekken.
Liever niet, ben het eens met Grijze Vos, want dan zullen vrijwel developers besluiten dat hun programma het maximum uit het systeem mag halen. En zeker op het Windows platform is wel gebleken dat dit soort keuzevrijheden voor de programmeur uiteindelijk niet ten goede van de eindgebruiker zijn gekomen. Het is mijns inziens aan het platform om te bepalen welk programma de meeste prioriteit mag hebben. (Eventueel op verzoek van de gebruiker.)
Dit moet je anders zien. Als je een dualcore hebt en je game gebruikt 1 proc en er draaien nog 2 andere progsels op de andere CPU met een gemiddeld gebruik van 50%, kun je nog tot 50% van de andere CPU gebruiken voor extra performance in je game. Bovendien zijn P2P en IM over het algemeen "idle" applicaties. IM doet meestal niets en P2P is meer I/O intensief om maar die voorbeelden te geven.
Dat klopt, maar mocht je zoiets als een SFTP server hebben draaien wordt het toch wat andere koek. In een game zijn FPS/response heel belangrijk voor de user experience. Dus ik heb dan liever dat ik 50% van mijn resources reserveer dan dat ik met een diaserie zit opgescheept.
Wat met bvb het omgekeerd evenredig instellen van de prioriteit van de threads tov het aantal threads. Iemand met 1 actieve thread (op 1 CPU) krijgt voorrang op iemand met 8 actieve threads op (max) 8 CPUs.
Ik weet niet of dat handig is, want dan ontmoedig je juist om meerdere threads te gebruiken. Bovendien krijgt dan alle O(1)-geprogrammeerde software voorrang op MT software.
flowerp schreef op vrijdag 24 augustus 2007 @ 00:33:
Opzich regelt de scheduler in je OS natuurlijk dat de beschikbare rekentijd evenredig wordt verdeelt over je applicaties. The Completely Fair Scheduler die in de komende kernel release geïntroduceerd wordt belooft dat zelfs nog een beetje meer fair te doen.
Klopt, dat zit eraan te komen. Maar helaas moeten de Windows users nog even wachten. Wat CFS vooral gaat doen is zich losbreken van het huidige klokregime in de kernel (waarmee nog snellere responses mogelijk zijn). Volgens mij richten ze zich bij Windows op betere priorisatie. Maar ook daar blijven (imo) achtergrondprocessen een te grote impact hebben op desktop applicaties in zijn algemeenheid.
Wat er bij CFS bijvoorbeeld nog niet in zit is
ketenpriorisatie met het oog op de user experience (deze scheduler modules zullen nog worden ontwikkeld). Als ik op de achtergrond aan het compileren ben, dan wordt mijn systeem nog steeds merkbaar trager zelfs met de laagste prioriteit (19). Wat het systeem dus moet doen is kijken welke processen impact hebben op mijn user experience en die verhoogte prioriteit geven (zal een samenwerking worden tussen de WM, X11 en de kernel).
Heb je echter gewoon echt meerdere apps draaien, dan mag de scheduler er lekker voor zorgen dat iedereen gelijke aandacht krijgt. Dat is namelijk gewoon de taak van dat ding.
Je moet wel de overhead van thread meerekenen. Ik denk dat 16 threads die bij een 8-core systeem elk 50% van een core gebruiken minder efficent zijn dan 8 threads die elk een volledige core gebruiken. Nu hoeft dat niet in het extreme te worden doorgevoerd, maar aannames zijn fataal wil ik maar even aangeven

.
Inderdaad, dat is een imho zeer belangrijk element. Een stukje terug in dit topic werd hier al over gediscussieerd. Een soort van addaptive threading zeg maar. De huidige libraries, runtimes en operating systems bieden hier nog te weinig support voor vind ik.
Ben eigenlijk wel volledig met je eens dat dit de taak is van de toolkits en platforms. Het zou onzinnig zijn als je een dergelijke watchdog in elke applicatie in zou moeten bouwen.
Een probleem is natuurlijk breder als een bug.[...]
Dat is misschien meer iets persoonlijks. Maar ik probeer een
probleem altijd te laten terugslaan op een bestaande omgeving. Als het gaat om een geheel nieuwe opdracht dan beschouw ik dat als een project of (hoe cliché) 'een uitdaging'. Dus vandaar mijn opmerking. Het is zeker niet ongebruikelijk dat het opzetten van een architectuur enkele weken in beslag kan nemen. Dit ligt aan de gebruikte methode, velen vinden de watervalmethode PITA maar ook bij agille software development moet je op een gegeven moment een basis vormen - maargoed dat is een andere disuccsie.
Bij een threaded systeem zul je hoofdzakelijk ook over een verdeling na moeten denken. In de grote lijnen van je architectuur kun je het als een uitbreiding van je OO ontwerp zien; classes worden meer 'levend', meer 'actief' om het maar even gevoelsmatig uit te drukken. Het is dus geen onmogelijke complexiteit die je meester moet worden, maar een iets uitgebreidere manier van taken verdelen.
Ben je op dit niveau bang voor te veel race conditions dan heb je te fine grained taken verdeeld. Net zoals bij een OO ontwerp, waar classes "highly cohesive en lowly coupled" moeten zijn, geldt ook voor deze manier van threading dat het relatief onafhankelijke sub-systemen moeten zijn. Communicatie dient via welgedefineerde paden te verlopen en moet simpelweg 'waterdicht zijn'. Als je inderdaad via die welgedefineerde paden communiceert en niet chaotisch allemaal methods gaat aanroepen of instance variablen gaat zitten te veranderen in een shared object, dan is het helemaal niet zo moeilijk.
Ook een van de argumenten die ik mee nam is dat heel vaak O(1) software naar O(N) wordt omgebouwd. Nu durf ik wel te zeggen dat van O(1) naar O(N) minder complicaties op levert dan van O(K) naar O(N). Maar het blijft een punt dat als software niet
ontworpen is voor MT daar gewoon hele vervelende situaties voor gaan doen. Als het gaat om een totaal nieuw te ontwikkelen oplossing ligt het wat anders, dan heb je alle vrijheid en tijd om het goed op te bouwen.
Wat je verder stelt over de opbouw van MT software sta ik verder achter.
H!GHGuY schreef op vrijdag 24 augustus 2007 @ 19:00:
windows (geen idee van *nix) heeft nu reeds zoiets als CPU affinity. Het betekent dat je kan aangeven op welke CPU een programma mag draaien. Kun je heel eenvoudig inpassen in mijn verhaal door GetNbrOfCores() het aantal toegewezen (default alle) cores te laten teruggeven en GetLoad() de load voor die CPU's.
Zolang dat onder Windows met wazige parameters, taakbeheer of 3rd party tools moet gebruiken zal dat nooit echt veel gebruikt gaan worden. Misschien een paar gameserverboeren die de load een beetje eerlijk willen verdelen maar het is onwerkbaar als je dat steeds zelf moet instellen. En tevens vind ik het eigenlijk geen taak van de applicatie om te bepalen welke CPU's hij mag gebruiken.
edit:
Ik denk dat we over het algemeen toch wel mogen stellen dat op de huidige generatie PC's de process prioriteit op zijn zachts gezegd nog in de kinderschoenen staan. Veel consoles hadden het al veel langer door dat je om een bepaalde responsetijd te garanderen je gewoon bepaalde processen dedicated op een eigen processor moet zetten. In de electronicawereld is het al heel lang gebruikelijk om bepaalde functies een eigen aansturing te geven.
Natuurlijk begrijp ik dat er op de gemiddelde PC 100+ processen naast elkaar draaien en dat dat logischerwijs tot gevolg heeft dat er soms vertraging op kan treden bij de verkeerde processen (vanuit de gebruiker gezien). Maar nog steeds ben ik eigenlijk nergens een functie tegengekomen waarbij prioriseren ook daadwerkelijk werkt zoals een gebruiker verwacht. Als ik onder Windows een process 'realtime' prioriteit geef, dan is het nog steeds mogelijk dat een low priority - maar wel fanatieke - virusscanner alle disk I/O op vreet wat alsnog dat realtime process vertraagd.
Men denkt volgens mij op dit punt vrij veel in hokjes. Als het gaat om process priorisatie dan moet dit voor een process op alle vlakken gebeuren, zowel CPU-tijd alswel extern geheugen en I/O.
[
Voor 7% gewijzigd door
LauPro op 26-08-2007 04:19
]