» »

Mnozenje float stevil (C)

Mnozenje float stevil (C)

Nestea ::

Zivjo. Zanima me ali je prisotna in kako velika bi lahko bila zaokrozitvena napaka pri mnozenju dveh float stevil (v C-ju)? Ce zasede float 4B, torej bi moral tudi zmnozek dveh float stevil zasesti samo 4B ali sklepam napacno?

Imam nekaj 100.000 interakcij (v for zanki) v katerih racunam energijo in sile. Napaka se mi pojavi na peti stevilki koncnega rezultata. Recimo (simoblicno za ponazoritev):

Pravi rezultat: 1234567.890000
Moj rezultat: 1234987.234143

Sumim, da je pri toliko interakcijah napaka posledica zaokrozevanja. Ali se motim? Je mozno da bi bila napaka tako velika?

Isotropic ::

uporabi double precision, k mas take velike cifre. a to racunas kaksno mehaniko?

Vesoljc ::

Nestea je izjavil:

Zivjo. Zanima me ali je prisotna in kako velika bi lahko bila zaokrozitvena napaka pri mnozenju dveh float stevil (v C-ju)? Ce zasede float 4B, torej bi moral tudi zmnozek dveh float stevil zasesti samo 4B ali sklepam napacno?


float * float je se vedno float, torej ja, 4B

Nestea je izjavil:


Imam nekaj 100.000 interakcij (v for zanki) v katerih racunam energijo in sile. Napaka se mi pojavi na peti stevilki koncnega rezultata. Recimo (simoblicno za ponazoritev):

Pravi rezultat: 1234567.890000
Moj rezultat: 1234987.234143

Sumim, da je pri toliko interakcijah napaka posledica zaokrozevanja. Ali se motim? Je mozno da bi bila napaka tako velika?


ne samo da je mozno, ampak kar je :)
po mojih izkusnjah je float precizen do 5,6 decimalke/stevke... ko zacnes zadeve mnozit/delit, napaka hitro eskalira

probaj se double, razlike v hitrosti nekaj je, ampak to je posledica vecjega memory bandwidtha. ce je se to premalo, pa poguglaj za kak numericen lib ali kaj podobnega
Abnormal behavior of abnormal brain makes me normal...

Nestea ::

No se mi je kar zdelo. Delam v OpenCL in sem se zelel samo prepricati ker je kar nekaj telovadbe okoli doubla v OpenCL. :|

Senitel ::

Float je float, tudi double ti ne bo nič pomagal, če imaš problematične primere.
2000.0f + 0.0002f = ? :)
Pri množenju se mantisi zmnožita in eksponenta seštejeta. Za mantiso imaš pri floatu 24 bitov, pri double 53 bitov. Zgubiš pa vedno polovico manj pomembnih bitov.
Dejansko moraš preverit s kakšnimi številkami pričakuješ, da boš imel opravka na posamezni operaciji. Množenja so vredu, si pač deležen zaokroženja na najbližje predstavljivo število, seštevanja so zlobna.

Nestea ::

Z uporabo tipa long double na gostitelju (CPE) pridem do prakticno pravilnega rezultata, ki se razlikuje samo se na zadnji cifri pred vejico (pri tako veliki stevilki je decimalni del tako ali tako zanemarljiv).

