Étant donné le morceau de code suivant, la génération d'un type de dictionnaire de codes avec CUDA utilisant la poussée (C++ bibliothèque de modèles pour CUDA):Optimiser CUDA avec poussée dans une boucle
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());
Le problème est que je suis remarqué plusieurs copies de 4 octets, en utilisant CUDA visual profiler. OMI, est générée par
- Le compteur de boucle i
- code flotteur, nombre int et dist
- Chaque accès à i et les variables mentionnées ci-dessus
Cela semble ralentir tout (copie séquentielle g de 4 octets n'est pas amusant ...). Donc, comment je dis poussée, que ces variables doivent être traitées sur l'appareil? Ou sont-ils déjà? L'utilisation de thrust :: device_ptr ne me semble pas suffisante, car je ne sais pas si la boucle for tourne sur l'hôte ou sur l'appareil (ce qui peut aussi expliquer la lenteur).
Résolu avec le nouveau code complet de l'appareil, en utilisant poussée pour copier tout ce dont j'ai besoin. –