|
|
Geschwindigkeitsoptimierung · Software Speed Optimization · High Performance Computing · Number Crunching · C/C++ · Assembler · SIMD · MMX · SSE · SSE2 · SSE3 · 3DNow! |
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Software- Plattformen |
FallbeispieleDiese Seite enthält eine Anzahl von Fallbeispielen für Software-Geschwindigkeits-Optimierung. Die Beispiele sind zur besseren Verständlichkeit bis auf den Kern der Aufgabenstellung reduziert worden. Bei diesen Beispielen wurden nur die Geschwindigkeitsfaktoren für optimierten Assembler-Code angegeben. Optimierter C/C++ - Code würde zu etwas niedrigeren Zahlen führen. Bitte wählen Sie unter den folgenden Fallbeispielen:
Mehr Fallbeispiele werden hinzugefügt werden, bitte besuchen Sie die Seite regelmäßig!
Bildverarbeitung: Binarisierung mit doppelter SchwelleDies ist ein Beispiel aus dem Bereich Maschinelles Sehen. Die Aufgabe ist die Erzeugung eines binarisierten Bildes unter Benutzung von 2 Schwellen (untere und obere); die Schwellen werden pro Pixel angegeben in Form eines Bildes. Wenn ein Quell-Pixel zwischen diesen Schwellen liegt, soll das binarisierte Ergebnisbild den Wert 0x0 erhalten, ansonsten 0xff. Die folgende Funktion ist die C Kernfunktion für das Binarisieren eines Teils einer horizontalen Linie:
void BinarizeWithDoubleThreshold(
const unsigned char sourceimage[],
const size_t nrpixels,
const unsigned char lowerthreshold[],
const unsigned char upperthreshold[],
unsigned char binarizedimage[]
)
{
for( size_t i = 0; i < nrpixels; i++ )
binarizedimage[ i ] = (unsigned char)(
(sourceimage[ i ] >= lowerthreshold[ i ] &&
sourceimage[ i ] < upperthreshold[ i ]) ? 0x0 : 0xff);
}
Dies sind die Messergebnisse:
* Spezialisierte, separate Funktionen für gecachedte und
ungecachedte Daten
Hier ist eine Variante: Die Schwellen sind konstant für jedes Pixel: void BinarizeWithDoubleThreshold(
const unsigned char sourceimage[],
const size_t nrpixels,
const unsigned char lowerthreshold,
const unsigned char upperthreshold,
unsigned char binarizedimage[]
)
{
for( size_t i = 0; i < nrpixels; i++ )
binarizedimage[ i ] = (unsigned char)(
(sourceimage[ i ] >= lowerthreshold &&
sourceimage[ i ] < upperthreshold) ? 0x0 : 0xff);
}
Dies sind die korrespondierende Messergebnisse:
* Spezialisierte, separate Funktionen für gecachedte und
ungecachedte Daten
Wie anhand dieser Beispiele zu sehen ist, können die Geschwindigkeitsfaktoren beeindruckend hoch sein, insbesondere, wenn das Speichersystem den Prozessor nicht ausbremst. Wie auch gesehen werden kann, ist, dass langsamere CPUs mehr von der Optimierung profitieren im Falle von speicherintensiven Algorithmen deren Daten nicht im Cache sind.
Digitale Signalverarbeitung: Künstliches Neuronales NetzwerkDie (Kern-)Aufgabe hier ist Berechnung der rohen* Aktivierung (bzw. der Ausgabe) eines Neurons. Dies wird durch Summation der Produkte der Ausgaben der Input-Neuronen und der entsprechenden Gewichte berechnet, mit nachfolgender gerundeter Normalisierung. Die Input-Neuronen liefern Werte zwischen 0 und +127, die Gewichte liegen im Bereich -127 .. +127. Es handelt sich also um das Skalarprodukt eines unsigned Byte Arrays mit einem signed Byte Array. * Der Term roh bezieht sich darauf, dass diese Berechnung nicht den Ausgabe-Wert des Neurons berechnet. Der Ausgabe-Wert wird durch eine Sigmoid-Funktion berechnet, mit dem rohen Wert als Eingabe-Wert. class Neuron_t
{
const unsigned char * const InputNeuronValues; // Value range == 0 .. +127
const signed char * const Weights; // Value range = -127 .. +127
const size_t NrInputNeurons;
public:
Neuron_t(
const unsigned char * const inputneuronvalues,
const signed char * const weights,
const size_t nrinputneurons ) :
InputNeuronValues( inputneuronvalues ),
Weights( weights ),
NrInputNeurons( nrinputneurons )
{
}
// Compute raw, normalized, rounded output value
// Return value = -127 .. +127
signed char ComputeRawOutputValue( void )
{
long sum = 0;
for( size_t z = 0; z < NrInputNeurons; z++ )
sum += InputNeuronValues[ z ] * Weights[ z ];
return( (sum + NrInputNeurons * SCHAR_MAX / 2) /
(NrInputNeurons * SCHAR_MAX) );
}
};
Dies sind die Messergebnisse:
* Die SSE2 Befehle sind nur auf dem Pentium 4 und späteren Prozessoren verfügbar |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Plattformen: x86 · Pentium · Pentium MMX · Pentium II · Pentium III · Pentium 4 · Core · Core 2 · Xeon · Itanium · Athlon · DSPs · Embedded CPUs · Windows · Linux · RT-OS Besonders profitierende Applikationsgebiete: Bildverarbeitung · Signalverarbeitung · High Performance Computing / Number Crunching · Simulationen · Kompression · Spiele · 3D Software · Gerätetreiber · Multi-Prozessor Systeme · Multi-Computer Systeme / Cluster · Embedded Geräte · Echtzeit-Systeme · Interaktive Systeme · Und viele mehr... |
|
Copyright (C) 2001-2002 by Hayes Technologies -
Alle Rechte vorbehalten - Rechtliche Information
- English Homepage
Letzte Änderung: 29.1.2007
|