2011-06-09 5 views
2

Je fais face à un ensemble d'images (larg 2k x 2k)
J'ai besoin de faire des opérations par pixel sur une pile de quelques images séquentielles.Cuda 2d ou 3d arrays

Existe-t-il des opinions sur l'utilisation d'une seule grande texture 2D + calcul des décalages par rapport à l'utilisation de matrices 3D?

Il semble que les tableaux 3D sont un peu «hors du courant dominant» dans l'API CUDA, les fonctions de transfert d'allocation sont très différentes des mêmes fonctions 2D.

Il ne semble pas être une bonne documentation sur le niveau supérieur « comment et pourquoi » de CUDA plutôt que les appels spécifiques

Il y a le best practices guide mais il ne traite pas cette

+0

Êtes-vous en train de lire les images plusieurs fois? Sinon utiliser des textures me semble un peu trop .. –

+0

@pavan Je lance une séquence vidéo dans la carte et je fais un traitement image-image puis je rends la vidéo traitée. Utiliser les PBO opengl semblait l'approche la plus facile. –

+0

J'évite personnellement d'utiliser des textures, principalement parce que leur documentation est mauvaise. Les textures de reliure et de reliure prennent également beaucoup de temps. Je ne peux pas commenter sur l'utilisation de textures de cuda et de PBO opengl si. –

Répondre

6

I Je vous recommande de lire le livre "Cuda par exemple". Il passe en revue toutes ces choses qui ne sont pas documentées et explique le «comment et pourquoi».

Je pense que ce que vous devriez utiliser si vous restituez le résultat du noyau CUDA est d'utiliser OpenGL interop. De cette façon, votre code traite l'image sur le GPU et y laisse les données traitées, ce qui rend le rendu beaucoup plus rapide. Il y a un bon exemple de cela dans le livre.

Si chaque thread CUDA n'a besoin de lire qu'un pixel de la première image et un pixel de l'image suivante, vous n'avez pas besoin d'utiliser de textures. Les textures ne vous profitent que si chaque thread lit un ensemble de pixels consécutifs. Il est donc préférable d'utiliser un tableau 3D.

+0

Je l'ai lu, mais les tableaux 3D sont une nouvelle fonctionnalité et ne sont pas couverts dans le livre. L'utilisation de textures facilite grandement l'interopérabilité avec openGL et la plupart des routines de traitement d'images accèdent aux pixels adjacents. –

+0

Bien sûr, il n'y a aucun problème avec l'utilisation de textures. Si vous prévoyez d'utiliser un petit nombre de cadres, vous pouvez simplement définir plusieurs textures de textures 1D ou 2D. Vous avez mentionné que vous faites des choses d'une image à l'autre, vous avez juste besoin de 2 textures, disons les textures A et B. Vous chargez les images 1 et 2 dans A et B et ensuite vos noyaux traitent A et B. frame 1 avec frame 3, et votre noyau va alors traiter les textures B et A (dans cet ordre), ce qui équivaut à traiter les frames 2 et 3. – r2jitu

+0

@ r2jitsu - c'est à peu près ce que j'ai fait. Le support de cuda pour les tableaux de textures est médiocre et le 3D était déroutant, donc j'ai juste rendu la texture N fois aussi haute et travaillé les cadres à traiter. –