2016-08-29 2 views
2

Was ich im Titel meine, wenn ich einen Vektor erzeugen will, der von zwei verschiedenen Werten in Vektoren abhängt, wie kann ich das im Schub tun?Wie kann ich eine Schub :: Transformation mit unabhängigen Iteratoren verwenden?

Stellen Sie sich diese Funktion:

void foo(int rows, int columns) 
{ 
    std::vector<int> blubb; 
    for (int x = 0; x < rows; x++) 
    { 
     for (int y = 0; y < columns; y++) 
     { 
      blubb.push_back(x * y); 
     } 
    } 
} 

ich nicht scheinen, um herauszufinden, wie leicht kann dies Schub verwandeln.

Wenn ich Schub verwenden :: Transformation mit Schub :: counting_iterator würden beiden Iteratoren in jedem Schritt erhöht werden, aber ich will eigentlich die Permutationen, die möglich sind:

void fooGPU(int rows, int columns) 
{ 
    thrust::device_vector<int> blubb(rows * columns); 

    thrust::transform(thrust::make_counting_iterator<int>(0), 
         thrust::make_counting_iterator<int>(rows), 
         thrust::make_counting_iterator<int>(0), 
         blubb.begin(), 
         thrust::multiplies<int>()); 
} 

ich das Gefühl habe, dass es eine sehr einfache Lösung für dieses Problem, aber ich sehe es nicht.

Antwort

2

Sie könnten den linearen Index zuerst in Zeilen- und Spaltenindizes umwandeln und sie dann multiplizieren.

thrust::transform(
    thrust::make_transform_iterator(thrust::make_counting_iterator(0), 
            _1 % columns), 
    thrust::make_transform_iterator(thrust::make_counting_iterator(0), 
            _1 % columns) + rows * columns, 
    thrust::make_transform_iterator(thrust::make_counting_iterator(0), 
            _1/columns), 
    blubb.begin(), 
    _1 * _2); 

Hier finden Sie ein einfaches Beispiel zu Platzhaltern.

https://thrust.github.io/doc/namespaceplaceholders.html

+0

Die Transformation Iteratoren sind ein schöner Ansatz für das Problem. Am Ende habe ich auch einen sehr ähnlichen Ansatz. Trotzdem vielen Dank für die Antwort. – FreddyKay

Verwandte Themen