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.
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. –
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. –
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