Я играл с этой опцией, чтобы оптимизировать цикл for в нашей встроенной архитектуре (здесь). Однако я заметил, что когда для выравнивания требуется добавить более одной инструкции nop
, компилятор генерирует одну nop
, за которой следует столько нулей, сколько требуется (0000
).
Я подозреваю, что это ошибка в нашем компиляторе, но может ли кто-нибудь подтвердить, что это не ошибка в GCC?
Вот фрагмент кода:
__asm__ volatile("nop");
__asm__ volatile("nop");
for (j0=0; j0<N; j0+=4)
{
c[j0+ 0] = a[j0+ 0] + b[j0+ 0];
c[j0+ 1] = a[j0+ 1] + b[j0+ 1];
c[j0+ 2] = a[j0+ 2] + b[j0+ 2];
c[j0+ 3] = a[j0+ 3] + b[j0+ 3];
}
Скомпилируйте с -falign-loops=8
(или любым другим числом, соответствующим вашей архитектуре, которое превышает требуемое минимальное выравнивание). Вы можете добавить или удалить __asm__
строк по мере необходимости, чтобы сгенерировать смещенное тело цикла.
-O3
, когда сочтет это целесообразным). - person R.. GitHub STOP HELPING ICE   schedule 27.03.2012#pragma
для параметров решения об уровне оптимизации/развертывании перед циклом вместо того, чтобы разворачивать его вручную. Я не решил, лучше это или уродливее, чем разворачивать цикл самостоятельно... - person R.. GitHub STOP HELPING ICE   schedule 28.03.2012