문제

하나의 단일 CPU에서 모든 스레드가 실행되는 단일 코어 프로세서를 사용하면 메모리의 일부 뮤트 (또는 세마포어 등)에서 원자 테스트 및 세트 작업을 사용하여 중요한 섹션을 구현한다는 아이디어는 직접적으로 보입니다. 프로세서가 프로그램의 한 지점에서 테스트 및 세트를 실행하고 있기 때문에 다른 스레드처럼 위장한 프로그램에서 다른 지점에서 하나를 수행 할 수는 없습니다.

그러나 실제로 하나 이상의 물리적 프로세서가 있으면 어떻게됩니까? 간단한 명령 수준 원자력은 충분하지 않은 것 같습니다. B/C는 두 개의 프로세서를 사용하여 동시에 테스트 및 세트 작업을 실행할 수있는 B/C입니다. 원자력을 유지하는 데 실제로 필요한 것은 뮤텍스. (그리고 공유 메모리 위치가 캐시에로드되면 전체 캐시 일관성도 처리해야합니다.)

이것은 단일 코어 케이스보다 훨씬 더 많은 오버 헤드가 발생하는 것처럼 보이므로 여기에 질문의 고기가 있습니다. 얼마나 나쁜가요? 더 나쁘니? 우리는 그것과 함께 살고 있습니까? 아니면 프로세스 그룹 내의 모든 스레드가 동일한 물리적 핵심으로 살아야한다는 정책을 시행하여이를 회피 하는가?

도움이 되었습니까?

해결책

멀티 코어/SMP 시스템은 여러 CPU가 함께 붙어있는 것이 아닙니다. 동시에 일을하는 것에 대한 명백한 지원이 있습니다. 모든 동기화 프리미티브는 라인을 따라 하드웨어를 사용하여 구현됩니다. 원자 CAS. 이 명령어는 CPU 및 메모리 컨트롤러 (및 DMA를 수행하는 장치)가 공유하는 버스를 잠그고 메모리를 업데이트하거나 메모리를 업데이트하는 메모리를 업데이트합니다. 캐시 스누핑. 이것은 차례로 발생합니다 캐시 일관성 관련된 모든 당사자가 캐시를 플러시하도록 강요하는 알고리즘.

면책 조항 - 이것은 매우 기본적인 설명입니다. 여기에는 Virtual vs. 물리적 캐시, 캐시 쓰기 백 정책, 메모리 모델, 울타리 등과 같은 더 흥미로운 것이 있습니다.

OS가 이러한 하드웨어 시설을 사용하는 방법에 대해 더 알고 싶다면 여기에 훌륭한 책 주제에.

다른 팁

멀티 코어 CPU의 공급 업체는 원자 메모리 액세스를 보장하는 지침을 실행할 때 다른 코어가 스스로 조정할 수 있도록 관리해야합니다.

예를 들어 인텔 칩에는 'CMPXCHG'명령이 있습니다. 메모리 위치에 저장된 값을 예상 값과 비교하고 두 일치하는 경우 새 값으로 교환합니다. '잠금'명령에 앞서 있다면 모든 코어와 관련하여 원자력이 있습니다.

프로세서가 다른 모든 작업 코어에 알리도록 강제로 테스트 및 세트가 필요합니다. 예, 그것은 오버 헤드를 소개하고 당신은 그것과 함께 살아야합니다. 동기화 프리미티브를 너무 자주 기다리지 않는 방식으로 멀티 스레드 애플리케이션을 설계하는 이유입니다.

아니면 프로세스 그룹 내의 모든 스레드가 동일한 물리적 핵심으로 살아야한다는 정책을 시행하여이를 회피 하는가?

그것은 멀티 스레딩의 요점을 취소합니다. 잠금, 세마포어 또는 기타 동시 화 기술을 사용하는 경우 OS에 의존하여 사용중인 코어 수에 관계없이 이러한 작업이 인터 로크되어 있는지 확인하는 것입니다.

잠금이 해제 된 후 다른 스레드로 전환하는 시간은 대부분 컨텍스트 스위치 비용에 의해 결정됩니다. 이것 따라서 스레드는 컨텍스트 전환 오버 헤드를 다루므로 확인할 수 있습니다.

다른 흥미로운 스레드도 있습니다.

이 MSDN 기사도 읽어야합니다. 멀티 스레드 앱에서 저항 기술의 영향을 이해합니다.

메모리 액세스는 메모리 컨트롤러에 의해 처리되어 멀티 코어 문제를 처리해야합니다. 즉, 동일한 주소에 동시에 액세스 할 수 없습니다 (아마도 메모리 페이지 또는 메모리 라인 기준으로 처리). 따라서 플래그를 사용하여 다른 프로세서가 일부 블록의 메모리 내용을 업데이트하는지 여부를 표시 할 수 있습니다 (레코드의 일부가 업데이트되는 곳에서 더러운 읽기 유형을 피하기 위해).

보다 우아한 솔루션은 프로세서에 그러한 기능이있는 경우 HW 세마포어 블록을 사용하는 것입니다. HW 세마포어는 크기가 No_of_cores -1 일 수있는 간단한 대기열입니다. 이것이 Ti의 6487/8 프로세서에있는 방식입니다. 세마포어를 직접 쿼리하고 (릴리스 될 때까지 루프) 간접 쿼리를 수행하여 코어가 리소스를 받으면 인터럽트가 발생할 수 있습니다. 요청은 대기되어 있으며 주문한 순서대로 제공됩니다. 세마포어 쿼리는 원자 연산입니다.

캐시 일관성은 또 다른 문제이며 경우에 따라 캐시 쓰기 백 및 새로 고침을 수행해야 할 수도 있습니다. 그러나 이것은 매우 캐시 구현 특정입니다. 6487/8을 사용하면 몇 가지 작업에서이를 수행해야했습니다.

글쎄, 집 주변에 어떤 유형의 컴퓨터를 놓았는지에 따라 다음을 수행하십시오. 간단한 멀티 스레드 응용 프로그램을 작성하십시오. 이 애플리케이션을 단일 코어 (Pentium 4 또는 Core Solo)에서 실행 한 다음 멀티 코어 프로세서 (Core 2 Duo 또는 이와 유사한)에서 실행하고 속도가 얼마나 큰지 확인하십시오.

Pentium 4와 Core Solo는 Core 2 Duo보다 코어에 관계없이 훨씬 느리기 때문에 이들은 부당한 비교입니다. 4 개 이상의 스레드를 사용할 수있는 응용 프로그램과 코어 2 듀오와 코어 2 쿼드를 비교할 수 있습니다.

여러 가지 유효한 포인트를 높입니다. 뮬리플 프로세서는 많은 두통과 오버 헤드를 소개합니다. 그러나 중요한 부분이 충분히 오래 만들어지면 평행의 속도 향상이 훨씬 더 크게 만들어 질 수 있기 때문에 우리는 그들과 함께 살아야합니다.

동일한 물리적 코어에 모든 스레드를 갖는 것에 대한 최종 제안은 멀티 코어 컴퓨터의 요점을 완전히 물리칩니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top