asm, asm volatile 및 clobbering 메모리의 차이
잠금 없는 데이터 구조와 타이밍 코드를 구현할 때 컴파일러의 최적화를 억제해야 하는 경우가 많습니다.보통 사람들은 다음을 사용합니다.asm volatile
와 함께memory
하지만 가끔씩은 그냥 보고만날 때가 있어요asm volatile
아니면 그냥 평야asm
클러버링 메모리
이러한 다른 문장은 코드 생성에 어떤 영향을 미칩니까(특히 GCC는 휴대성이 낮기 때문에)?
참고로 다음과 같은 흥미로운 변화가 있습니다.
asm (""); // presumably this has no effect on code generation
asm volatile ("");
asm ("" ::: "memory");
asm volatile ("" ::: "memory");
GCC 문서의 "확장 Asm" 페이지를 참조하십시오.
예방할 수 있습니다.
asm
키워드를 써서 삭제하지 않는 명령volatile
그 후asm
[...] [...]는volatile
키워드는 명령에 중요한 부작용이 있음을 나타냅니다.GCC는 다음 명령어를 삭제하지 않습니다.volatile
asm(도달 가능한 경우)
그리고.
안
asm
출력 오퍼랜드가 없는 명령은 휘발성과 동일하게 취급됩니다.asm
설명.
이 예에서는 출력 오퍼랜드가 지정되어 있지 않기 때문에asm
그리고.asm volatile
폼은 동일하게 동작합니다.이러한 폼은 (도달 불능으로 판명되지 않는 한) 삭제할 수 없는 포인트를 코드에 작성합니다.
이것은 아무것도 하지 않는 것과 전혀 같지 않다.더미의 예에 대해서는 이 질문을 참조해 주세요.asm
코드 생성을 변경한다.이 예에서는 루프를 1000회 도는 코드가 한 번에 16회 반복되는 루프를 계산하는 코드로 벡터화됩니다.단, 루프의 존재는asm
루프의 내부가 최적화를 억제합니다.asm
1000회 도달해야 합니다).
그"memory"
clobber는 GCC가 어떤 메모리든 임의로 읽거나 쓸 수 있다고 가정하도록 합니다.asm
따라서 컴파일러가 로드 또는 저장의 순서를 변경할 수 없습니다.
이로 인해 GCC는 어셈블러 명령 전체에 걸쳐 레지스터에 캐시된 메모리 값을 유지하지 않고 해당 메모리에 대한 저장 또는 로드를 최적화하지 않습니다.
(단, CPU가 부하를 재정렬하고 다른 CPU에 대해 저장하는 것을 막는 것은 아닙니다.단, 이를 위해서는 실제 메모리 장벽 명령이 필요합니다).
asm ("")
아무것도 하지 않는다(또는 적어도 아무것도 하지 않아야 한다).
asm volatile ("")
아무것도 하지 않습니다.
asm ("" ::: "memory")
단순한 컴파일러 울타리입니다.
asm volatile ("" ::: "memory")
AFAIK는 이전과 동일합니다.그volatile
키워드는 컴파일러에 이 어셈블리 블록을 이동할 수 없음을 알려줍니다.예를 들어 컴파일러가 모든 호출에서 입력값이 동일하다고 판단했을 경우 루프에서 꺼낼 수 있습니다.그 충분히 어떤 만, 이 컴파일러는 아직 모릅니다.volatile
이치노가 attempted렇른, 른른른른른른 an an an an an an an an an an an를 입니다.asm
언언입입입입입는문문문문문문문문문문문 。
★★★★★★★★★★★★★★★★.volatile
또한 출력 값이 사용되지 않는다고 판단될 경우 컴파일러가 식을 삭제할 수 없습니다.할 수 , 되지 않습니다.asm ("" ::: "memory")
.
Lily Ballard의 답변을 완성하기 위해 Visual Studio 2010은_ReadBarrier()
,_WriteBarrier()
★★★★★★★★★★★★★★★★★」_ReadWriteBarrier()
(VS2010에서는 64비트 앱에 인라인 어셈블리가 지원되지 않습니다).
이러한 명령어는 생성되지 않지만 컴파일러 동작에 영향을 줍니다.좋은 예가 여기 있다.
MemoryBarrier()
lock or DWORD PTR [rsp], 0
언급URL : https://stackoverflow.com/questions/14449141/the-difference-between-asm-asm-volatile-and-clobbering-memory
'programing' 카테고리의 다른 글
Vue.jsVue.jsv-timeout 태그 인 (0) | 2022.07.10 |
---|---|
하나의 커스텀 npm 패키지로 Vue 및 Vuex 내보내기 (0) | 2022.07.10 |
vuejs 구성 요소의 사용자 php captcha (0) | 2022.07.10 |
프로토콜에 초기화 기능을 사용할 수 있습니까? (0) | 2021.01.18 |
WildFly에서 기본 포트 8080을 변경하는 방법 (0) | 2021.01.18 |