"rep; 아니,” x86 어셈블리에서 의미합니까? "일시 중지"지침과 동일합니까?


86
  • 무슨 rep; nop뜻이야?
  • pause지시 와 같은가요 ?
  • rep nop(세미콜론 제외) 와 동일 합니까?
  • 간단한 nop지시 와 다른 점은 무엇입니까 ?
  • AMD 및 Intel 프로세서에서 다르게 작동합니까?
  • (보너스)이 지침에 대한 공식 문서는 어디에 있습니까?

이 질문에 대한 동기

다른 질문 에 대한 의견에 대한 토론을 한 후 rep; nop;x86 (또는 x86-64) 어셈블리에서 의미하는 바를 모르겠다는 것을 깨달았습니다 . 또한 웹에서 좋은 설명을 찾을 수 없었습니다.

나는 이것이 "다음 명령 시간 반복"rep 을 의미하는 접두사라는 것을 알고 있습니다 (또는 적어도 이전 16 비트 x86 어셈블리에서는 그렇습니다). 이에 따라 위키 백과에서 요약 테이블 , 그것은 보인다 에만 사용할 수 있습니다 , , , , (하지만 어쩌면 이러한 제한은 새로운 프로세서에서 제거). 따라서 (세미콜론없이) 작업 시간을 반복 할 것이라고 생각 합니다.cxrepmovsstoscmpslodsscasrep nopnopcx

하지만 더 찾아 보니 더 혼란스러워졌습니다. 것으로 보인다 rep; noppause 정확히 같은 연산 코드에 매핑 하고, pause단지보다 약간 다른 동작이 있습니다 nop. 2005 년의 일부 오래된 메일에는 다음과 같은 내용이 있습니다.

  • "너무 많은 전력을 태우지 마십시오"
  • "2 바이트 인코딩만으로 'nop'와 동일합니다."
  • "이는 인텔의 마법입니다. '아니지만 다른 HT 형제가 실행되도록 놔두세요'와 같습니다."
  • "인텔에서는 일시 중지되고 Athlon에서는 빠른 패딩입니다."

이렇게 다른 의견으로는 정확한 의미를 이해할 수 없었습니다.

다음 주석과 함께 Linux 커널 ( i386x86_64 모두에서 )에서 사용되고 있습니다. 동일한 주석과 함께 BeRTOS/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ 에서도 사용되고 있습니다.


답변:


75

rep; nop실제로 pause명령어 (opcode F390) 와 동일합니다 . pause아직 명령어를 지원하지 않는 어셈블러에 사용될 수 있습니다 . 이전 프로세서에서 이것은 단순히 nop2 바이트 에서처럼 아무것도하지 않았습니다 . 하이퍼 스레딩을 지원하는 새 프로세서에서는 성능 향상을 위해 스핀 루프를 실행하고 있다는 것을 프로세서에 대한 힌트로 사용합니다. 에서 인텔의 명령 참조 :

스핀 대기 루프의 성능을 향상시킵니다. "스핀 대기 루프"를 실행할 때 Pentium 4 또는 Intel Xeon 프로세서는 가능한 메모리 순서 위반을 감지하기 때문에 루프를 종료 할 때 심각한 성능 저하를 겪습니다. PAUSE 명령어는 프로세서에 코드 시퀀스가 ​​스핀 대기 루프라는 힌트를 제공합니다. 프로세서는이 힌트를 사용하여 대부분의 상황에서 메모리 순서 위반을 방지하므로 프로세서 성능이 크게 향상됩니다. 이러한 이유로 모든 스핀 대기 루프에 PAUSE 명령을 배치하는 것이 좋습니다.


4
스핀 대기 루프 와 같은 바쁜 대기 루프 ? 이 "개선"은 하이퍼 스레딩 프로세서에만 적용됩니까? (왜?)
Denilson Sá Maia

11
예, 스핀 대기 루프는 바쁜 대기 루프와 동일합니다. 이점은 하이퍼 스레딩을 지원하지 않는 CPU에도 적용됩니다. 파이프 라인에서 (불필요한) 명령어의 수를 제한하는 것으로 생각할 수 있습니다 (루프를 병렬로 여러 번 반복하려고 시도하는 대신)
Brendan

1
@Brendan, 감사합니다! 나는 당신이 루프의 반복에 대해 병렬로 이야기하기 전까지는 전혀 이해하지 못했습니다.
Prof. Falken 2011-08-17

11
@ 브렌든, 오, 이제 알겠습니다! 이러한 최신 프로세서는 수퍼 스칼라 이므로 동시에 여러 명령을 실행하려고 시도합니다. 이것이 바쁜 대기 루프 인 경우 더 많은 명령을 실행해도 다른 조건을 기다리는 것이므로 속도가 빨라지지 않습니다.
Denilson Sá Maia

1
@Denilson : 예, 하이퍼 스레딩 친 화성 (또는 HT없이 절전)은 큰 이점 중 하나이지만 다른 하나는 스핀 루프를 떠날 때 메모리 정렬 오류 추측을 피하는 것입니다. 를 사용하지 않으면 pause스핀 루프가 효과적으로 하나의 파이프 라인이됩니다. 다른 코어에 의해 기록 된 메모리 위치의 상태 변경을 감지하기에는 더 느립니다.
Peter Cordes

