2011-09-14 3 views
-1

que je fais plusieurs calculs de la matrice sur OpenCV et je ne comprends pas pourquoi il prend le temps qu'il fautme aider à comprendre ces temps de calcul

Opération 1 est: la multiplication d'un vecteur de colonne 320x1 par une matrice 390x320, puis multiplication par une matrice 72000x390. Temps: ~ 35 ms. L'opération 1b est: 10 fois la multiplication d'un vecteur colonne 32x1 par une matrice 390x32, puis multiplication par une matrice 7200x390. Durée: ~ 35 ms

L'opération 2 est: multiplication d'un vecteur colonne 320x1 par une matrice 72000x320. Temps: ~ 30 ms. L'opération 2b est: 10 fois la multiplication d'un vecteur colonne 32x1 par une matrice 7200x32. Temps: ~ 10 ms

Fondamentalement dans les opérations 1 J'utilise toujours un vecteur de colonne intermédiaire de taille 390, tandis que je saute ceci dans les opérations 2. Pourtant je ne peux pas expliquer pourquoi l'opération 2b est beaucoup plus rapide que 2, quand 1b et 1 sont la même vitesse.

Des idées? Merci

+0

Avez-vous déjà mis en doute la validité et l'exactitude de la méthode que vous utilisez pour trouver ces chiffres en millisecondes? Un profilage adéquat peut être délicat et un peu artistique. Par exemple. les effets de cache peuvent conduire à des nombres intéressants. – Jens

+0

Je ne suis pas sûr de la façon dont les effets de cache fonctionnent mais les résultats sont reproductibles et j'ai les mêmes nombres en faisant la moyenne plusieurs fois par les mêmes opérations ou en les faisant dans un autre ordre, etc – lezebulon

+0

Les effets de cache incluent les accélérations par localité de référence. Si l'on accède à une matrice 2d élément par élément, le temps d'exécution dépend essentiellement de la lecture de la mémoire dans l'ordre ligne/colonne ou colonne/ligne. Je vous suggère d'utiliser un vrai profileur pour instrumenter votre code au lieu d'un timing global du temps d'exécution. Cela fournit probablement un aperçu détaillé de ce qui se passe sous le capot. Beaucoup de compilateurs C permettent de le faire avec l'option '-pg'. – Jens

Répondre

1

En regardant le nombre de multiplications à effectuer par chaque opération, je vois:

Operation 1: 390 * 320 = 124,800 
Operation 1b: 10 *390 * 32 = 124,800 
Operation 2: 72000 * 320 = 23,040,000 
Operation 2b: 10 * 7200 * 32 = 2,304,000 

Opération 1 et 1b requiers la même quantité de multiplication, mais l'opération 2 requiert 10X la multiplication de l'opération 2b.

+0

Je ne suis pas sûr de la formule que vous utilisez pour compter le nombre de multiplications ... multipliant une matrice NxM avec un vecteur Mx1 comptes pour les multiplications NxM pour moi, est-ce que vous utilisez ? – lezebulon

+0

Vous avez raison, mais l'opération 2 est toujours opération 10x 2b: 10 * 7200 * 32 <72000 * 320 –

+0

J'ai édité ma réponse en fonction de vos commentaires. –

Questions connexes