Domanda

Dato il seguente pezzo di codice, generando una sorta di dizionario codice con CUDA usando spinta (C ++ Template Library per CUDA):

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());

Il problema è, che ho notato più copie di 4 byte, utilizzando CUDA Visual Profiler. IMO questo è generato da

  1. Il contatore del ciclo i
  2. Codice float , int count e dist
  3. Ogni accesso i e le variabili sopra indicati

Questo sembra rallentare tutto (copia sequenziale di 4 byte non è divertente ...).

Quindi, come sto dicendo di spinta, che queste variabili saranno trattati sul dispositivo? O sono già?

Utilizzando spinta :: device_ptr sembra non sufficiente per me, perché io non sono sicuro se il ciclo for intorno gira su host o su un dispositivo (che potrebbe anche essere un altro motivo per la lentezza).

È stato utile?

Soluzione

per ogni reiterazione di i, dimensioni, l'indice, codice, ecc devono essere copiati da host a dispositivo .. il modo in cui avete il vostro programma, non c'è molto che si può fare. Per ottenere risultati ottimali, considerare lo spostamento dell'intero ciclo i sul dispositivo, in questo modo non sarà necessario ospita le copie dei dispositivi.

La fiducia è grande per alcune cose, ma in cui le prestazioni sono interessato e algoritmo non funzioni abbastanza in forma a disposizione, potrebbe essere necessario riscrivere per le migliori prestazioni senza l'utilizzo di algoritmi di spinta in modo esplicito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top