[C++] Berekeningen via GPU

Pagina: 1
Acties:

  • Iska
  • Registratie: November 2005
  • Laatst online: 24-08 21:44

Iska

In case of fire, use stairs!

Topicstarter
Hey Allemaal,

Voor mijn opleiding moet ik zo nu en dan grote berekeningen uitvoeren. Dit gaat nu via Maple, maar dat duurt erg lang omdat dat alleen de CPU gebruikt. Nu vroeg ik mij dus 2 dingen af:
- Hoe kan ik getallen met meer dan 10 miljoen getallen opslaan/voor berekeningen gebruiken (een variable met 3.32*10^7 bytes zou voldoen)
- Is er een makkelijke en gratis manier om berekeningen via de GPU te laten ipv de CPU (2 4850's doen het toch een stuk sneller dan mijn CPU'tje)

-- All science is either physics or stamp collecting


  • keejoz
  • Registratie: November 2008
  • Laatst online: 28-08 15:53
ATI Stream? ofzoiets.. Ik weet niet hoe het werkt maar ik weet dat het zo noemt :D

  • Iska
  • Registratie: November 2005
  • Laatst online: 24-08 21:44

Iska

In case of fire, use stairs!

Topicstarter
keejoz schreef op donderdag 18 december 2008 @ 19:54:
ATI Stream? ofzoiets.. Ik weet niet hoe het werkt maar ik weet dat het zo noemt :D
Awesome :D, nu alleen nog de grote getallen

-- All science is either physics or stamp collecting


  • bobo1on1
  • Registratie: Juli 2001
  • Laatst online: 18-05 17:57
Is de precisie erg van belang? Met een long double kom je namelijk al een heel eind.

Ik snap ook niet helemaal wat je bedoelt met "een getal met meer dan 10 miljoen getallen".

[ Voor 61% gewijzigd door bobo1on1 op 18-12-2008 20:25 ]

Impedance, a measure of opposition to time-varying electric current in an electric circuit.
Not to be confused with impotence.


  • Depress
  • Registratie: Mei 2005
  • Laatst online: 22-09 21:34
bobo1on1 schreef op donderdag 18 december 2008 @ 20:23:
Is de precisie erg van belang? Met een long double kom je namelijk al een heel eind.
Elke berekening wil je toch met de groots mogelijke presiezie doen. En volgens mij komt een long double net niet ver genoeg. En gewoon stukken weg laten lijkt me geen strak plan.

  • LeonM
  • Registratie: Oktober 2001
  • Laatst online: 26-08 08:22
Heb je al een ati kaart? Zo niet, kun je ook eens kijken naar Nvidia's cuda

  • soulrider
  • Registratie: April 2005
  • Laatst online: 27-11-2017
genoeg info vindbaar als je zoekt naar bigint enzo

wat heb je trouwens zelf al gezocht?
want rekenen via je gpu is vrij vindbaar hoor (cuda, stream, gpgpu, ...)
en rekenen in c/c++ met grote cijfers (big-int, big-float, long double, ...) is ook ruim vindbaar via google.
Meestal wel met de voorwaarde dat je op een 64-bits systeem en OS zit.

'bigint c++' geeft me al serieus veel hits op google, allemaal met classes en opensource
handig om te lezen: http://stackoverflow.com/...to-implement-big-int-in-c
staan genoeg hints hoe je het zou kunnen doen, met ook wat code en waar rekening mee te houden ev.

en als je de 2 samen wilt zal je zelf een combinatie moeten maken, vrees ik.

[ Voor 35% gewijzigd door soulrider op 18-12-2008 21:01 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Depress schreef op donderdag 18 december 2008 @ 20:26:
[...]
Elke berekening wil je toch met de groots mogelijke presiezie doen. En volgens mij komt een long double net niet ver genoeg. En gewoon stukken weg laten lijkt me geen strak plan.
Elke berekening wil je doen met de precisie die nodig is voor je beoogde resultaat. Als je wil weten hoeveel centimeter beton je moet storten voor je brug, dan is het antwoord zeker niet 9,51 centimeter - 2 cijfers zijn meer dan genoeg.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Oguz286
  • Registratie: Juni 2002
  • Laatst online: 23-02 10:10
Jasper91 schreef op donderdag 18 december 2008 @ 19:50:
Hey Allemaal,

Voor mijn opleiding moet ik zo nu en dan grote berekeningen uitvoeren. Dit gaat nu via Maple, maar dat duurt erg lang omdat dat alleen de CPU gebruikt. Nu vroeg ik mij dus 2 dingen af:
- Hoe kan ik getallen met meer dan 10 miljoen getallen opslaan/voor berekeningen gebruiken (een variable met 3.32*10^7 bytes zou voldoen)
- Is er een makkelijke en gratis manier om berekeningen via de GPU te laten ipv de CPU (2 4850's doen het toch een stuk sneller dan mijn CPU'tje)
Als je wat beter had gezocht had je Ati's Stream, nVidia's Cuda, gpgpu e.d. kunnen vinden. Als de berekeningen die je op die getallen wil doen te parallelliseren zijn, dan kan je erg veel performancewinst verwachten als je het goed kan implementeren, anders zou ik toch eerder kijken naar de andere suggesties die de anderen hebben gegeven zoals o.a. BigInt.

  • soulrider
  • Registratie: April 2005
  • Laatst online: 27-11-2017
MSalters schreef op donderdag 18 december 2008 @ 20:37:
[...]

Elke berekening wil je doen met de precisie die nodig is voor je beoogde resultaat. Als je wil weten hoeveel centimeter beton je moet storten voor je brug, dan is het antwoord zeker niet 9,51 centimeter - 2 cijfers zijn meer dan genoeg.
als je met duizenden centimeters zit en achteraf het aantal kubieke centimers wilt weten, is je 2cijfers precisie niet meer voldoende hoor ;) (bv lengte x breedte x dikte brug) maar ja, vaak reken je daar uiteindelijk in kubiek meter ...
(maar dan is het inderdaad: denk na welke precisie je wilt, en met welke precisie je dus gaat moeten beginnen)

