Scattern der Ergebnisse auf dem Device in seperatem Kerneldurchlauf
Hier sollen die ergebnisse wie in #47 (closed) erstmal elementweise in einem großen array gesammelt werden. Das zusammenfassen in vertex-weise daten soll dann aber nicht sequentiell auf dem host passieren, sondern schon auf dem device in einem 2. Kernelaufruf.
Dafür wird die inverse Information des Konnektivitäts-Arrays benötigt: welche elemente hängen an einem gegebenen vertex, und wie ist der lokale index des vertex innerhalb des elements. Da die anzahl der Elemente, die an einem Vertex hängen variabel ist, reicht ein einfaches array nicht mehr aus. Kompakt ließe sich die inverse Information folgendermaßen speichern:
// offsets[v] is the index into the other arrays for vertex v
// offsets[v+1] - offsets[v] is the number of elements attached to vertex v
// (which is the reason für the +1 below)
int offsets[num_vertices+1];
// elem_indices[offsets[v] + i] is the index of the i'th element attached to vertex v
int elem_indices[num_elems*corners_per_elem];
// index_in_elem[offsets[v] + i] is the local indes of v inside the element with index e,
// where e = elem_indices[offsets[v] + i]
int index_in_elem[num_elems*corners_per_elem];
Da diese information für ein gegebenes Gitter nur einmal hergerechnet werden muß, bietet es sich an das auf dem Host zu tun und das Ergebnis dann hochzuladen.
Im einzelnen ist folgendes zu tun
-
berechnen der inversen Konnektivität -
hochladen der inversen Konnektivität auf das Device -
die gescatterten Ergebnisse in einem seperaten Kernel-Aufruf in ein vertex-basiertes array zusammenfassen (bei diesem aufruf sollten die global_id
s dann vertex indices entsprechen statt element-indices) -
Benchmarken