2008-11-07 10 views
7

다중 프로세서의 경우 코드를 재정렬 할 수있는 코드 순서 변경과 같은 것을 찾고 있습니다.프로세서가 코드를 최적화하는 몇 가지 트릭은 무엇입니까?

+0

당신은 질문의 형태로 표현이 업데이트시겠습니까? –

+0

컴파일러를 의미합니까? 당신이 격렬하게 다른 대답을 얻을 것이기 때문에 ... –

+0

어떤 complier? 어떤 플랫폼? –

답변

0

위키 백과 최적화 기술 here의 상당히 포괄적 인 목록을 가지고 여기에 대해 얘기 허브 셔터의 정말 좋은 비디오가있다

.

+3

+0 : 이것은 컴파일러가 코드를 최적화하는 방법에 대한 답변이며 프로세서의 방식에 대한 대답은 아닙니다. –

0

네,하지만 질문은 정확히 무엇입니까?

그러나 흥미로운 주제이기 때문에 컴파일러와 프로세서가 코드를 최적화하기 위해 사용하는 속임수는 해당 코드의 경쟁 조건이없는 경우 다중 프로세서라도 코드를 중단해서는 안됩니다. 이는 순차적 일관성 보장이라고합니다. 프로그램에 경쟁 조건이없고 액세스하기 전에 모든 데이터가 올바르게 잠겨져있는 경우 코드는 순차적으로 실행 된 것처럼 작동합니다.

http://video.google.com/videoplay?docid=-4714369049736584770

모든 사람이주의해야 :)

13

가장 중요한 것은 메모리 액세스 순서 변경입니다.

메모리 펜스 또는 일련 화 명령어가 없으면 프로세서는 메모리 액세스를 자유롭게 재정렬 할 수 있습니다. 일부 프로세서 아키텍처에는 재주문 할 수있는 정도에 대한 제한이 있습니다. 알파는 가장 약한 것으로 알려져 있습니다 (즉, 가장 많이 주문할 수있는 알파).

매우 좋은 주제는 Linux 커널 소스 설명서 Documentation/memory-barriers.txt에서 찾을 수 있습니다.

대부분의 경우 컴파일러 또는 표준 라이브러리의 잠금 프리미티브를 사용하는 것이 가장 좋습니다. 이것들은 잘 테스트되고 필요한 모든 메모리 장벽을 가져야하며 매우 최적화되어 있습니다 (잠금 프리미티브 최적화는 까다 롭습니다. 전문가도 때때로 실수를 할 수 있습니다).

+0

관련 질문 : http://stackoverflow.com/questions/286629/what-is-mean-by-memory-fences – CesarB

0

DavidK의 대답은 정확하지만 해당 언어/런타임의 메모리 모델을 알고 있어야합니다. 경합 조건이 없어도 순차적 일관성 및 뮤텍스 사용으로 인해 코드가 다른 코어에서 실행중인 다른 스레드에 의해 캐시 될 때 코드가 여전히 손상 될 수 있습니다. 일부 언어 인 Java는 뮤텍스 잠금을 사용할 때 스레드 간의 데이터 상태를 보장하는 한 가지 예이지만 두 스레드가 동시에 데이터에 액세스 할 수 없음을 단순히 보장하는 것만으로는 충분하지 않습니다. 언어 런타임이 두 스레드간에 데이터 상태를 동기화하도록 올바른 방법으로 뮤텍스를 사용해야합니다. 자바에서는 두 스레드가 같은 객체에서 동기화되도록함으로써 수행됩니다.

다음은 문제를 설명하는 좋은 페이지이며 javas 메모리 모델에서 어떻게 처리되는지 보여줍니다.

http://gee.cs.oswego.edu/dl/cpj/jmm.html

관련 문제