동시성에 대해 추론하기 위해 어떤 중간 표현을 사용할 수 있습니까?


12

컴파일러가 프로그래머를 대신하여 동시성에 대해 지능적으로 선택하는 데 필요한 것이 무엇인지 더 잘 이해하려고합니다. 예를 들어이 문제의 많은 어려운 측면이 있음을 알고 있습니다.

  • 경쟁 조건이 없는지 확인
  • 코드가 동시에 실행될 때 코드의 의미 적 의미에 영향을 미치는 부작용이 없는지 확인

  • 코드에서 사용 가능한 병렬 처리 수준을 고려할 때 스레드 회전으로 인한 오버 헤드가 가치가 있는지 결정

현대 컴파일러에서 사용되는 두 가지 주요 중간 표현은 절차 및 객체 지향 언어에 대한 정적 단일 할당이며 기능 언어에 대한 스타일을 계속 전달한다는 것을 이해합니다. 위에 나열된 문제에 대한 추론은 이러한 중간 형태를 사용하는 것이 어려워 보입니다. 이론 상으로는 자동 병렬화 가능성이 가장 높은 언어조차도 (하스켈과 같은 부작용이없는 순수한 기능적 언어)이 부분에서 제한적인 진전을 보였습니다.

내 질문은 실제로이 문제를 해결하기 위해 어떤 중간 표현이 사용 되었습니까? 내가 알지 못하는 학술 연구에 사용 된 다른 표현이이 작업에 더 적합합니까? 이 문제는 컴파일이 중간 표현에 도달하기 전에 추상 구문 트리를 조작하여 컴파일러 프론트 엔드에서 근본적으로 해결해야하는 문제입니까?


기능적인 방식으로 코드를 작성하면 경쟁 조건이나 부작용에 대해 걱정할 필요가 없습니다.
Robert Harvey

4
이것은 귀하의 질문에 대답하지는 않지만 동시 코드에 대해 추론하는 데 사용할 수있는 Process Calculi에 관심이있을 수 있습니다. 가장 잘 알려진 예는 Pi Calculus 입니다. 그러나 자동 병렬화 는 여전히 대부분 해결되지 않은 문제이며 컴파일러에 특정 보증을 제공하거나 특수 주석을 사용하도록 특별히 언어를 설계함으로써 해결하는 것이 가장 좋습니다.
amon

4
CnC (Intel Concurrent Collections)의 배경 이되는 논문 에는 Producer-Consumer와 같은 8 가지 기본 동시 패턴이 나와 있습니다. 이러한 동시 패턴은 차례로 불변성 및 부작용이없는 등의 여러 속성에 따라 달라집니다. (누군가가 그 논문을 요약하고 답변으로 게시 할 수 있다면 감사하겠습니다.)
rwong

이론적 인 도구 중 하나를 "DSA (Dynamic Single Assignment)"라고하며 SSA 위에 구축됩니다.
rwong

@ rwong : 명시 적 참조를 제공 할 수 있습니까?
Ira Baxter

답변:


5

중간 표현 (IR)에서 명시 적으로 모델링 동시성이 필요한 요구 사항이라고 가정 할 수 있습니다. "포크 앤 조인", "병렬 x y"와 같이 "일부 동시성 작업이 추가 된 순차 프로그램에 사용되는 IR"입니다. 이것들을 추가하면 어떤 종류의 동시성에 대해 추론 할 수 있지만 반드시 쉬운 것은 아닙니다. 또한 완벽하게 기능적인 표현을하지 않고 특정 속성 (데이터-레이스 자유)을 보장하는 방법도 명확하지 않습니다 (병행 성을 유용하게 모델링하기 어렵게 함).

논란의 여지가있는 Petri Nets (CPN) 는 동시성 프로그램을 나타내는 데 적합합니다. CPN의 토큰은 "색상"[유형]이며 값을 전달할 수 있습니다. "상태로의 전이"는 들어오는 토큰에 대해 임의의 산술을 수행하여 "장소"에서 계산 된 값으로 다르게 색이 지정된 토큰을 생성 할 수 있습니다. 장소를 계산 결과로 생각하고 모델링 연산자 (메모리에 액세스하기위한 특수 연산자 포함)로 전환하면 프로그램 모델링에 사용되는 데이터 흐름 그래프의 양을 알 수 있습니다. 이것을 사용하여 트리플 [operator, input1, input2, output]과 같은 고전적인 컴파일러 표현을 공식적으로 해석 할 수 있습니다.

교착 상태가없는 위치, 토큰 수의 제한 등의 컴퓨팅 속성을 포함하여 이러한 CPN 그래프를 분석 할 수있는 도구가 많이 있습니다. 계층 적 CPN을 사용하면 함수와 프로 시저 및 "호출"개념을 모델링 할 수 있습니다.

이러한 표현이 명확하게하지 않는 것은 응용 프로그램을 병렬화 할 수있는 위치를 쉽게 추론 할 수 있다는 것입니다. 두 가지 하위 계산이 공유 피연산자에 부작용을주지 않으면 병렬화 될 수 있습니다 (이는 일부 사람들이 기능적 프로그램 / 표현을 좋아하는 이유입니다). 프로그램 표현이 공유 메모리를 모델링하는 경우 메모리를 모놀리스로 모델링하고 별칭 지정 주소 지정 등 공유 메모리의 상호 작용에 대한 추론에 대한 일반적인 문제를 얻을 수 있습니다.이를 방지하는 한 가지 방법은 메모리를 격리 된 청크로 처리하는 것입니다. 더 큰 프로그램 상태는 이것들의 (트리와 같은) 어셈블러입니다. 당신은 아마도이 청크를 당신의 중간 표현으로 전달할 수 있습니다. 두 개의 병렬 계산이 청크 (예 : 메모리 하위 트리)를 공유하지 않으면 두 병렬 계산간에 상호 작용이 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.