2010-03-08 4 views
2

É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

  1. Le compteur de boucle i
  2. code flotteur, nombre int et dist
  3. 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épondre

5

pour chaque réitération de i, la taille, l'index, le code, etc. doivent être copiés de l'hôte à l'appareil .. la façon dont vous avez votre programme, il n'y a pas grand-chose que vous pouvez faire. Pour de meilleurs résultats, pensez à déplacer l'intégralité de la boucle i sur l'appareil, de cette façon vous n'aurez pas d'hôte pour les copies de l'appareil.

La confiance est excellente pour certaines choses, mais en ce qui concerne les performances et l'algorithme ne convient pas aux fonctions disponibles, vous devrez peut-être réécrire pour obtenir de meilleures performances sans utiliser explicitement d'algorithmes de poussée.

+1

Résolu avec le nouveau code complet de l'appareil, en utilisant poussée pour copier tout ce dont j'ai besoin. –