je suis l'itération sur une 3 matrice bidimensionnelle (qui est une image avec 3 valeurs pour chaque pixel) pour appliquer un filtre 3x3 à chaque pixel comme suit:bord de tableau multidimensionnel/conditions de frontière
//For each value on the image
for (i=0;i<3*width*height;i++){
//For each filter value
for (j=0;j<9;j++){
if (notOutsideEdgesCondition){
*(**(outArray)+i)+= *(**(pixelArray)+i-1+(j%3)) * (*(filter+j));
}
}
}
J'utilise l'arithmétique du pointeur car si j'utilisais la notation de tableau, j'aurais 4 boucles et j'essayerais d'avoir le moins de boucles possible. Mon problème est que mon notOutsideEdgesCondition
est hors de portée parce que je dois considérer 8 cas de frontière. J'ai les conditions traitées suivantes
- colonne de gauche:
((i%width)==0) && (j%3==0)
- Colonne de droite:
((i-1)%width ==0) && (i>1) && (j%3==2)
- Upper Row:
(i<width) && (j<2)
- Rangée du bas:
(i>(width*height-width)) && (j>5)
et ils doivent encore tenir compte de la 4 cas d'angle qui auront des expressions plus longues. À ce stade, je me suis arrêté et je me suis demandé si c'était la meilleure solution, car si j'ai une évaluation conditionnelle longue de 5 lignes, il sera non seulement vraiment pénible de déboguer, mais cela ralentira la boucle interne. C'est pourquoi je viens à vous demander s'il existe un algorithme connu pour traiter ces cas ou s'il y a une meilleure approche pour mon problème. Merci beaucoup.
I J'essaierai ça, ça prendra plus de code mais j'espère pouvoir le rendre plus simple. Aussi, pouvez-vous me diriger dans la bonne direction pour accélérer les calculs d'adressage? – kirbuchi
J'ai fait un rapide google pour essayer de trouver un tutoriel sur le déroulement de calculs d'adressage de tableau pour vous, mais je n'en ai pas trouvé un. En bref, évitez autant que possible les calculs d'adressage par pixel. Utilisez un pointeur qui s'incrémente de pixel en pixel pendant que vous travaillez et supprimez toutes les opérations de modulo et de multiplication. Pour implémenter l'adressage du noyau 3x3, vous devez conserver 3 pointeurs (un à votre emplacement actuel dans chaque ligne) ou un pointeur et un 'pas' constant (déplacement entre les lignes) ajouté. Utilisez plusieurs boucles pour savoir quand ajouter/soustraire la foulée. Dang. Plus de caractères – swestrup
Ok, maintenant j'ai les 4 valises latérales manipulées et je vais coder manuellement les valises d'angle.L'approche de 3 pointeurs pour le noyau semble la meilleure parce que je peux individuellement désactiver chaque rangée de noyau en traitant des cas de frontière. Dans cet esprit, je peux procéder de la même manière avec le tableau d'images et les séparer plus facilement pour la mise en œuvre ultérieure de CUDA, ce qui est mon objectif ultime. Merci beaucoup. PS: Je vais chercher un livre ou un tutoriel sur les optimisations de déroulement et d'adressage de tableaux. – kirbuchi