2013-04-30 7 views
6

So habe ich den folgenden Code, die für mich sehr einfach zu sein scheint:Intel-Compiler kann diese einfache Schleife nicht vektorisieren?

#define MODS_COUNT 5 

int start1 = <calc at runtime>; 
int start2 = <calc at runtime>; 

for (int j=0; j<MODS_COUNT; j++) // loop 5 times doing simple addition. 
    logModifiers[start1 + j] += logModsThis[start2 + j]; 

Diese Schleife Teil einer äußeren Schleife ist (nicht sicher, ob dies einen Unterschied macht)

Der Compiler sagt: message : loop was not vectorized: vectorization possible but seems inefficient.

Warum kann diese Schleife nicht vektorisiert werden? es scheint mir sehr einfach zu sein. Wie kann ich die Vektorisierung erzwingen und die Leistung selbst überprüfen?

Ich habe Intel C++ Compiler 2013 Update 3.

Voll Code hier ist, wenn jemand interessiert: http://pastebin.com/Z6H5ZejW

Edit: Ich verstehe, dass die Compiler entschieden, dass es ineffizient ist. Ich frage:

Warum ist es ineffizient?

Wie kann ich es erzwingen, so dass ich mich Benchmark?

Edit2: Wenn ich es zu 4 anstelle von 5 ändern, wird es vektorisiert. Was macht 5 ineffizient? Ich dachte, dass es in 2 Anweisungen gemacht werden kann, das erste tut 4 und das zweite ist "normal" tut 1, anstelle von 5 Anweisungen.

+1

Und du damit sagen, dass Sie denken, dass der Compiler mit „scheint ineffizient“ ist falsch? Ich würde eher zustimmen, dass eine Schleife von 5 Elementen wahrscheinlich nicht sehr effizient vektorisieren würde. –

+0

Der Compiler sagt Ihnen nicht, dass die Schleife nicht vektorisiert werden kann. Persönlich denke ich, dass Compiler, die sich entschließen, Programmierern zu gehorchen, wie sie (die Compiler) für richtig halten, eine sehr gute Idee sind. –

+1

Höchstwahrscheinlich sind die Daten nicht in einem Speicher organisiert, der für die Verwendung von Vektorbefehlen direkt geeignet ist, und der Compiler hat festgestellt, dass die Kosten für die Neuanordnung der Daten mehr sind als die Zeit, die durch mehr gleichzeitige Bearbeitung der Daten gespart wird . – jcoder

Antwort

2

Nach Vektorisierung in Intel Compiler:

Es gibt SIMD (Single Instruction Multiple Data), die Register 128 Byte lang sind. also, wenn sizeof (int) ist 4 dann 4 ganze Zahlen können in diesen Registern sitzen und ein einzelner Befehl kann auf diesen 4int s durchführen. (dies hängt auch wenn gleiche Art von Operation auf diesen int s erfolgt, hier wahr. mehr über jedes Element des Arrays auf LHS ist abhängig von einem anderen Element eines anderen Arrays.)

Wenn es 8 int s gibt, dann sind zwei Anweisungen erforderlich (anstelle von 8 ohne Vektorisierung).

aber wenn 5 (oder 6 oder 7) int s da sind, dann benötigt das auch zwei Anweisungen. welche might nicht besser als ohne Vektorisierungscode ist.

weiterlesen LINK.

+0

Warum zwei Anweisungen für eine Schleife von 5 ist nicht besser? sind nicht 2 Anweisungen schneller als 5? –

+0

@Spacemonkey, aber die Berechnung am 5. benötigt das SIMD-Register nicht. die schwerer sein könnten, als wenn sie alle ohne Vektorisierung berechnet wurden (wenn 5 vektorisiert wurden). Um vorsichtig zu sein, heißt es nicht, dass die Zeit, die für die vektorielle Ausführung benötigt wird, nicht "1/4" mal ohne Vektorisierung ist. es sagt nur 1 Anweisung. –

+0

Benchmarking Ihren Code (mit so kleinen Schleife) wird eine Herausforderung sein. Eine zu hohe Schleifenanzahl, der Compiler mit Straight Out vektorisiert es. zu klein wird schwer zu unterscheiden sein. –

Verwandte Themen