Question

Je joue avec cuda.

Pour le moment j'ai un problème.Je suis en train de tester un large éventail de réponses, et quand j'ai la réponse, j'ai copier les données sur un autre tableau.

Par exemple, mon test tableau de 5 éléments ressemble à ceci:
[ ][ ][v1][ ][ ][v2]

Le résultat doit ressembler à ceci:
[v1][v2]

Le problème est de savoir comment dois-je calculer l'adresse de la deuxième tableau pour stocker le résultat?Tous les éléments du premier tableau sont vérifiées en parallèle.

Je pense à déclarer un dispositif variable de type int addr = 0.Chaque fois que je trouve une réponse, je incrémenter le addr.Mais je ne suis pas sûr à ce sujet, car cela signifie que addr peut être accédé par plusieurs threads en même temps.Fera que causer des problèmes?Ou va le fil d'attendre jusqu'à ce qu'un autre thread finitions à l'aide de cette variable?

Était-ce utile?

La solution

N'est pas aussi anodin qu'il y paraît.Je viens de terminer de mettre en œuvre un et je peux te dire ce que vous en avez besoin lire la analyse Gpu Gems 3 de l'Article en particulier le chapitre 39.3.1 Flux De Compactage.

Pour mettre en œuvre votre propre commencer à partir de la LargeArrayScan exemple dans le SDK, qui vous donnera juste le pré-scan.En supposant que vous avez le choix de tableau dans la mémoire de l'appareil (un tableau de 1 et de 0, signifiant 1 - sélectionnez 0 - jeter), dev_selection_array un dev_elements_array éléments pour être sélectionné dev_prescan_array et un dev_result_array tous de taille N alors vous n'avez

prescan(dev_prescan_array,dev_selection_array, N);
scatter(dev_result_array, dev_prescan_array,
         dev_selection_array, dev_elements_array, N);

où la dispersion est

 __global__ void scatter_kernel( T*dev_result_array, 
                   const T* dev_prescan_array, 
                   const T* dev_selection_array,
                   const T* dev_elements_array, std::size_t size){

unsigned int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx >= size) return;
if (dev_selection_array[idx] == 1){
    dev_result_array[dev_prescan_array[idx]] = dev_elements_array[idx];
}
}

pour une autre belle application de la prescan voir le document Ble93

Amusez-vous!

Autres conseils

Vous parlez classique flux de compactage.En général, je voudrais vous recommandons de regarder Poussée ou CUDPP (ces liens, aller à la compaction de la documentation).Ces deux sont open source, si vous voulez restaurer votre propre alors je vous suggère aussi de regarder le 'scan' exemple du SDK.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top