Ich habe eine MTLTexture
enthält 16bit vorzeichenlose Ganzzahlen (MTLPixelFormatR16Uint
). Die Werte reichen von etwa 7000 bis 20000, wobei 0 als "nodata" -Wert verwendet wird, weshalb sie im folgenden Code übersprungen wird. Ich möchte die minimalen und maximalen Werte finden, damit ich diese Werte zwischen 0 und 255 skalieren kann. Letztendlich werde ich versuchen, die Minimal- und Maximalwerte auf einem Histogramm der Daten zu basieren (es hat einige Ausreißer), aber im Moment bleibe ich dran, einfach die Min/Max-Werte zu extrahieren.Den minimalen und maximalen Wert innerhalb einer Metall Textur finden
Ich kann die Daten von der GPU zur CPU lesen und die Min/Max-Werte herausziehen, würde aber diese Aufgabe lieber auf der GPU durchführen.
Erster Versuch
Der Befehlsgeber mit 16x16 Fäden pro Thread-Gruppe versandt wird, wird die Anzahl der Fadengruppen auf der Grundlage der Texturgröße (zB; width = textureWidth/16, Höhe = textureHeight/16).
Daraus erhalte ich einen minimalen und maximalen Wert, aber für den gleichen Datensatz geben Min und Max oft unterschiedliche Werte zurück. Ziemlich sicher, das ist die Min und Max von einem einzelnen Thread, wenn mehrere Threads ausgeführt werden.
Zweiter Versuch
Aufbauend auf dem vorherigen Versuch, dieses Mal habe ich von jedem Thread die einzelnen Min-/Max-Werte bin speichern, werden alle 256 (16x16).
Dies gibt ein Array mit 256 Min/Max-Werten zurück. Von diesen könnte ich den niedrigsten der Mindestwerte finden, aber das scheint ein schlechter Ansatz zu sein. Würde einen Zeiger in die richtige Richtung schätzen, danke!
Danke @warrenm, scheint zu arbeiten. Ich habe eine Frage über den Offset für den atomaren Puffer; zB 'atomicBuffer + ((tgpig [1] * tpt [0] + tgpig [0]) * 2)'. Mein Verständnis ist, dass atomare Operationen pro Threadgruppe gelten (bitte korrigieren Sie eine dieser Annahmen, wenn Sie falsches BTW verwenden)? Ich verwende 16x16 Threads nach Thread-Gruppe, die über die 'threads_per_threadgroup' Annotation an die' tpt'-Variable in den Kernel gelangt sind. Ich bin mir nicht sicher, ob das die Breite meines Fadengruppenrasters ist. z.B; Texturgröße ist 192x160, mit threadgroup Gitter 12x10, und die Versetzung calc 'atomicBuffer + ((tgpig [1] * 12 + tgpig [0]) * 2) '? – lock
Bitte entschuldigen Sie die hardcoded 12 in der letzten Zeile. Ich denke, was ich versuche zu sagen, ist das Ersetzen von 'threads_per_threadgroup' durch' threadgroups_per_grid' im min_max_per_threadgroup Kernel behebt es? – lock
@lock Ja, du hast absolut recht. Ich hatte Glück in meiner Implementierung, weil 'threads_per_threadgroup' gleich' threadgroups_per_grid' war. Korrigiert oben. – warrenm