2014-04-15 3 views
2

컴파일러가 명령 재 스케쥴링 후에 생성하는 것과 동일한 순서로 디스 어셈블 된 코드를보고 싶습니다. bt.w 나는 GDB를 사용하고 있는데, 명령어를 disas /m FunctionName으로하면 소스 코드 순서대로 분해 된 코드를 제공한다. 나는 나의 컴파일러 (GCC 4.1)에 의한 명령 재 스케줄화의 효과를 보려고 노력하고 있으며 명령이 어떻게 재 계획되는지를보고 싶다. 감사합니다. /////////////////// EDITS ///////////////////////////////// 코드의 라인 디스 어셈블 된 코드를 살펴본 후 을 ////////// :컴파일러에서 생성 한 코드를 분해하는 방법은 무엇입니까?

double w_n = (A_n[2] * x[0] + A_n[5] * y + A_n[8] * z + A_n[11]) ; 

내가 지시의 그것의 83 바이트를 볼 수 있었다. 그러나이를 2 번 반복하여 펼친 후 :

double w_n[2] = { (A_n[2] * x[0] + A_n[5] * y + A_n[8] * z + A_n[11]), (A_n_2[2] * x[0] + A_n_2[5] * y + A_n_2[8] * z + A_n_2[11]) }; 

코드 블록은 226 바이트입니다. 그리고 명령 수는 엄청나게 증가합니다. 아무도 왜 이런 일이 일어 났는지 말할 수 있습니까? 또한 언 롤링 후에 은퇴 한 지침이 VTune에서 볼 수 있습니다. 생각할 수있는 이유 : 컴파일러가 간단한 명령어를 생성하기 위해 블록 크기를 늘릴 수있는 충분한 기회를 얻음으로써 명령어 프리 페치 및 디코더 유닛의 처리량을 극대화합니다.

도움을 주시면 대단히 감사하겠습니다. 감사!!

+0

clang과 llvm을 사용하면 관심있는 패스를 적용하고 x86 또는 기타 코드를 생성하기가 더 쉽습니다. –

+0

참조 http://stackoverflow.com/questions/137038/how-do- 어셈블러 출력 - cc-source-in-gcc –

답변

4

컴파일러가 일정을 조정 한 경우 gdb에서 역 어셈블 할 때 실제로이를 확인해야합니다.

그렇지 않으면 당신은 아마도 그는 ELF 코드를 보는 나의 선호하는 방법, 직접 명령 줄에 objdump을 사용할 수 있습니다 : 그것은 모든 소스를 참조하지 않습니다

$ objdump --disassemble a.out | less 

, 그래서 정말 표시해야합니다 바이너리 자체에 무엇이 있는지.

gcc -S -c file.c 
gcc -O2 -S -c file.c 
gcc -S -masm=intel -c file.c 

(후자는 인텔을 대신 생성하면 객체 파일에 코드를 컴파일하는 단계, 당신은 또한 단순히 어셈블리 코드를 얻으려면 그 GCC 드라이버 (gcc를) 말할 수에서

4

AT & T 구문 어셈블리)

나중에 어셈블리 코드 (예 : gasm)에서 어셈블리 코드를 가져 와서 연결할 수있는 개체 파일을 가져올 수도 있습니다.


왜 코드가 더 큰지에 관해서는 여러 가지 이유가 있습니다. 우리 인간이 조립을 손으로 최적화하는 데 사용한 경험적 방법론은 더 이상 오랫동안 사실이 아니 었습니다. 하나의 큰 목표는 또 다른 벡터화 인 파이프 라이닝입니다. 무엇보다도 실행 속도를 높이기 위해 가능한 한 많이 병렬화하고 (이미 읽은) 캐시를 최대한 무효화해야합니다.

반 직관적 인 것처럼 보이지만 더 크고 빠른 코드로 이어질 수 있습니다.

+0

감사합니다. 네 말이 맞아. 더 크고 빠른 코드. 그러나 왜 지침이 증가 하는지를 알기위한 유효한 증거가 필요합니다. 여전히 Add, div, mul 연산과 동일합니다.컴파일러가 특정 사례에 대해 더 많은 지침을 생성하게하는 이유는 무엇입니까? –

+0

@Tiro_Coder : 컴파일러는 CPU 세트 또는 단일 CPU를 대상으로 할 수 있습니다. 옵티 마이저의 결정은 목표에 가장 적합한 것이 무엇인지에 달려 있습니다. 따라서 컴파일러에게 특정 유형의 CPU 만 원한다면 코드가 시나리오에 최적화되어 있는지 확인해야합니다. 또한 프로파일 유도 최적화 등의 과정에서 루프가 풀릴 수 있습니다. – 0xC0000022L

관련 문제