openGL teljesítmény

Sziasztok!

Írtam egy nagyon egyszerű tesztprogramot, ami az OpenGL négyzetrajzoló teljesítményét méri, különös tekintettel a kitöltött pixelek összesített számára.

A program futásakor nem is annyira a konkrét FPS teljesítmény lepett meg, mint az, hogy annak ellenére, hogy a munka oroszlánrészét a GPU végzi, a CPU-t is 100%-on hajtja a program (mivel egyszálú a programom, természetesen csak az egyik magot).

Mivel külön video-kártyám van, nem integrált, azt gondolnám hogy a téglalap kitöltések ideje alatt a CPU-nak idle-ben kéne lenni, illetve egyéb processzeket futtathatna.

Van ötletetek, hogy mi miatt nem tud a CPU mással foglalkozni mialatt a GPU képet renderel?

A szoftverkörnyezetem: Ubuntu 9.10 alap Gnome desktoppal, hivatalos NVidia driverrel az Ubuntu repo-ból.
Hardver: GeForce 9400 GT, VBIOS version: 62.94.71.00.13, Memory: 512 MB, Bus Type: PCI Express 16x

Compiz ki és bekapcsolástól nem függ a CPU terhelés.

A tesztprogram itt található: http://pastebin.com/f41c561e7

(freeglut3-dev csomagot kell telepíteni Ubuntun, hogy forduljon és futtatható legyen. Ezzel a paranccsal fordul: gcc -lglut manySquareSimple.c)

Hozzászólások

Természetesen a glutMainLoop okozza, hiszen az egy végtelen ciklus. Az tény, hogy a rajzolást a GPU végzi, de attól még a program vezérlését a CPU csinálja végig.

Valóban az a probléma a programmal, hogy valahol végtelen ciklusban vár a GPU-ra. Csak az nem világos, hogy hol teszi ezt.

A glutIdleFunc ugye elvileg végtelen ciklusban fut, viszont a glutSwapBuffers sorban azt gondoltam volna, hogy úgy várja meg a videokártyát, hogy közben a szálat wait-re teszi.

Kicsit átírtam a programot úgy, hogy fix 100 FPS-en fusson és egy időzítő kérje az újrarajzolást. Ezzel a módszerrel el lehetett érni, hogy valóban 0% körül használja az OpenGL-es programom a CPU-t, azaz csak a GPU dolgozik.

Azonban itt egy új "érdekesség" jelent meg. Ha be van kapcsolva a Compiz, akkor továbbra is 100%-ot "eszik" a processzem (kikapcsolt Compiz-zal viszont hozza az elvárt 0-1%-ot :-).

Erre a problémára van esetleg ötletetek?

A javított forrás:
http://pastebin.com/f7029ac1b

FIXME
idle loop: ami a csövön kifér. ezek szerint a processzor a szűk keresztmetszet. ha nem pörögne a proci 100%-on, akkor gyengébb videokártya lenne a gépben, mint amit a CPU "ki tudna hajtani".

Kb 100 FPS-t visz a videokártya az adott tesztprogramból. Ez azt jelenti, hogy a processzor egy másodperc alatt 100000 négyzet kirajzolását indítja el. Ezzel biztosan nem "hajtom ki". Az biztos, hogy valamikor úgy vár a CPU a GPU-ra, hogy közben foglalt, tehát végtelen ciklusban, vagy egyéb módon lockolva.

A kérdés az, hogy hol, és még inkább hogy hogy lehetne elkerülni ezt.