Gå til innhold

C#: Flertrådet program bruker kun én kjerne


Anbefalte innlegg

Skrevet

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)

Videoannonse
Annonse
Skrevet

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)

Skrevet (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 av GeirGrusom
Skrevet (endret)

bare sleng inn en while(true) {} i worker trådene så får du vel "debugget" akkurat det ganske greit :p 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 av The Jackal
  • 4 uker senere...
Skrevet

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.

Skrevet

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.

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...