15

rep nop= F3 90 =에 대한 인코딩 및 pause지원하지 않는 이전 CPU에서 디코딩하는 방법 pause.


접두사 ( lock명령어에 적용되지 않는 )는 실제로 기존 CPU에서 무시됩니다.

문서 rep에는 적용되지 않는 명령어와 함께 사용하는 것은 미래의 CPU가이를 새로운 명령어의 일부로 인식 할 수 있기 때문에 "예약되어 있으며 예측할 수없는 동작을 일으킬 수 있습니다"라고 말합니다 . 를 사용하여 특정 새 명령어 인코딩을 설정하면 f3 xx이전 CPU에서 실행되는 방식을 문서화합니다. (예, x86 opcode 공간이 너무 제한되어 이와 같이 미친 짓을하므로 디코더가 복잡해집니다.)

이 경우 역방향 compat을 깨지 않고 spinloops에서 사용할 수 있음을 의미합니다pause . 알지 못하는 오래된 CPU는 pauseIntel의 ISA ref 수동 입력에pause 의해 보장 된대로 해를 끼치 지 않고 NOP로 디코딩합니다 . 새로운 CPU에서는 절전 / HT 친화 성의 이점을 얻고 회전중인 메모리가 변경되고 회전 루프를 벗어날 때 메모리 정렬 오류를 피할 수 있습니다.


x86 태그 위키 정보 페이지 에있는 Intel의 설명서 및 기타 유용한 정보에 대한 링크

의미없는 rep접두사가 새 CPU에서 새 명령어가되는 또 다른 경우 lzcntF3 0F BD /r입니다. 그 명령 (자신의 CPUID의 LZCNT 기능 플래그 누락)를 지원하지 않는 CPU를, 그것은으로 디코딩 rep bsr과 동일하게 실행되는, bsr. 따라서 오래된 CPU에서는을 생성 32 - expected_result하고 입력이 0 일 때 정의되지 않습니다.

그러나 tzcntbsf컴파일러 수 있도록, 비 - 제로 입력과 같은 일을하고 사용 할 수 tzcnt가 대상 CPU가로 실행되도록 보장되지에도 tzcnt. AMD CPU는 빠르고 tzcnt느리며 bsfIntel에서는 둘 다 빠릅니다. 정확성이 중요하지 않은 한 (플래그 설정에 의존하지 않거나 입력 = 0의 경우 대상 동작을 수정하지 않은 상태로 두지 않는 경우)이를 tzcnt지원하는 CPU에서 디코딩 하는 것이 도움이됩니다.


rep다른 방식으로 디코딩하지 않는 무의미한 접두사 의 한 가지 경우 : rep ret"일반"CPU를 대상으로 할 때 gcc에서 기본적으로 사용됩니다 (예 : -march또는 로 특정 CPU를 대상으로 지정 -mtune하지 않고 AMD K8 또는 K10을 대상으로 지정하지 않음). 대부분의 Linux 배포판에서 대부분의 바이너리에 존재하기 때문에 rep ret다른 것으로 디코딩하는 CPU를 만들 수 ret있습니다. `rep ret`은 무엇을 의미합니까?를 참조하십시오 .


3
rep접두사는 Intel에서 잠금 제거를 추가하는데도 사용되었습니다.
Paul A. Clayton

명령어에 적용되지 않는 접두사는 무시됩니다. 그러나 반복 접두사 ( F2HF3H)가 예약되어 있으며 표 11-3 에서 예상치 못한 동작이 발생할 수 있다고 언급 되어 있습니다 . SSE, SSE2 및 SSE3 명령어에 대한 접두사의 영향 . 따라서 접두사 응용 프로그램은 전체가 아닌 일부 지침에 대해 무시됩니다. 이 기능은 문서화되지 않은 것으로 간주됩니까?
St. Antario 2010 년

2
@St. Antario : 미래의 CPU가 새로운 명령어의 일부로 인식 할 수 있기 때문에 그들은 그렇게 표현합니다 . 모든 실제 CPU에서 인코딩을 설정하면 f3 xx이전 CPU에서 실행되는 방식을 문서화합니다.
Peter Cordes

1
명령에 적용되지 않는 접두사 (잠금 제외)는 실제로 기존 CPU에서 무시됩니다. rep movbe원인 이 문서화 #UD되어 있으므로 항상 무시되는 rep것은 아닙니다 . 수동 입력에 지정된 의미에서 지시에 적용되지 않더라도 . REP/REPE/REPZ/REPNE/REPNZ
St. Antario 2010 년

2
@ 세인트 안타 리오 : 흥미 롭군요! 그러나 일반적으로 이전 지침의 경우 적용 할 수없는 접두사는 무시됩니다. 새로운 지침을 도입 할 때 원하는 경우 더 엄격한 규칙을 추가 할 수 있습니다. IDK가이 특정 경우에 왜 그것을 선택하는지.
Peter Cordes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.