Die Frage lautet "Wie implementiere ich Stromverdichtung in Halogenid?" Es wird viel über die parallele Stromverdichtung geschrieben und es ist etwas nicht triviales, gut zu machen. Sehen Sie diesen Stack-Überlauf Antwort darauf in CUDA für einige Diskussion zu tun und Referenzen: CUDA stream compaction algorithm
Eine schnelle Realisierung von einfachen Strom Verdichtung in Halide eine Präfixsumme mit sieht aus wie so:
#include "Halide.h"
#include <iostream>
using namespace Halide;
static void print_1d(const Buffer<int32_t> &result) {
std::cout << "{ ";
const char *prefix = "";
for (int i = 0; i < result.dim(0).extent(); i++) {
std::cout << prefix << result(i);
prefix = ", ";
}
std::cout << "}\n";
}
int main(int argc, char **argv) {
uint8_t vals[] = {0, 10, 99, 76, 5, 200, 88, 15};
Buffer<uint8_t> in(vals);
Var x;
Func prefix_sum;
RDom range(1, in.dim(0).extent() - 1);
prefix_sum(x) = (int32_t)0;
prefix_sum(range) = select(in(range - 1) > 42, prefix_sum(range - 1) + 1, prefix_sum(range - 1));
RDom in_range(0, in.dim(0).extent());
Func compacted_indices;
compacted_indices(x) = -1;
compacted_indices(clamp(prefix_sum(in_range), 0, in.dim(0).extent() - 1)) = select(in(in_range) > 42, in_range, - 1);
Buffer<int32_t> sum = prefix_sum.realize(8);
Buffer<int32_t> indices = compacted_indices.realize(8);
print_1d(sum);
print_1d(indices);
return 0;
}
Danke, Zalman. Die Art, Koordinaten zu erhalten, ist beeindruckend. Für mehrere Dimensionen, wenn ich diese Art von Methode verwenden möchte, muss die Eingabe ein Puffer sein, ist es möglich, einen Puffer in Generator zu realisieren? – user8769167
zum Beispiel, ich bekomme af (x, y, z) im Generator, ich denke, es ist notwendig, es auf 1 Dimension zu prefix_sum es zu reduzieren, dies erfordert, f (x, y, z) zu einem Puffer zu realisieren, ist es möglich Realisieren Sie es und erhalten Sie einen Puffer in Generator? – user8769167
Sie sollten in der Lage sein, eine mehrdimensionale 'RDom' zu verwenden, um eine 2D-Präfix-Summe zu erstellen. Es könnte eine Reihe von Dingen schief gehen. Wenn die Reduktion 'Func' die Ausgabe ist, können die Grenzen nicht weiter als diejenigen der Daten reichen. (Z. B. ist es einfach, eine Reduktion zu schreiben, deren Anfangswert -1 ist, wenn das erste gültige Ergebnis 0 ist.) Welchen Fehler sehen Sie? –