GeirGrusom Skrevet 30. oktober 2009 Del Skrevet 30. oktober 2009 Hei Jeg laget en ray-tracer i C#, men jeg får den ikke til å bruke mer enn én kjerne (på min dual core ligger den alltid på 50% CPU) Jeg bruker følgende funksjon som jeg skrev public delegate void ParalelDelegate(int index); public class Parallell { public static void ParallellFor(int start, int count, int increment, ParalelDelegate action) { ParalelDelegate[] deleg = new ParalelDelegate[count]; IAsyncResult[] results = new IAsyncResult[count]; for (int i = start; i < start + count; i+=increment) { deleg[i] = new ParalelDelegate(action); results[i] = deleg[i].BeginInvoke(i, null, null); } for (int i = 0; i < deleg.Length; i++) deleg[i].EndInvoke(results[i]); } } Som deretter kalles slik i koden: Parallell.ParallellFor(0, data.Length, 1, new ParalelDelegate( delegate(int i) { DoRender(data[i]); })); Er det noen triks som må til for at flere kjerner skal brukes? Jeg satte over til MTA fra STA, og som forventet hadde det selvsagt ingen effekt (siden dette har med COM interop å gjøre) Lenke til kommentar
oelbox Skrevet 2. november 2009 Del Skrevet 2. november 2009 Mulig ProcessThread.ProcessorAffinity kan hjelp deg. Lenke til kommentar
GeirGrusom Skrevet 6. november 2009 Forfatter Del Skrevet 6. november 2009 Takk for tipset, skal se om det funker Lenke til kommentar
The Jackal Skrevet 6. november 2009 Del Skrevet 6. november 2009 Må du ikke threade den også? Bare kjøre den asynkront betyr vel ikke at du får delt opp programmet i flere tråder. Lenke til kommentar
GeirGrusom Skrevet 6. november 2009 Forfatter Del Skrevet 6. november 2009 Jeg har laget en tilsvarende funksjon som bruker Thread klassen (siden jeg mistenkte det samme som deg) men det hadde lite å si på ytelsen (mer fluktuerende mellom 45 og 60) Lenke til kommentar
The Jackal Skrevet 6. november 2009 Del Skrevet 6. november 2009 men tyder ikke det på at du faktisk bruker flere kjerner da? Bare at de trådene som kjører på en annen core ikke er så intensive. Lenke til kommentar
GeirGrusom Skrevet 6. november 2009 Forfatter Del Skrevet 6. november 2009 (endret) Forsåvidt, men jeg aner ikke hvilke. For alt jeg vet kan det være GUI eller GC som kjører på den andre kjernen. Trådene jeg lager er temmelig CPU intensive, så de burde raskt få CPU-en til å svette. Men hvis noen har en Quad-core eller mer, så kunne dere kanskje sett hvor mye CPU programmet brukte, og om det er mer enn på min Dual-core (som går fra 50-60% CPU) RayTrace_cs.zip Endret 6. november 2009 av GeirGrusom Lenke til kommentar
The Jackal Skrevet 6. november 2009 Del Skrevet 6. november 2009 (endret) bare sleng inn en while(true) {} i worker trådene så får du vel "debugget" akkurat det ganske greit Eventuelt finn ut en måte å skrive ut affinity. Edit: Det kjører med 50-55% prosessor kraft på min dualcore. Edit2: Kan teste på min Quad core når jeg kommer hjem. Endret 6. november 2009 av The Jackal Lenke til kommentar
GeirGrusom Skrevet 6. november 2009 Forfatter Del Skrevet 6. november 2009 Jeg må synkronisere alle trådene når de er ferdig med å rendre for å hindre at de låser grafikk devicen Lenke til kommentar
DeadManWalking Skrevet 6. november 2009 Del Skrevet 6. november 2009 (endret) Med og uten programmet kjørende på Quad Core Win7 64-bit. Totalt lå CPU bruk på 25%-30%. Endret 6. november 2009 av Algific Lenke til kommentar
GeirGrusom Skrevet 6. november 2009 Forfatter Del Skrevet 6. november 2009 Hømmm... den kjører på alle kjernene.... men den bare slacker.... kanskje det er synkroniseringen som gjør at CPU-en ikke går på 100%? Lenke til kommentar
Psy Skrevet 4. desember 2009 Del Skrevet 4. desember 2009 Vi ser ingenting av DoRender() koden her. Det kan hende at den bruker shared resources som gjør at trådene blir ventende på hverandre og dermed ikke bruker 100% CPU. Lenke til kommentar
OleM80 Skrevet 11. desember 2009 Del Skrevet 11. desember 2009 Har du sjekket ut STAThread MTAThread attributtene? class MainClass { // [MTAThread] [sTAThread] static void Main(string[] args) { etc..... Mere om dette her http://www.developer.com/net/cplus/print.php/2202491 Lenke til kommentar
GeirGrusom Skrevet 11. desember 2009 Forfatter Del Skrevet 11. desember 2009 Jeg teste det for morroskyld, men det hadde ingenting å si. Dette var egentlig forventet ettersom: 1. Attributten gjelder kun for main tråden 2. ThreadApartment har med COM-interop å gjøre, og påvirker ikke oppførselen til programmer som ikke bruker COM-interop (noe jeg ikke gjør) Programmer bruker ingen semaforer heller, så det eneste jeg kan tenke meg er at enten prosessorbruken går ned ved at alle trådene må joines før bildet kan vises på skjermen, eller at .NET rett og slett ikke fordeler tråder på forskjellige kjerner... men det synes jeg høres litt rart ut. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå