2017-12-26 8 views
0

Ich bin sehr neu in Metal Computing und versuche, meine Gedanken um die Konzepte von Threads und Gruppen zu wickeln. Das Problem ist, dass die meisten, wenn nicht alle Beispiele, eine 2D-Textur als Beispiel verwenden, was absolut nicht das ist, was ich versuche zu tun. Ich versuche, eine Rechenfunktion zu erstellen, die in einem Puffer in 2 Punkten und ein paar Schwimmer nimmt und berechnet 4 Punkte und legt sie in einem anderen Puffer so:Wie bestimmt man die Thread-Gruppe und die Thread-Größe, die ich für Metal Vertex Compute verwenden sollte

|--------Buffer1------|  |-------Buffer2-----------| 
f(point1, point2, [floats])=point1, point2, point3, point4 
f is a function essentially involving some linear algebra with some multiplication 
and addition. The most costly part being a sqrt operation used to normalize 
the vector between point1 and point2. No branches in code. 

Ich weiß ungefähr, wie die Kernel-Funktion zu schreiben, aber ich Ich habe keine Ahnung, wie man ihm Threads und Thread-Gruppen zuweist, weil ich nicht weiß, wie man eine potentiell optimale Menge für dieses Szenario berechnet.

+0

Meistens müssen Sie sich nicht um Thread-Gruppen kümmern. Verwenden Sie einfach den Algorithmus, den Apple im Artikel [Berechnen von Threadgroup- und Grid-Größen] (https://developer.apple.com/documentation/metal/compute_processing/calculating_threadgroup_and_grid_sizes) anzeigt. Für den Fall, dass Sie einen 1D-Puffer verarbeiten müssen, betrachten Sie die "texture.height" aus den Beispielen als 1. –

Antwort

0

Sie können Threads und Threadgroups beliebig zuweisen, d. H. Sie auf die für Ihre Logik sinnvollste Weise verwenden.

Herauszufinden, was die beste Anzahl von Threads und Gruppen ist, kann ein bisschen Versuch und Irrtum sein. Aber ein guter Ausgangspunkt ist die Verwendung eines Threads für jedes einzelne Ding, das Sie berechnen möchten.

In Ihrem Fall scheint ein Thread für jeden f(point1, point2, [floats]) vernünftig (so dass ein Thread vier Punkte zum Ausgabepuffer schreiben wird). Aber du warst nicht sehr genau über deine Funktion f(), also macht vielleicht eine andere Art der Zuweisung von Threads mehr Sinn. Ich habe nicht genug Informationen, um eine gute Empfehlung abzugeben.

(Hinweis: Dort ist ein Limit, wie viele Threads Sie in einer einzigen Gruppe verwenden können. Das hängt vom Gerät. Wenn Sie also mehr Threads benötigen, müssen Sie sie in mehrere Gruppen aufteilen.)

Verwandte Themen