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


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

이 질문에 대한 동기

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

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

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

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

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

다음 주석과 함께 Linux 커널 ( i386 및 x86_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에서 새 명령어가되는 또 다른 경우 lzcnt는 F3 0F BD /r입니다. 그 명령 (자신의 CPUID의 LZCNT 기능 플래그 누락)를 지원하지 않는 CPU를, 그것은으로 디코딩 rep bsr과 동일하게 실행되는, bsr. 따라서 오래된 CPU에서는을 생성 32 - expected_result하고 입력이 0 일 때 정의되지 않습니다.

그러나 tzcnt및 bsf컴파일러 수 있도록, 비 - 제로 입력과 같은 일을하고 사용 할 수 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

명령어에 적용되지 않는 접두사는 무시됩니다. 그러나 반복 접두사 ( F2H및 F3H)가 예약되어 있으며 표 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.