임베디드 아키텍처에서 for 루프를 최적화하기 위해이 옵션을 사용했습니다 (here). 그러나 정렬에서 하나 이상의 nop
명령어를 추가해야하는 경우 컴파일러에서 nop
을 하나씩 생성하고 as-many-as-required 0 (0000
)을 생성합니다.-falign-loops 옵션을 사용할 때 GCC 버그입니까?
우리 컴파일러의 버그라고 생각되지만 누군가 GCC의 버그가 아닌지 확인할 수 있습니까? -falign-loops=8
(또는 필요한 최소 정렬보다 더 아키텍처와 관련된 어떤 번호)와
__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];
}
컴파일 :
는 여기에 코드입니다. 필요에 따라 __asm__
행을 추가하거나 제거하여 잘못 정렬 된 루프 본문을 생성 할 수 있습니다.
덧붙여서, 나는 추악한 수동 루프 풀기를 없애고 gcc가 루프를 풀도록 할 것입니다. (루프가 풀리면, 그것이 의미가 있다고 생각할 때'-O3'으로 디폴트로 할 것입니다). –
@R .. - 분명히 현실 세계에서는 그렇지 않습니다. 이 코드는 사실 벡터 추가 작업을 수행하는 벤치 마크의 일부입니다. 나는 위의 코드와 vecadd()와 vecadd_naive()의 두 가지 함수를 제안과 비슷하게 사용한다. 사실, 최적의 성능을 얻으려면 수동으로 16 번 풀어야했고, 순진한 버전보다 약간 나은 성능을 보였습니다. 이것은 -O3 및 (아마도 중복) -funroll-loops와 함께 사용되었습니다. – ysap
@R ..- 언 롤링 루프에 대한 옵티 마이저의 휴리스틱 스는 다소 임의의 규칙 집합 (OK, 사용 가능한 옵션이 적어도 있음)을 기반으로한다는 것을 기억하십시오. 코드 크기 또는 레지스터 사용과 같은 고려 사항은 다를 수 있으며 결국 더 빠른 코드로 이어질 수 있습니다. 나는 이것이 내가 차이점을 보았던 것이라고 생각한다. – ysap