Minimale GPUCalc Library (OpenGL)

Anwendungen, Tools, Userlibs und anderes nützliches.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Dann sind das schon zuviele Uniform Daten. Egal, Projekt ist vorbei, ich mach nichtsmehr so schnell. :cry:

Ich verstehs nicht wieso ich keine Motivation mehr habe.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Naja, früher oder später kommt eh OpenCL raus...
Das is dann im gegensatz zu CUDA auch für alle Grakas geeignet und sicher unproblematischer was die Verwendung angeht, wenns dann auchnoch so gut läuft wie CUDA wär das perfekt...
(\/) (°,,,°) (\/)
Norbie
Beiträge: 134
Registriert: 29.08.2004 12:45
Wohnort: Chemnitz
Kontaktdaten:

Beitrag von Norbie »

Das Konzept ist doch übelst geil, und so einfach! Mach weiter, such Motivation! Das wäre super für Neuronale Netze!
http://www.nevu.de/ Künstliche Intelligenz, die letzte Herausforderung!
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Norbie hat geschrieben:such Motivation!
Ich versuchs schon seit ein paar Jahren, vielleicht hauts ja jetzt irgendwann hin mit der Motivation, aber ich glaube eher nicht. :cry:
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Norbie
Beiträge: 134
Registriert: 29.08.2004 12:45
Wohnort: Chemnitz
Kontaktdaten:

Beitrag von Norbie »

?!? Bist du Depri? Hast du vor deine Lehrer zu töten? Lass dir helfen! Seelsorge Prister Freunde!

MfG!
http://www.nevu.de/ Künstliche Intelligenz, die letzte Herausforderung!
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Selber Link, neues Glück!

http://www.bradan.eu/files/gpuCalc.zip (Eventuell den Cache von eurem Browser vorher leeren)

Ist hier nun 10 mal schneller als meine CPU. Jetzt können maximal 64x64x3 = 12288 Floats als ein Datensatz übergeben werden und es können bis zu 4 Datensätze verwendet werden. Und pro Fragmentshaderdurchlauf werden nun 3 Datensatz-Floats berechnet.

Desweiteren kann man nun statt nur einer Formel einen ganzen Code einbinden. In diesem Code muss die Funktion vec3 calc(int startOffset) definiert sein. Der Parameter dieser Funktion sagt aus, welcher Indexwert des resultierenden Puffers der aktuell zu Berechnende ist.

Es gibt eine weitere Funktion: vec3 getData(int datasetIndex, int offset). Mithilfe dieser Funktion kann man 3 Werte aus einem Datensatz holen, wobei der Index des ersten Wertes offset ist. Der erste Parameter (datasetIndex) bestimmt den Datensatz durch einen Index zwischen 0 und 3.

Wenn ihr euren Code prüfen wollt, könnt ihr euch sowas wie GLSLValidate von 3DLabs runterladen. Jedoch musste ich vor geraumer Zeit feststellen, dass 3DLabs (Oder jetzt ziilabs?) das Programm nichtmehr anbietet. Aber wie ich sehe ist es noch im Internet (Sucht einfach nach GLSLValidate bei Google).

Ansonsten kann ich noch sagen, dass man das mit der einfachen Formel ganz leicht nachbilden kann wenn man das Type-Casting von GLSL nicht ganz versteht:

Code: Alles auswählen

dataA + dataB
wird zu

Code: Alles auswählen

vec3 calc(int startOffset) {
  vec3 result;
  vec3 dataA;
  vec3 dataB;
  dataA = getData(0, startOffset);
  dataB = getData(1, startOffset);
  
  // Und nun die Formel 3 mal einfügen (Weil ja 3 Floats gleichzeitig verarbeitet werden sollen):
  result.x = dataA.x + dataB.x;
  result.y = dataA.y + dataB.y;
  result.z = dataA.z + dataB.z;

  return result;
}
Hier hätte man nun schreiben können

Code: Alles auswählen

result = dataA + dataB;
das wäre dann effektiver gewesen. Aber wie gesagt, wenn ihr euch nicht mit GLSL auskennt ist das manchmal besser.

Das mit dem eigenen Code bringt halt den Vorteil, dass man mehr Möglichkeiten (Nicht nur in Sachen Optimierung) hat als mit einer so simplen Formel.

Ansonsten kann ich nur die Befehlsliste erneuern. Das mach ich im ersten Beitrag ;-) . Dauert allerdings eine Weile.

Ich hoffe euch gefällts so besser.

------------------------------------------------------------------------

@Norbie: Nein, aber ich brauch dringend Motivation.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

Initializing
Allocating some memory
Loading the dataset into the GPU
Binding the code
Calculating
Time needed for GPU Calculation (5000 times): 281ms
Dataset A: 0.000 0.100 0.200 0.300 0.400 0.500 [...]
Dataset B: 0.100 0.100 0.100 0.100 0.100 0.100 [...]
--------------------------------------------------------------------------------

Dataset R: 0.000 0.004 0.017 0.045 0.096 0.178 [...]


Time needed for CPU Calculation (5000 times): 3188ms
Dataset A: 0.000 0.100 0.200 0.300 0.400 0.500 [...]
Dataset B: 0.100 0.100 0.100 0.100 0.100 0.100 [...]
--------------------------------------------------------------------------------

Dataset R: 0.000 0.004 0.017 0.045 0.096 0.178 [...]

Both result-buffers are equal (Maximum tolerance between floats: 0.0000010000.
We must use this, because of different algorithms for square roots and power
of functions).

Press any key to release all data and to exit.
Schaut doch schon viel besser aus :allright:
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Sieht gut aus. :allright:
Allocating some memory
Loading the dataset into the GPU
Binding the code
Calculating
Time needed for GPU Calculation (5000 times): 1341ms
Dataset A: 0.000 0.100 0.200 0.300 0.400 0.500 [...]
Dataset B: 0.100 0.100 0.100 0.100 0.100 0.100 [...]
--------------------------------------------------------------------------------

Dataset R: 0.000 0.004 0.017 0.045 0.096 0.178 [...]


Time needed for CPU Calculation (5000 times): 6381ms
Dataset A: 0.000 0.100 0.200 0.300 0.400 0.500 [...]
Dataset B: 0.100 0.100 0.100 0.100 0.100 0.100 [...]
--------------------------------------------------------------------------------

Dataset R: 0.000 0.004 0.017 0.045 0.096 0.178 [...]

Both result-buffers are equal (Maximum tolerance between floats: 0.0000010000. W
e must use this, because of different algorithms for square roots and power of f
unctions).
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Was hat diese Fehlermeldung zu bedeuten?

Bild

War deine Example Exe
PC:
Radeon X1300
Win XP Pro SP3
(\/) (°,,,°) (\/)
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Euh Hardwareinkompatibilität. Von der Spezifikation her dürfte es keinerlei Probleme geben, aber es gibt Hardware, die weicht vom Standard ab (Speziell etwas ältere ATI hat bei GLSL Mängel). Ich werd mal schauen ob ich das mit Branching nicht umgehen kann.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten