Gå til innhold

C#: Trenger å speede opp funksjon; hjelper det med flere tråder?


Anbefalte innlegg

Har en funksjon som lager hash-koder basert på innholdet i filer.

Dette kan bli ganske mange hash-koder når filene passerer 2-300 MB(og kanskje opp til 1 GB).

Jeg skulle gjerne fått dette til å gå raskere og lurer på om det er noe vits i å sette flere tråder til å gjøre litt av jobben hver?

Vil de ikke havne i samme CPU "kø" og måtte vente på tur?

Skulle gjerne hatt kunnskap om hvordan dette kunne gjøres parallelt på en manycore maskin, med det har jeg altså ikke for øyeblikket.

Kodes i C#, men er ikke fremmed for å bruke DLLer hvis det skulle være nyttig.

 

Noen innspill?

Lenke til kommentar
Videoannonse
Annonse

Det å starte en ny tråd vil ikke i utgangspunktet gi noen effekt, men du er absolutt inne på noe helt annet og mere vesentlig, og det er CPU fordeling. Jeg husker ikke helt dette, men leste en gang på msdn om hvordan du kan tilordne en tråd til en annen cpu og da får du en mere ekte parallell kjøring. Bare å søke msdn på CPU så tenker jeg du finner både info og løsningsforslag.

Lenke til kommentar

Windows skal fordele tråder utover forskjellige prosessorer automatisk, men du kan også tilordne dem manuelt som kan i noen tilfeller lønne seg dersom trådene har veldig spesifikke oppgaver.

 

Uansett så kan flere tråder lønne seg, men det kommer helt an på hvordan du løser problemet.

Eksempelvis kan låsing hindre at flere tråder kan arbeide effektivt, men dersom problemet er tenkt godt nok ut, og løst på en tilfredsstillende måte, så vil du merke en ytelsesøkning (dersom maskinen har hyperthreading, flere kjerner eller flere prosessorer)

Lenke til kommentar
Windows skal fordele tråder utover forskjellige prosessorer automatisk, men du kan også tilordne dem manuelt som kan i noen tilfeller lønne seg dersom trådene har veldig spesifikke oppgaver.

 

Uansett så kan flere tråder lønne seg, men det kommer helt an på hvordan du løser problemet.

Eksempelvis kan låsing hindre at flere tråder kan arbeide effektivt, men dersom problemet er tenkt godt nok ut, og løst på en tilfredsstillende måte, så vil du merke en ytelsesøkning (dersom maskinen har hyperthreading, flere kjerner eller flere prosessorer)

 

Takker for gode tips.

Skal kode den flertrådsløsningen først men sjekker samtidig ut hvordan jeg kan tvinge trådene til å kjøre i hver sin kjerne.

Ser forresten at MS kommer med noe nytt mtp programmering for flere kjerner i VS 2010).

Lenke til kommentar

Hei.

 

Regner med du har brukt noen form for profiling slik at du vet akkurat hvor det butter? Sikker på at ikke harddisk er flaskehals etc? Kan du si litt mer om akkurat hvordan og hva du lager hash av, og hvordan disse lagres?

 

Ved første øyekast skulle en tro oppgaven din vil skalere greit med flere kjerner. Hver tråd kunne kjøre hver sin fil, evt må du splitte opp filene. Pass på at de blir plassert i minne i så fall, så en ikke må scanne opp og ned for hver tråd hvis filen er stor osv. På f.eks en quad-core vil du da kunne kjøre opptil 4x raskere, noe vil bli borte i arbeidsfordeling osv, og det avhenger også av hvor disse hashene skal.

Lenke til kommentar
Pass på at de blir plassert i minne i så fall, så en ikke må scanne opp og ned for hver tråd hvis filen er stor osv. På f.eks en quad-core vil du da kunne kjøre opptil 4x raskere, noe vil bli borte i arbeidsfordeling osv, og det avhenger også av hvor disse hashene skal.

 

Profiling? Testing?

I utgangspunktet har jeg bare timet det og sett at det tar veldig lang tid med store filer og kortere tid med mindre filer.

Tanken er å splitte opp filene mellom trådene og at de leser det de skal fra filen og lager hashkodene.

Når alle trådene er ferdige slås resultatet sammen og de skrives til disk.

Kan du utdype litt det jeg har satt i quote?

Lenke til kommentar

Hei igjen.

 

Før du begynner å optimalisere, er det lurt å kjøre en profiler på programmet. Da vil du få detaljert informasjon om hvor mye tid som brukes i hver funksjon. Det er som regel lite lurt å optimalisere før man bruker en profiler, fordi det ikke alltid er intuitivt akkurat hvor i programmet man skal starte, og ofte kan man "gå seg bort", optimaliserte programmer blir ofte mye mindre leselige og "rett fram" en vanlige programmer, dette kan bli et problem siden.

 

Det er visst en helt streit profiler i en av (de alt for mange forskjellige) utgavene av VS 2008, ellers finner du sikkert en på google osv.

 

Du må nesten foklare / vise oss framgangsmåten din i større detalj hvis jeg skal være mer konkret.

 

johan

Endret av Johan
Lenke til kommentar

Har lagd en versjon av funksjonen som tar filstørrelsen deler på en konstant og fordeler så arbeidet ut på X antall delegates.

Noe sånt int threads = (int)file.length / const int MaxClusterPerThread;

Har satt 10 tråder til max så dette står i en loop og sjekker at threads ikke overgår MaxThreads.

 

Ytelsen har gått betydelig opp og det kan sikkert optimaliseres enda mer.

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å
  • Hvem er aktive   0 medlemmer

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