data 의존성
Data dependency컴퓨터 과학에서 데이터 의존성은 프로그램 스테이트먼트(명령)가 앞의 스테이트먼트의 데이터를 참조하는 상황입니다.컴파일러 이론에서, 문장들(또는 명령들) 사이의 데이터 의존성을 발견하기 위해 사용되는 기술을 의존성 분석이라고 한다.
종속성에는 데이터, 이름 및 제어의 세 가지 유형이 있습니다.
data 의존관계
라고 가정하면, 는 다음과 같은 경우 })에 의존합니다.
여기서:
- { I는 에서 읽은 메모리 위치 세트입니다.
- ( ) { O ( _ { } )는 S j{ S _ { }에 의해 쓰여진 메모리 위치 세트입니다.
- 에서 로의 실행 가능한 실행 경로가 있습니다.
이 조건을 A. J. 번스타인에 의해 명명된 번스타인 조건이라고 합니다.
다음의 3가지 케이스가 있습니다.
- 안티의존성: ( 1 ) ( 2 ) 、 { \ I ( _ {} \ O ( { } ) \ \ , S \ _ { 、 S _ { 1} 1 S _ 1 。
- 흐름(데이터) 의존성: ( ) ( 2 ){\ {\{\ 、 \ O ( _ {} \ ( S _ { } ) \ \ , 2 \ S _ {1 } 、 S { 1。
- 출력 의존성: ( 1)O ( ) O ( S_ { )\ ( _ { } \ \ , 1 ( \ _ {1} \ S _ {}} S _ S _ { 2 }}}}}}}}}} both write write write write write output write write write write write write write write write write write write write write write write write write write write write output output output output output output output output output output output output output
흐름 의존성(진정한 의존성)
흐름 의존성은 데이터 의존성 또는 진정한 의존성 또는 RAW(Read-After-Write)라고도 하며 명령이 이전 명령의 결과에 의존할 때 발생합니다.이름 의존이라고도 합니다.
1. A = 3 2. B = A 3C = B
명령 3은 명령 2에 의존하며, C의 최종값은 명령 업데이트 B에 의존합니다.명령 2는 명령 1에 의존하며, B의 최종값은 명령 업데이트 A에 의존합니다.명령 3은 명령 2에, 명령 2는 명령 1에 진정으로 의존하므로 명령 3도 명령 1에 진정으로 의존합니다.따라서 이 예에서는 명령 수준의 병렬화는 옵션이 아닙니다.[1]
안티의존성
WAR(Write-After-Read)라고도 하는 안티의존성은 명령이 나중에 값을 업데이트해야 할 때 발생합니다.다음 예제에서는 명령 2의 안티의존이 명령 3에 있습니다.이러한 명령의 순서는 변경할 수 없습니다.또한 A의 최종 값에 영향을 미치기 때문에 병렬로 실행할 수도 없습니다(명령 순서를 변경할 수도 있습니다.
1. B = 3 2A = B + 1 3.B = 7
예:
MUL R3, R1, R2 R2, R5, R6 추가
이 두 가지 명령 사이에 반의존성이 있는 것은 분명하다.처음에 R2를 읽은 후 두 번째 지침에서는 R2에 대한 새로운 값을 씁니다.
안티의존성은 이름 의존성의 예입니다.즉, 변수 이름을 변경하면 다음 예시와 같이 종속성이 제거됩니다.
1. B = 3 N. B2 = B2.A = B2 + 1 3.B = 7
새로운 변수 B2가 새로운 명령어인 명령어 N에서 B의 복사본으로 선언되었습니다.2와 3 사이의 안티의존성은 제거되었으며, 이는 이제 이러한 명령이 병렬로 실행될 수 있음을 의미합니다.그러나 이 수정으로 인해 명령 2는 명령 1에 진정으로 의존하는 명령 N에 의존하게 되었습니다.흐름 의존관계로서 이러한 새로운 의존관계는 안전하게 제거할 수 없습니다.[1]
출력 의존성
출력 의존성은 명령 순서가 변수의 최종 출력 값에 영향을 줄 때 WAW(Write-After-Write)라고도 합니다.다음 예에서는 명령 3과 1 사이에 출력 의존성이 있습니다.이 예에서 명령 순서를 변경하면 A의 최종값이 변경되므로 이들 명령을 병렬로 실행할 수 없습니다.
1. B = 3 2A = B + 1 3.B = 7
안티의존관계와 마찬가지로 출력의존관계는 이름의존관계입니다.즉, 위의 예에서 다음과 같이 변수 이름을 변경하여 삭제할 수 있습니다.
1. B2 = 3 2A = B2 + 1 3.B = 7
데이터 의존성에 대해 일반적으로 사용되는 명명 규칙은 Read-After-Write 또는 RAW(플로우 의존성), Write-After-Read 또는 WAR(반 의존성), Write-After-Write 또는 WAW(출력 의존성)입니다.[1]
제어 의존성
명령 B는 A의 결과에 따라 B의 실행 여부가 결정되면 앞의 명령 A에 대한 제어의존성을 가진다.다음 예에서는 는 에 의해 제어가 의존합니다. (\S_})은 S_})에 의존하지 않습니다.는 S3(\displaystyle S_{3는 에 관계없이 실행되기 때문입니다.UTCOME S ({
S1. if (a == b) S2. a = a + b S3. b = a + b
직관적으로, 다음의 경우 두 문장 A와 B 사이에는 통제 의존성이 있다.
- B는 A 이후에 실행될 수 있습니다.
- A의 실행 결과에 따라 B의 실행 여부가 결정됩니다.
전형적인 예로는 if 문장의 조건 부분과 참/거짓 본문의 문장 사이에 제어 의존성이 있다.
제어의존성에 대한 공식적인 정의는 다음과 같이 제시될 수 있다.
는 다른 에 의존한 컨트롤이라고 한다.
- 에서 S_까지의 P({{가 존재하며 P({P}) 내의 S_1가 가능한 경로에서 뒤에 .프로그램 종료까지.
- 뒤에 가 이어지는 것은 아닙니다., S1에서 를 않는 프로그램의 실행 경로가 있습니다.
(사후) 우위의 도움으로 표현되는 두 조건은 다음과 같다.
- i}) 후도미지
- 2는S 1({1})을 않음
제어 의존 관계 구축
제어 의존성은 기본적으로 제어 흐름 그래프(CFG)[2]의 역 그래프에서 지배적인 프런티어입니다.따라서 이들을 구성하는 한 가지 방법은 CFG의 지배 후 프런티어를 구축한 후 이를 반전시켜 제어 의존성 그래프를 얻는 것이다.
다음은 지배 후 프런티어를 구축하기 위한 의사 코드입니다.
포스트 디미네이터 트리의 상향 트래버스의 각 X에 대해 다음과 같이 합니다.각 Y에 대해 PostDominanceFrontier(X) ← for cessors Previator(X) x x immediate immediate X : PostDominator(X) ← PostDominanceFrontier(X) {X}immediatePostDominator(Y)≠ X : PostDominanceFrontier(X) ← PostDominanceFrontier(X)∪ {Y}완료
여기서 Children(X)은 CFG에서 X에 의해 즉시 사후 지배되는 노드 세트이며 Previors(X)는 CFG에서 X 바로 앞에 있는 노드 세트입니다.노드 X는 모든 Children이 처리된 후에만 처리됩니다.지배 후 프런티어 맵을 계산하면 CFG 내의 노드에서 제어 의존성이 있는 노드에 대한 맵이 생성됩니다.
시사점
기존의 프로그램은 순차 실행 모델을 가정하여 작성된다.이 모델에서는 명령이 원자적으로 차례차례 실행된다(즉, 주어진 시점에서 하나의 명령만 실행된다).
단, 명령어 또는 명령어 간의 의존관계는 병렬화를 방해하는 경우가 있습니다.즉, 병렬화 컴파일러 또는 명령어 수준의 병렬화를 이용하는 프로세서에 의한 여러 명령어의 병렬 실행입니다.관련된 종속성을 고려하지 않고 여러 명령을 함부로 실행하면 잘못된 결과, 즉 위험을 초래할 수 있습니다.
레퍼런스
- ^ a b c John L. Hennessy; David A. Patterson (2003). Computer Architecture: a quantitative approach (3rd ed.). Morgan Kaufmann. ISBN 1-55860-724-2.
{{cite book}}
: CS1 maint: 여러 이름: 작성자 목록(링크) - ^ Cytron, R.; Ferrante, J.; Rosen, B. K.; Wegman, M. N.; Zadeck, F. K. (1989-01-01). "An Efficient Method of Computing Static Single Assignment Form". Proceedings of the 16th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages. POPL '89. New York, NY, USA: ACM: 25–35. doi:10.1145/75277.75280. ISBN 0897912942.