ich viel vektorisierten Schleifen schreiben, so ein gemeinsames Idiom istWarum for Schleife hat 1 zusätzlichen Befehl als erwartet?
volatile int dummy[1<<10];
for (int64_t i = 0; i + 16 <= argc; i+= 16) // process all elements with whole vector
{
int x = dummy[i];
}
// handle remainder (hopefully with SIMD too)
Aber die resultierende Maschinencode hat 1 weitere Anweisung als Ich mag würde
.L3:
leaq -16(%rax), %rdx
addq $16, %rax
cmpq %rcx, %rax
movl -120(%rsp,%rdx,4), %edx
jbe .L3
(gcc 4.9 verwenden) Wenn ich ändern der Code for (int64_t i = 0; i <= argc - 16; i+= 16)
, dann ist die "extra" Anweisung ist weg:
.L2:
movl -120(%rsp,%rax,4), %ecx
addq $16, %rax
cmpq %rdx, %rax
jbe .L2
Aber warum der Unterschied? Ich dachte, vielleicht lag es an Schleifeninvarianten, aber zu vage. Dann bemerkte ich, dass im Instruktionsfall die Inkrementierung vor dem Laden erfolgt, was aufgrund der zweizeiligen Operandenanweisungen von x86 einen zusätzlichen mov erfordern würde. Eine andere Erklärung könnte also sein, dass es die Handelsanweisungs-Parallelität für 1 zusätzliche Anweisung ist.
Obwohl es scheint, dass es kaum Leistungsunterschiede geben würde, kann jemand dieses Geheimnis erklären (am besten, wer kennt Compiler-Transformationen)?
Im Idealfall würde Ich mag die ich halten + 16 < = Größe Form da, dass eine intuitive Bedeutung (das letzte Element des Vektors nicht außerhalb der Grenzen geht) hat
Nur Fragen über optimierten Code stellen, nicht optimierter Code ist wörtlich für das Programm und nicht bezeichnend für die Geschwindigkeit überhaupt. Von dem, was Sie jetzt haben, wenn Sie den Optimierer einschalten, wird nichts mehr übrig bleiben. Natürlich können Sie das nicht schneller machen. –
aber das ist optimierter Code (-O3), abgesehen von der flüchtigen Last? und es war, das Problem auf einfache Art zu illustrieren –
Ich stimme zu supercat's Antwort ist sehr präzise, aber es wird angenommen, dass ich transformiere i + 16 <= argc zu i <= argc - 16 ist notwendig, um die minimalen # Anweisungen zu erreichen. Ich würde gerne denken, wenn das notwendig ist. –