Gå til innhold

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


Anbefalte innlegg

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
Videoannonse
Annonse

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
Lenke til kommentar

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
Lenke til kommentar
  • 4 uker senere...

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

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å
×
×
  • Opprett ny...