Sortieren der inversen Konnektivität
In #55 (closed) wurde die inverse Konnektivität berechnet um das scattern auf dem device zu ermöglichen. Dabei bestand das Problem daß die Anzahl der Elemente, die an einem Vertex hängt von Vertex zu Vertex verschieden ist. Dies führt dazu das ein Teil der Threads eines Thread-Blocks weniger zu tun hat als andere Teile, und damit rum-idled.
Die verfügbaren threads sollten sich besser ausnutzen lassen indem man die Vertices nach der anzahl der an ihnen hängenden Elemente sortiert. Als proof-of-concept kann man dazu erstmal ein reorder
array anlegen und auf das Device hochladen:
// The index of the vertex a thread works on is reorder[global_id]
int reorder[num_vertices];
Wenn das funktioniert kann man diese umnummerierung auf alle vertex-basierten daten anwenden, die vom/zum devicetransferiert werden (und dann braucht reoder
selber nicht mehr hochgeladen zu werden). I.e. z
, w
und die vertex-koordinaten und die konnektivitäts-information des gitters werden vor dem hochladen durch reorder
umsortiert, und die Ergebnisdaten nach dem runterladen.
TODO:
-
reorder
auf dem host ausrechnen, hochladen, und im scatter-kernel (aus #55 (closed)) benutzen -
reorder
schon auf dem host auf alle zum/vom device transferierten daten anwenden -
Benchmarken
Depends: #55 (closed)