GPUCalc ist eine Bibliothek mit einfachen Funktionen um 2 Float-Datensätze auf der Grafikkarte mit einander zu verrechnen. Dabei müssen die Datensätze eine konstante Größe haben, die im Vorraus festgelegt wird.
Beispielszenario:
- Code: "vec3 calc(int startOffset) { return getData(0, startOffset) + getData(1, startOffset); }"
- Daten-Anzahl: 3
- Datensatz A: 0.5, 0.6, 0.7
- Datensatz B: 1.5, 1.6, 1.7
0.5 + 1.5 = 2.0
0.6 + 1.6 = 2.2
0.7 + 1.7 = 2.4
Datensatz Resultat (Abgekürzt R): 2.0, 2.2, 2.4
Da das ganze auf OpenGL und GLSL basiert braucht ihr natürlich neue Grafikkartentreiber und eine Grafikkarte mit OpenGL ~2.0 Support (Schätze ich - ich hab jetzt nicht alles nachgeprüft).
Es ist mehr ein Experiment als ein nützliches Projekt.
Download
Hier auf meinem PC ist es schneller auf der Grafikkarte als auf dem CPU (Könnte man zwar sicher noch so optimieren, dass es auf der CPU schneller ist, aber das ist mir erstmal egal, weil es ja nur ein Experiment war), aber es gibt sicher viele Systeme, bei denen das nicht der Fall ist (Low-End Grafikkarten und AGP Nutzer evtl.) weil die Implementierung und das Beispiel nicht die/das beste ist.
Je Größer der Datensatz oder je komplexer die Formel ist, desto schneller ist es auf der Grafikkarte, allerdings ist er momentan auf wenige Daten eingeschränkt, da ich Uniform Variablen anstelle von Texturen für die Übertragung nutze.
Achja und noch ein Vorteil: Man kann dadurch eine Eval-Funktion realisieren, bei der man sicher sein kann, dass sie geht

Hier noch eine Funktionsliste für die Formel:
http://wiki.delphigl.com/index.php/Tuto ... Funktionen
Und hier eine kleine Befehlsreferenz für die DLL:
Code: Alles auswählen
-------------------------------------------------
InitGPUCalculations()
Desc.: Initializes everything to have access
to the GPU
Returns: 0 if it fails, otherwise 1.
-------------------------------------------------
BindCodeGPUFloat32(Code.s)
Desc.: Creates a new shadercontext with the
specified code.
Returns: 0 if it fails, otherwise 1.
-------------------------------------------------
CalculateDatasetGPUFloat32(*DatasetResult)
Desc.: Calculates new float values with the
bound code and the datasets which are
loaded into the gpu.
Returns: 0 if it fails, otherwise 1.
-------------------------------------------------
UnbindCodeGPU()
Desc.: Releases the last shadercontext, which
was bound before.
-------------------------------------------------
ReleaseGPUCalculations()
Desc.: Releases the GPU access.
-------------------------------------------------
GetLastGPUCalculationsError()
Desc.: Returns the last error as pointer to a
String.
Returns: Pointer to a zero terminated string,
containing the error message (or empty
if there was no error).
-------------------------------------------------
AllocateGPUDatasetMemory()
Desc.: Allocates a memory block of 64x64x3 B.
It will ensure, that this block has
always this size (Its important).
Returns: Pointer to the memory block.
-------------------------------------------------
ReleaseGPUDatasetMemory(*Dataset)
Desc.: Releases the memory block which was
allocated with AllocateGPUDatasetMemory
-------------------------------------------------
SetDatasetGPUFloat32(Index.l, *Dataset)
Desc.: Loads the dataset into the GPU.
The dataset has to be allocated (with
AllocateGPUDatasetMemory) and filled
with data before.
-------------------------------------------------
Viel spaß damit.
