Friday, February 24, 2017

Cuda Mobile Moyenne Filtre

Pour une autre approche, vous pouvez tronquer la fenêtre de moyenne mobile exponentielle et ensuite calculer votre signal filtré en faisant une convolution entre votre signal et l'exponentielle fenêtrée. La convolution peut être calculée en utilisant la bibliothèque CUDA FFT libre (cuFFT) car, comme vous le savez peut-être, la convolution peut être exprimée comme la multiplication ponctuelle des deux signaux dans le domaine fourier (c'est le théorème de Convolution, Qui s'exécute avec une complexité de O (n log (n))). Ce type d'approche minimisera votre code de noyau CUDA et fonctionnera très très rapidement, même sur une GeForce 570 Particulièrement si vous pouvez faire tous vos calculs en précision simple (flottante). Répondre Apr 30 14 at 17:04 Je proposerais de manipuler l'équation des différences ci-dessus comme indiqué ci-dessous et ensuite en utilisant CUDA Thrust primitives. DIFFÉRENCE MANIPULATION D'ÉQUATION - FORME EXPLICITE DE L'ÉQUATION DE DIFFÉRENCE Par simple algèbre, on peut trouver ce qui suit: Alpha à l'exception de dinput0 1. Définir un vecteur d1 overbetatothen égal à 1, 1beta, 1beta2, 1beta3. Multiplier elementwise dinput par d1overbetatothen Effectuer un inclusivescan pour obtenir la séquence de yn betan Diviser la séquence ci-dessus par 1, 1beta, 1beta2, 1beta3. L'approche ci-dessus peut être recommandée pour les systèmes Linear Time-Varying (LTV). Pour les systèmes Linear Time-Invariant (LTI), l'approche FFT mentionnée par Paul peut être recommandée. Im fournissant un exemple de cette approche en utilisant CUDA Thrust et cuFFT dans ma réponse au filtre FIR dans CUDA. Filtre de taille est un filtre de fenêtre de classe linéaire, qui lisse le signal (image). Le filtre fonctionne comme passe bas. L'idée de base derrière le filtre est pour tout élément du signal (image) prendre une moyenne dans son voisinage. Si nous avons une matrice mxn et que nous voulons appliquer un filtre moyen de taille k, alors pour chaque point de la matrice p: (i, j) la valeur du point serait la moyenne de tous les points du carré. Pour le noyau carré de filtrage de taille 2. que la case jaune est le pixel à calculer, et que toute la grille est le carré des pixels voisins, que la nouvelle valeur des pixels sera leur moyenne. Le problème est que cet algorithme est très lent, surtout sur de grandes images, alors j'ai pensé à utiliser GPGPU. La question est maintenant. Comment cela peut-il être mis en œuvre dans cuda, si c'est possible C'est un cas classique de problème de traitement d'image embarrassantement parallèle qui peut être très facilement mappé au cadre CUDA. Le filtre de moyennage est connu sous le nom de filtre de boîte dans les domaines de traitement d'image. L'approche la plus simple serait d'utiliser des textures CUDA pour le processus de filtrage car les conditions aux limites peuvent être manipulées très facilement par des textures. En supposant que vous avez des pointeurs source et destination alloués sur l'hôte. La procédure serait quelque chose comme ça. Allouez suffisamment de mémoire pour contenir les images source et de destination sur le périphérique. Copier l'image source d'un hôte vers un autre. Liez le pointeur du périphérique d'image source à la texture. Spécifiez une taille de bloc appropriée et une grille suffisamment grande pour couvrir chaque pixel de l'image. Lancez le noyau de filtrage en utilisant la grille spécifiée et la taille du bloc. Copiez les résultats à l'hôte. Débrancher la texture Pointeurs de périphérique libres. Exemple de mise en œuvre de Box Filter La bonne nouvelle est que vous n'avez pas à mettre en œuvre le filtre vous-même. Le CUDA Toolkit est livré avec une bibliothèque gratuite de traitement des images et des signaux nommée NVIDIA Performance Primitives aka NPP, fabriquée par NVIDIA. NPP utilise des GPU CUDA pour accélérer le traitement. Le filtre de moyennage est déjà implanté dans la centrale nucléaire. La version actuelle de NPP (5.0) est compatible avec les images 8 bits, 1 canal et 4 canaux. Les fonctions sont: nppiFilterBox8uC1R pour une image à 1 canal. NppiFilterBox8uC4R pour une image à 4 canaux. J'ai répondu Jan 15 13 à 10:50 Votre réponse semble être très bonne, mais je ne suis pas vraiment conscient de ce que vous décrivez là-bas, car je programme principalement sur matlab, et I39ve bonne connaissance de la programmation C, Ce que j'ai besoin est un Code, le prototype de la fonction du noyau serait: global void ApplyAverageFilter (int Image, int Résultat, int filterSize). J'ai besoin d'aide pour le code. Ndash Sameh Kamal Jan 15 13 à 10:56 Oh. J'ai mis à jour ma réponse et ajouté un lien pour le kernel CUDA pour le filtrage de boîtes. Mais vous devez d'abord apprendre CUDA à l'utiliser. Sinon, la NPP est une meilleure option si vous n'avez pas beaucoup de fond CUDA. Ndash sgarizvi Jan 15 13 at 10:59 Si la taille des filtres est normale et pas humongous, le filtre moyen est un très bon cas pour la mise en œuvre avec CUDA. Vous pouvez le configurer en utilisant des blocs carrés et chaque thread du bloc est responsable du calcul de la valeur d'un pixel, en additionnant et en faisant la moyenne de ses voisins. Si vous stockez l'image dans la mémoire globale, il peut être programmé facilement, mais vous aurez beaucoup de conflits bancaires. Une optimisation possible est que vous chargez des blocs de l'image dans les blocs de mémoire partagée. L'utilisation d'éléments fantômes (de sorte que vous ne dépasserez pas les dimensions des blocs partagés lors de la recherche de pixels voisins) vous pouvez calculer la moyenne des pixels dans un bloc. Le seul pense que vous devez être prudent de la façon dont la couture sera fait à la fin, parce que les blocs de mémoire partagée se chevauchent (en raison des pixels supplémentaires padding) et vous ne voulez pas calculer leurs valeurs deux fois. Dans l'analyse statistique et, par exemple, dans l'analyse des données boursières, on peut s'intéresser aux deux situations suivantes: 1. On a une longue suite d'articles Et veut calculer un certain nombre de moyennes, en faisant la moyenne sur différents nombres d'articles, c'est-à-dire en utilisant des longueurs différentes pour la fenêtre de la moyenne mobile. 2. On a une série de séquences, stockées consécutivement en mémoire, et on veut les moyenner en parallèle avec une fenêtre de moyenne fixe de taille 2 RADIUS 1. Ci-dessous, a. L'opérateur de la moyenne mobile est un opérateur fondamental de la statistique. L'article de Wikipedia fournit un aperçu étendu sur cette matière. Sa mise en œuvre CUDA fournit un très bon exemple sur l'utilisation de la mémoire partagée et sur le chargement et la gestion des régions halo dans la mémoire partagée. Voici un exemple complet d'implémentation de l'opérateur de moyenne mobile dans CUDA. Incluez ltthrustdevicevector. hgt définissez RADIUS 3 définissez BLOCKSIZE 32 iDivUp FUNCTION. Supposons que l'on a le filtre de moyenne mobile exponentielle défini par l'équation de différence sous yn yn-1 bêta-alpha xn où alpha et bêta sont des constantes. La question est de savoir comment la mettre en œuvre efficacement dans CUDA. Une possibilité serait de calculer la forme explicite de la réponse du filtre, puis d'utiliser les primitives proposées par CUDA Thrust. En particulier, par l'algèbre simple, on peut trouver ce qui suit: y1 bêta y0 alpha x1 y2 beta2 y0 alpha be. Catégories


No comments:

Post a Comment