Techster Skrevet 27. august 2009 Del Skrevet 27. august 2009 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
HDSoftware Skrevet 27. august 2009 Del Skrevet 27. august 2009 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
GeirGrusom Skrevet 27. august 2009 Del Skrevet 27. august 2009 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
Techster Skrevet 28. august 2009 Forfatter Del Skrevet 28. august 2009 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
Techster Skrevet 29. august 2009 Forfatter Del Skrevet 29. august 2009 Har vært i kontakt med en utvikler i microsoft ang. hvordan tråder kjører på en maksin med flere kjerner, og han sier bekrefter at tråder blir kjørt paralellt på systemer hvor dette er mulig. Lenke til kommentar
Johan Skrevet 30. august 2009 Del Skrevet 30. august 2009 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
Techster Skrevet 30. august 2009 Forfatter Del Skrevet 30. august 2009 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
Johan Skrevet 30. august 2009 Del Skrevet 30. august 2009 (endret) 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 30. august 2009 av Johan Lenke til kommentar
Techster Skrevet 31. august 2009 Forfatter Del Skrevet 31. august 2009 Litt mer spesifikt: Programmet leser 2048 bytes fra en fil, lager en hash av dette og legger til hashen i en liste. Dette gjentas til hele filen er lest og det er lagd hashkoder av alle delene. Hashkodene skrives så til en fil. Lenke til kommentar
Techster Skrevet 3. september 2009 Forfatter Del Skrevet 3. september 2009 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
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å