Seite 2 von 3

Verfasst: 11.03.2009 17:53
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.

Verfasst: 11.03.2009 18:43
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...

Verfasst: 11.03.2009 19:36
von Norbie
Das Konzept ist doch übelst geil, und so einfach! Mach weiter, such Motivation! Das wäre super für Neuronale Netze!

Verfasst: 11.03.2009 20:30
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:

Verfasst: 11.03.2009 22:00
von Norbie
?!? Bist du Depri? Hast du vor deine Lehrer zu töten? Lass dir helfen! Seelsorge Prister Freunde!

MfG!

Verfasst: 12.03.2009 16:18
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.

Verfasst: 12.03.2009 16:22
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:

Verfasst: 12.03.2009 17:01
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).

Verfasst: 12.03.2009 18:45
von KeyKon
Was hat diese Fehlermeldung zu bedeuten?

Bild

War deine Example Exe
PC:
Radeon X1300
Win XP Pro SP3

Verfasst: 12.03.2009 18:58
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.