Hoi,
Ik had een tijd terug een stukje code gepost, elders op het forum: Mijn voorlopige bevindingen over multicore-processing
De bedoeling was in eerste instantie om vooral een beetje te kijken hoe verschillende CPUs en systemen omgingen met multithreading en 32/64-bit code.
Nou had ik in eerste instantie wat problemen met de 64-bit versie. Er werd een recursieve functie aangeroepen met aardig wat argumenten. Omdat ieder argument in 64-bit mode meteen ook 64-bit is, op de stack, hakte dit er aardig in qua bandbreedte, en was de 64-bit versie een stuk trager dan de 32-bit versie.
Beetje onverwacht, maar achteraf gezien best logisch... Toen ben ik de hele code nog maar eens zorgvuldig nagelopen, en heb ik overal zo veel mogelijk geprobeerd 'bits eraf te schaven'.
Dat wierp z'n vruchten af, want op m'n Core2 Duo was de 64-bit versie nu een stukkie sneller dan de 32-bit versie. Da's mooi meegenomen. Op een Pentium D schoot de 64-bit versie helemaal vooruit nu.
Maargoed, er kwamen maar geen mensen met Athlon64/Opteron resultaten in 64-bit... Ik voelde de bui toen al een beetje hangen.
Inmiddels hebben twee mensen met AMD-systemen in 64-bit getest, en inderdaad... De 64-bit versie is gewoon nog steeds trager daar.
Dus mijn vraag is eigenlijk heel simpel: Hoe kan dat nou?
Aangezien het zowel met 1 als met 2 threads gebeurt, lijkt me niet dat het geheugen het probleem is. Het moet haast wel iets zijn binnen de core zelf.
Nou kan ik 2 dingen bedenken:
1) De 32-bit versie drukt de cache al tot het uiterste... In 64-bit modus heb je toch *net* wat meer nodig, omdat bepaalde pointers, stack etc toch 64-bit moeten zijn ipv 32-bit... Dingen die ik eigenlijk niet in de hand heb... Dus gaat de snelheid wat omlaag... hoewel er misschien toch meer rekenkracht is in 64-bit.
2) De 64-bit instructies zijn wat groter en lastiger te decoderen, en misschien struikelt de decoder van de Athlon daar een beetje over, waardoor je net wat minder instructies per seconde kunt verwerken.
Maargoed, als dit het geval zou zijn, heb ik dat niet in de hand, dan perst de code gewoon het uiterste uit de CPU, en moet je het daar mee doen.
Aan de code ligt het niet echt, lijkt me... want de Intels halen wel winst. En het is bekend dat hun caches groter en sneller zijn, vandaar dat ik denk dat dat ermee te maken heeft... Zeker in het geval van de Pentium D, wat niet echt een wonder is qua IPC, en nogal berucht is omdat 64-bit er achteraf maar een beetje opgeplakt is.
Heeft iemand nog andere ideeen, of eigen ervaring met problemen in 64-bit? Specifiek op Athlon misschien?
Het zou mooi zijn als ik de Athlon op de een of andere manier toch sneller zou kunnen krijgen... maar ik heb nu geen idee waar ik zou moeten beginnen... Alles wat ik kon bedenken, had ik al gedaan.
Het is overigens gecompileerd met Microsoft Visual Studio.NET 2005. Misschien eens andere compilerflags gebruiken? Maar welke?
Ik had een tijd terug een stukje code gepost, elders op het forum: Mijn voorlopige bevindingen over multicore-processing
De bedoeling was in eerste instantie om vooral een beetje te kijken hoe verschillende CPUs en systemen omgingen met multithreading en 32/64-bit code.
Nou had ik in eerste instantie wat problemen met de 64-bit versie. Er werd een recursieve functie aangeroepen met aardig wat argumenten. Omdat ieder argument in 64-bit mode meteen ook 64-bit is, op de stack, hakte dit er aardig in qua bandbreedte, en was de 64-bit versie een stuk trager dan de 32-bit versie.
Beetje onverwacht, maar achteraf gezien best logisch... Toen ben ik de hele code nog maar eens zorgvuldig nagelopen, en heb ik overal zo veel mogelijk geprobeerd 'bits eraf te schaven'.
Dat wierp z'n vruchten af, want op m'n Core2 Duo was de 64-bit versie nu een stukkie sneller dan de 32-bit versie. Da's mooi meegenomen. Op een Pentium D schoot de 64-bit versie helemaal vooruit nu.
Maargoed, er kwamen maar geen mensen met Athlon64/Opteron resultaten in 64-bit... Ik voelde de bui toen al een beetje hangen.
Inmiddels hebben twee mensen met AMD-systemen in 64-bit getest, en inderdaad... De 64-bit versie is gewoon nog steeds trager daar.
Dus mijn vraag is eigenlijk heel simpel: Hoe kan dat nou?
Aangezien het zowel met 1 als met 2 threads gebeurt, lijkt me niet dat het geheugen het probleem is. Het moet haast wel iets zijn binnen de core zelf.
Nou kan ik 2 dingen bedenken:
1) De 32-bit versie drukt de cache al tot het uiterste... In 64-bit modus heb je toch *net* wat meer nodig, omdat bepaalde pointers, stack etc toch 64-bit moeten zijn ipv 32-bit... Dingen die ik eigenlijk niet in de hand heb... Dus gaat de snelheid wat omlaag... hoewel er misschien toch meer rekenkracht is in 64-bit.
2) De 64-bit instructies zijn wat groter en lastiger te decoderen, en misschien struikelt de decoder van de Athlon daar een beetje over, waardoor je net wat minder instructies per seconde kunt verwerken.
Maargoed, als dit het geval zou zijn, heb ik dat niet in de hand, dan perst de code gewoon het uiterste uit de CPU, en moet je het daar mee doen.
Aan de code ligt het niet echt, lijkt me... want de Intels halen wel winst. En het is bekend dat hun caches groter en sneller zijn, vandaar dat ik denk dat dat ermee te maken heeft... Zeker in het geval van de Pentium D, wat niet echt een wonder is qua IPC, en nogal berucht is omdat 64-bit er achteraf maar een beetje opgeplakt is.
Heeft iemand nog andere ideeen, of eigen ervaring met problemen in 64-bit? Specifiek op Athlon misschien?
Het zou mooi zijn als ik de Athlon op de een of andere manier toch sneller zou kunnen krijgen... maar ik heb nu geen idee waar ik zou moeten beginnen... Alles wat ik kon bedenken, had ik al gedaan.
Het is overigens gecompileerd met Microsoft Visual Studio.NET 2005. Misschien eens andere compilerflags gebruiken? Maar welke?