2014-06-15 10 views
9

x86_64의 Linux glibc pthread 기능이 약하게 정렬 된 메모리 액세스를위한 펜스 역할을합니까? (pthread_mutex_lock/unlock은 내가 관심있는 정확한 함수이다).pthreads v. SSE 약한 메모리 정렬

SSE2는 약한 메모리 순서 (특히 movntps와 같은 비 임시 저장소)에 대한 지침을 제공합니다. 이 지침을 사용하고 있고 다른 스레드/코어가 주문을 보도록하려면 원하는 sfence 명령과 같은 명시적인 울타리가 필요하다는 것을 이해합니다.

일반적으로 pthread API가 펜스로 적절하게 작동해야합니다. 그러나, 나는 보통의 C 코드가 약하게 정렬 된 메모리 접근을 생성하지 않을 것이라고 생각한다. 그래서 pthread가 약하게 정렬 된 접근을위한 펜스처럼 행동 할 필요가 있다고 확신하지는 않는다.

glibc pthread 소스 코드를 통해 읽는 mutex는 적어도 "unclended path"에 "lock cmpxchgl"을 사용하여 구현됩니다. 그래서 내가 알고 있어야 할 것은 SSE2 약하게 명령 된 접근을위한 울타리로서의 지시가되는 것인가?

+0

그럼 아무도 대답하지 않아서 슬리브를 감아 테스트 프로그램을 작성했습니다. 진행 상황 : ------ * pthread 스핀 록을 사용하면 울타리가 아닌 것을 쉽게 증명할 수 있습니다. * 울타리로 작동하지 않는 pthread 뮤텍스를 생성하지 못했습니다. ------ 뮤텍스가 펜스이거나 내가 방금 운이 좋았 기 때문에 실패한 경우 확실하지 않습니다. 내 테스트 코드는 https://gist.github.com/rcls/c855e3e782253e58e046 – user1998586

답변

4

비 임시 매장에서는 sfence 명령을 올바르게 주문해야합니다.

그러나 간단한 뮤텍스를 효율적으로 사용자 수준에서 구현할 경우 쓰기 읽기 전용 버퍼를 플러시하지 않는 간단한 쓰기로 풀어 놓을 것을 가정하고 lock cmpxchg과 같은 원자 읽기 수정 쓰기 작업은 전체 메모리를 의미합니다 울타리.

따라서 unlock의 효과가 비 임시 저장소에 적용되는 의미가 store-with-release 일 때 상황이 있습니다. 따라서 이러한 SSE 저장소는 잠금 해제 후 다른 스레드가 뮤텍스를 획득 한 후에 재정렬 될 수 있습니다.

+0

입니다. 감사합니다. 잠금 작업에 대해서만 생각해 봤지만 취약한 순서로 저장 한 후에 잠금 해제의 주문 의미가 중요하다는 것을 놓쳤습니다. . – user1998586

+0

그리고 glibc 소스 코드를 다시 읽는 것은 내 테스트 결과와 일치합니다. pthread_mutex_unlock은 울타리로 작동하며 잠긴 명령어 (lowlevellock을 통해)를 사용합니다. pthread_spin_unlock은 일반 저장소를 사용합니다. [다른 설명은 pthread_spin_unlock이 더 빠르다는 것입니다. 아마도 아키텍처 설명에서 보증하지는 않지만 실제로는 느린 작업이면 여기에서 울타리를 작동시킬 것입니다.] – user1998586