2010-11-26 37 views
4

J'essaie d'améliorer mon projet de traitement d'image fonctionnant sur un processeur ARM cortex-a8. J'accédais aux données d'image en niveaux de gris 8 bits de la mémoire. Dans ma fonction, en ce moment j'accède à la valeur de pixel individuelle, octet par byte. Je pensais qu'en utilisant NEON, je pouvais améliorer cela en accédant à 128/8 = 16 octets en un coup de mémoire et ensuite en faire usage dans ma fonction. Mais lors de l'exécution de la version modifiée, je vois que cela prend plus de temps que l'accès octet par octet. Je pense que mon chargement avec NEON devient un goulot d'étranglement, prenant plus de temps que mon temps de calcul. Quelle est la taille de bus de données de ARM Cortex-A8? Combien d'octets sont accédés de la mémoire dans un chargement de mémoire?ARM Cortex-A8: Combien d'octets sont récupérés dans une mémoire lue?

+0

Le cache aura généralement abstrait ce loin. À partir de SDRAM, il fera des lectures et écritures en rafale. Si vous utilisez une mémoire à écran direct, la mémoire cache peut alors * écrire *. La réponse dépendra de la mémoire que vous utilisez. Vous devriez toujours comparer * performance de la mémoire * et ensuite comparer à votre code. Voir: [Copie mémoire Cortex-A8] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka13544.html). –

Répondre

3

De l'Cortex A8 TRM:

« Vous pouvez configurer le processeur pour se connecter à soit une interconnexion AXI 64 bits ou 128 bits qui offre une flexibilité aux conceptions de système »

est-NEON nécessaire, peut-être vous comparez des pommes à des oranges? Au lieu de ldrb/strb, vous pouvez utiliser ldrd/strd ou ldm/stm pour obtenir des transferts de 64 bits. L'ARM/AXI peut être assez intelligent pour regarder en avant et regrouper les plus petits transferts dans des transferts plus importants, disons deux transferts de 32 bits en un 64 bits. Mais je ne compterais pas là-dessus. Je le mentionne seulement dans le cas où vous trouvez qu'en changeant en ldr/str ou ldrd/strd vous ne faites aucun gain de performance.

Avez-vous isolé (pas de traitement de données) la boucle de lecture ou d'écriture et essayé les octets vs les mots vs les doubles mots? Il se peut que le code pour extraire des octets de mots submerge les économies sur le bus.

De quel type de mémoire s'agit-il? Est-ce sur puce ou hors puce, ce genre de chose, quelle est la vitesse de cette mémoire par rapport à la vitesse d'horloge AXI (ARM)?

Avez-vous activé le cache de données pour cette région? Si tel est le cas, le premier octet lu effectuera un remplissage de ligne de cache en utilisant une taille de bus de données optimale, les lectures suivantes dans cette ligne de cache n'atteindront pas le bus AXI beaucoup moins la mémoire cible. De même, les écritures ne devraient aller aussi loin que le cache et sortir à la cible dans un bus plus large taille optimisée plus tard. Dépend de la façon dont le cache/tampon d'écriture est configuré.

+0

vous devez savoir auprès du fournisseur s'il s'agit ou non d'un bus axi de 64 ou 128 bits. –

+0

vous essayez probablement d'utiliser un ldm avec des multiples de 128 bits sur des limites de 128 bits, je pense que le bus axi 64 bits sur le processeur que je connais effectuera plusieurs lectures de largeur de bus sur une seule commande axi (pas pour écrit bien), mais ce que le vendeur a câblé à ce bus axi et comment ils l'ont mis en œuvre peut encore vous mordre. –

+0

Je sais que j'aurais pu éditer ma réponse, j'ai choisi de ne pas le faire.le ldm va se traduire par devoir alors décaler et isoler chaque octet qui est beaucoup de travail et ensuite effectuer tout ce que vous voulez effectuer sur chacun de ces octets, où des octets individuels vous pouvez utiliser le cache avec et ne pas avoir pour effectuer les décalages mais provoquer des transferts axi individuels si l2 ou peut-être aucun transfert axi si l1. Si vous avez besoin de faire des instructions simd alors peut-être le point fixe ldm, etc stuff est un problème. –

0

Il se peut que vous rencontriez des incidents de pipeline. Si vous voulez lire Neon, il y aura une certaine latence avant de pouvoir utiliser ces données dans le cœur du processeur.