2017-10-13 2 views
0

Ich habe eine Funktion f (x, y, z), in der die Werte entweder 1 und 0 sind, und ich muss die ersten 100 Koordinaten der Werte erhalten, die gleich ist zu 1, zu reduction/update sie auf 0.Halogenid: Reduktion über eine Domäne für die spezifischen Werte

Dies ist sehr einfach in c und anderen Sprachen zu realisieren, jedoch habe ich versucht, es mit Halogenid für ein paar Tage zu lösen. Gibt es eine Funktion oder einen Algorithmus, die ich verwenden kann, um es in Halogengeneratoren zu lösen?

Antwort

1

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; 
} 
+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

+0

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

+0

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? –