Acties:
  • 0 Henk 'm!

  • BCC
  • Registratie: Juli 2000
  • Laatst online: 21:55

BCC

Precisie of siginificantie achteraf toevoegen is inderdaad onmogelijk :).

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Jasper91 schreef op donderdag 18 december 2008 @ 19:50:
- Hoe kan ik getallen met meer dan 10 miljoen getallen
Een getal met 10 miljoen cijfers bedoel je neem ik aan?
opslaan/voor berekeningen gebruiken (een variable met 3.32*10^7 bytes zou voldoen)
Een byte is basis 256, een cijfer is basis 10. Feitelijk heb je dus maar 10.000.000 * 256log 10 =~ 4.1MB per getal nodig.
Is er een makkelijke en gratis manier om berekeningen via de GPU te laten ipv de CPU (2 4850's doen het toch een stuk sneller dan mijn CPU'tje)
Hebben ze genoeg mem? Want 4.1MB per variabele is niet niets, en ik vraag me af hoe snel dat blijft als je de data continu over de PCI-e bus moet transferen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 25-09 07:39
* sluit zich aan bij .oisyn

Het cache van je CPU is +- 60GB per seconde...
Is nogal een verschil met de paar Gb per seconde die een PCIe bus aankan...
Dus tenzij je parallel aan je CPU een hoop kan doen is het niet rendabel.
En ik weet niet of assembly een optie is, maar dat lijkt me sneller met rekekenen... (minder overhead)
Niet dat ik een assembly programmeur ben, maar daar zou ik het zoeken ;)

Even niets...


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nou ja het hangt een beetje van de aantallen af. Als ie genoeg mem heeft om het meerendeel van de (lokale) variabelen in op te slaan dan kan dat best rap met een GPU.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • soulrider
  • Registratie: April 2005
  • Laatst online: 27-11-2017
met die grootte van getallen (4MB) moet je niet kijken naar de snelheid van je cache, want daar past het niet eens volledig in - mss 2 getallen bij de cpu met grootste cache beschikbaar voor de gewone persoon.
(je verliest dus altijd klok-cycli bij overpompen data en dat doe je te vaak - full speek cache 1 is 32 of 64k - om 1 zulk getal door de cpu te laten gaan heb je dus al 125x toegang tot je cache2/3 nodig en als het daar niet inzit tot je geheugen)

maar dan moet je kijken naar de snelheid van RAM naar CPU en terug
en dat is voor ddr2-800MHz bv: 6,3 Gb/s

pci-e 16x-bus: 4 GB/s (250 MB/s x 16)

videokaart zelve: 't geheugen van een 4850 kan 63,6GB/s versjouwen.

maw: als de gegevens niet te vaak over die bus moeten dan haal je serieus veel winst mbv gpu-rekenen
ook al omdat het volledige geheugen daar met grotere snelheid data kunnen versjouwen. (10-voud van je gewone RAM) wat dan weer handig is als je vaak verder moet rekenen met dezelfde gegevens

Moet je ook hier echter vaak data van gpu naar RAM heen-en-weer sturen dan verlies je erop.

't beste is natuurlijk een test-case te maken (of te zoeken)
alles is afh. van hoe parallel je je berekeningen kunt maken, hoe groot de getallen echt moeten zijn, en hoe vaak je verder rekenend met het resultaat van een bewerking (hoe vaker hoe langer het in dat geheugen kan blijven) en/of alles vrij goed in het geheugen past van cpu en/of gpu.
(ev. zelfs opsplitsen een deel op cpu, en een deel op gpu)

in het andere geval: je kan er ook een 'distributed computing'-projectje van maken eh
en de andere pc's in huis bij gebruiken voor zo'n dingen ;)

[ Voor 10% gewijzigd door soulrider op 19-12-2008 01:17 ]


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Dat soort grote getallen optellen en vermenigvuldigen is allemaal linear (na een FFT) en parallelliseerd geweldig. Ik weet nu al dat dit VEEL sneller gaat op een GPU. Ik denk dat je speed-ups van 30 a 40x kan verwachten.

Matlab kan het geloof ik, maar is uiteraard niet gratis...

[ Voor 12% gewijzigd door Zoijar op 19-12-2008 12:58 ]

Pagina: 1