Mogoce se vprasanje ce se kdo ukvarja kaj z OpenCL. Kako bi sedaj lahko na Linuxu prevedel "kernel.cl", torej kodo, ki se izvaja na graficni kartici. Za podporo double podatkovnega tipa moram namrec omogocit podporo (#pragma...), ki pa je g++ ali gcc ne spustita skozi, dokler sem uporabljal samo float ni bilo tezav z g++. CLCC prevajalnik je ocitno samo za Windows in Mac OS X.

Isotropic ::

kaksna skrivnost, kaj to delas? mehaniko (trke recimo) ali simulacijo atomov mogoce?

Senitel ::

Kaj a ti prevajaš "kernel.cl" trenutno kar z g++?

Nestea ::

Da. Sem še bolj nov v tem in do sedaj je delovalo v redu če sem prevedel z g++. Ali to ni v redu? No seveda, zataknilo se je sedaj s tem vključevanjem dvojne natančnosti. Čeprav mogoče sploh ne bo potrebna.

Senitel ::

To pol sploh ni OpenCL ampak navaden C/C++... OpenCL source prevedeš tako, da iz C/C++ pokličeš clCreateProgramWithSource oziroma clCreateProgramWithBinary, če si ga že prej prevedel. Kaj v tvojem primeru sploh naj bi bilo OpenCL?

Nestea ::

Sledil sem temu:

http://www.thebigblob.com/getting-start...

S to razliko da sem kernel in ostalo prilagodil za svoje potrebe. Ne vem od kje bi sicer prišla tako velika pohitritev kot je sedaj če bi bil preprost C program z eno nitjo.

Vesoljc ::

"Load the kernel source code (line 24-35) and compile it (line 71) (online exeuction) or load the precompiled binary OpenCL program (offline execution)"

za kaj si se odločil ti?
Abnormal behavior of abnormal brain makes me normal...

Senitel ::

Ok. Ampak zakaj spuščaš "kernel.cl" čez gcc/g++? Tega ne rabiš delat sploh.

Nestea ::

Jaz sem naložil kernel iz datoteke, torej fopen... (online torej) Potem pa se že od začetka motim ali? Torej prevajam samo del, ki se izvaja na CPE z gcc/g++ in poženem?

Edit: Očitno sem slabo prebral oz. sem že od začetka napačno razumel. Uporabil sem enake ukaze za prevajanje kot so ti na omenjeni strani. Torej prevajam samo ta "main" del. Nesporazum :)

Zgodovina sprememb…

  • spremenilo: Nestea ()

Senitel ::

Da! gcc/g++ ne pipata *.cl datotek. Odpreš file in daš njegovo vsebino clCreateProgramWithSource.

In sicer lahko dobiš binary kernela, ampak ni nujno prenosljiv med različnimi device-i! Lahko narediš "kernel cache" in z clGetProgramInfo shraniš binary za device, kjer to poganjaš. Ampak če se ti device zamenja, ni nujno da bo binary še delal. (To funkcijo kliče clcc)

Shinobi ::

Nestea: sej ne da se me bilo kaj tiče, ampak komu na čast je tako početje smotrno?
Dobro razno razni MMX, SSE in podobne jajce so vgrajene že v samo jedro, ker je
takšno optimiziranje smiselno, trajbat nek CUDA za vsaki floating point pa je enostavno nonsense.
Samo pomislimo, za vsako množenje s float, bi moral CPE iz registrov preko vodila spravit vrednosti na grafično kartico (katera more biti seznanjena in pripravljena na delo) in potem vrednosti vračati preko vodila na CPE. Za eno samcato množenje bi ti nametal nebroj kode, da pridobiš na preciznosti?

Če v Cju uporabljaš "float" namesto "double" potem gre definitivno ali za problem hitrosti ali pa prostora. Če teh problemov nimaš, je tvoje reševanje nesmiselno.

Resnično me zanima, čemu bi razumen človek počel kaj takšnega?

Isotropic ::

Imam nekaj 100.000 interakcij

verjetno zato + ucenje cuda.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

float vs decimal

Oddelek: Programiranje
365955 (4088) Looooooka
»

CUDA na splošno in zmogljivost

Oddelek: Programiranje
234044 (3096) pegasus
»

Grafična za GPGPU

Oddelek: Kaj kupiti
194691 (4185) morbo
»

ATI razposlal že 11 milijonov DirectX 11 čipov

Oddelek: Novice / Apple iPhone/iPad/iPod
3411415 (9828) Senitel
»

Larrabee s približno 1,7 milijarde tranzistorjev

Oddelek: Novice / Procesorji
394955 (3572) PrimozR

Več podobnih tem