Frage

das folgende Stück Code gegeben, eine Art Code-Wörterbuch mit CUDA Schub (C ++ Vorlagenbibliothek für CUDA) zu erzeugen:

thrust::device_vector<float> dCodes(codes->begin(), codes->end());
thrust::device_vector<int> dCounts(counts->begin(), counts->end());
thrust::device_vector<int> newCounts(counts->size());

for (int i = 0; i < dCodes.size(); i++) {
    float code = dCodes[i];
    int count = thrust::count(dCodes.begin(), dCodes.end(), code);

    newCounts[i] = dCounts[i] + count;

    //Had we already a count in one of the last runs?
    if (dCounts[i] > 0) {
        newCounts[i]--;
    }

    //Remove
    thrust::detail::normal_iterator<thrust::device_ptr<float> > newEnd = thrust::remove(dCodes.begin()+i+1, dCodes.end(), code);
    int dist = thrust::distance(dCodes.begin(), newEnd);
    dCodes.resize(dist);
    newCounts.resize(dist);
}

codes->resize(dCodes.size());
counts->resize(newCounts.size());

thrust::copy(dCodes.begin(), dCodes.end(), codes->begin());
thrust::copy(newCounts.begin(), newCounts.end(), counts->begin());

Das Problem ist, dass ich mehrere Kopien von 4 Bytes bemerkt habe, von CUDA Visual Profiler. IMO ist dies erzeugt durch

  1. Der Schleifenzähler i
  2. float Code int count und dist
  3. Jeder Zugriff auf i und die Variablen wie oben angegeben

Das scheint alles zu verlangsamen (sequentielles Kopieren von 4 Bytes ist kein Spaß ...).

Also, wie ich sage Schub, dass diese Variablen auf dem Gerät behandelt werden sollen? Oder sind sie schon?

Mit Schub :: device_ptr für mich nicht ausreichend zu sein scheint, weil ich nicht sicher bin, ob die für die Schleife um auf dem Host läuft oder auf dem Gerät (die auch ein weiterer Grund für die Langsamkeit sein könnten).

War es hilfreich?

Lösung

Für jede Wiederholung i, Größe, Index, Code usw. haben vom Host zum Gerät kopiert werden .. die Art und Weise Sie Ihr Programm haben, gibt es nicht viel Sie tun können. Die besten Ergebnisse erzielen, sollten Sie auf dem Gerät gesamte i-Schleife zu bewegen, auf diese Weise Sie nicht Host-Gerät kopiert haben.

Vertrauen ist für einige Dinge groß, aber in denen die Leistung betrifft, und Algorithmus nicht ganz fit zur Verfügung stehende Funktionen, können Sie für die beste Leistung umschreiben, ohne explizit Schub Algorithmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top