2012-08-05 3 views
3

intel의 프로세서 설명서 : 섹션 8.2.3.4의 link로드는 다른 위치의 이전 저장소와 다시 정렬 될 수 있지만 동일한 위치의 이전 저장소와 정렬되지 않을 수 있습니다.메모리 순서 재 지정 : 이전의 상점으로 다른 순서로로드 순서를 재조정 할 수 있습니까?

그래서 나는 다음과 같은 두 가지 작업을 다시 정렬 할 수 있다는 것을 이해 :

x = 1; 
y = z; 

그리고 다음과 같은 두 가지 작업을 다시 정렬 할 수없는

:

x = 1; 
y = x; 

그러나이 발생하면 저장 및로드 위치는 다르지만 부하가 상점을 완전히 포함합니다. 예 :

typedef union { 
    uint64_t shared_var; 
    uint32_t individual_var[2]; 
} my_union_t; 

my_union_t var; 
var.shared_var = 0; 

var.individual_var[1] = 1; 
int y = var.shared_var; 

이 경우 'y'는 0이 될 수 있습니까?

EDIT (@Hans Passant)이 기술을 사용하여 잠긴 지침을 사용하지 않고 스레드 간 준 동기화를 고안 할 수 있는지 더 자세히 설명하려고합니다.

스레드 1 :

var.individual_var[0] = 1; 
int y = __builtin_popcountl(var.shared_var); 

스레드 2 :

my_union_t var; 
var.shared_var = 0; 

그리고 두 개의 스레드가 다음 코드를 실행 :

그래서 더 구체적인 질문은 전역 변수를 주어

var.individual_var[1] = 1; 
int y = __builtin_popcountl(var.shared_var); 

두 스레드 모두에서 'y'를 1로 설정할 수 있습니까?

참고 : __builtin_popcountl은 변수에 설정된 비트 수를 계산하기위한 내장형 gcc 내장 함수입니다.

+0

주문은 여러 코어가 메모리 위치를 액세스 할 때만 역할을합니다. 귀하의 발췌 문장에서 보이지 않는, 게시 된 코드는 결코 실패 할 수 없습니다. 여러 스레드가 동기화없이 동일한 메모리 위치를 읽고 쓰는 것은 실용적이지 않습니다. –

+2

C의 일관성 및 순서 문제에 대해 생각해 보면 컴파일러 자체에서 가능한 문구 작성 및 최적화로 인해 문제가 복잡해집니다. 예를 들어, 컴파일러에게 유니온이 휘발성이라고 알려주지 않았기 때문에 두 개의 스레드 예제가 깨질 수 있습니다. – srking

답변

0

CPU가 메모리 위치를 별명 지정했는지 여부를 알지 못하거나 신경 쓰지 않습니다. 따라서 첫 번째 질문에 대한 대답은 '아니요'입니다.

두 번째 예제의 쓰기가 동기화되지 않으므로 스레드가 자체 데이터 복사본을 가질 수 있습니다.

"사용자 지정 동기화 프리미티브를 구현하고 사용해야합니까?"라는 질문에 대한 대답은 "아니오"입니다.