In der sehr allgemeinen Weise denke ich, der Unterschied ist tatsächlich Durchsatz (Latenz) vs Anzahl der Operationen (Komplexität). Wenn Sie einen sehr dedizierten ASIC for you-Algorithmus erstellen würden, müssten Sie n^3 Operationen ausführen. Durch das Vektorisieren sagen Sie, dass einige dieser Operationen unabhängig voneinander parallel ausgeführt werden können. Matlab und aktuelle Prozessoren sind schlauer und können bestimmte Operationen parallel ausführen, z. ein 64-Bit-Prozessor könnte 2-32bit-Summierungen 4-16bit usw.
Denken Sie an zwei Algorithmen sowohl in O (n^3), a, wo jede Operation vollständig unabhängig durchgeführt werden muss (Sie können diesen Algorithmus Vektorisierung) und b das andere, wo sie Serien sein müssen (Sie können es nicht vektorisieren). Spezielle Hardware für jede von diesen würde beide Operationen erfordern. Durch die Verwendung von mehr Hardware/Gates für ein können Sie die Aufgabe in so schnell wie 1 Taktzyklus, während für b mehr Hardware/Gates hilft Ihnen nicht und die Aufgabe dauert n^3 Taktzyklus.
EDIT:
Einige Code die Vektorisierung Geschwindigkeit zu veranschaulichen, obwohl die Komplexität (#operation) erhöhen würde nicht
clear variable;
Iterations = 100;
n = 2^20;
a = randi(100,[1,n]);
b = randi(100,[1,n]);
profile on;
for loop=1:Iterations
% Full vector approach
vector = a*b.';
% Partial vector approach
vector2 = sum(a.*b);
% Direct mathematical approach
serial = 0;
for id=1:n
serial = serial + a(id)*b(id);
end
end
profile viewer;
jetzt hat technisch Matlab einigen zusätzlichen Aufwand pro Betrieb wie Überprüfen, ob die Operation Sinn macht usw., wodurch die for-Schleife erheblich verlangsamt wird. Aber im Allgemeinen ist dies nur ein Beispiel, um einen Trend zu veranschaulichen.
Es hängt von der Funktion ab, die Sie verwenden. Zum Beispiel erhöht die Verwendung einer Funktion wie 'bsxfun' die Geschwindigkeit, während es nur eine' for-Schleife' ist, die als 'C++'/'mex'-Datei geschrieben ist. In solchen Fällen glaube ich nicht, dass die Vektorisierung des Codes die Komplexität verändert. – NKN
Danke für Ihre Einsicht. Weißt du, warum die Laufzeit nicht proportional erhöht wird (wenn die Eingabegröße zunimmt)? Als ich für for-Schleife verwendete, war es nahe der erwarteten Zunahme, aber als ich vektorisierte, war es nicht nah. Ich habe MATLAB benutzt. Ich gab nur einen Bereich zum Index (anstatt Spalte) und entfernen Sie die for-Schleife. Http://www.mathworks.com/help/matlab/matlab_prog/vectorization.html – Crimson
@ Crimson Well mit vektorisierten Ansätze, Sie verarbeiten mehr Daten pro Zeitperiode, so gibt es viel mehr Datenübertragungen, die von der Speicherbandbreite, etc. beeinflusst werden können. Also, ich denke nicht, dass es eine lineare Skala wäre. Vectorisierung vs Performance vs Memory ist ein einzigartiges Spiel. Ich bin mit den Komplexitätsdefinitionen allerdings nicht so vertraut. – Divakar