2012-07-18 2 views
1

OpenMP 요약 pdf : "작업을 통해 특정 저장 위치가 원자 적으로 업데이트됩니다". 이것은 "원자력"이 무엇인지에 대한 질문을 제기하고 그것이 단지 잠금 메커니즘 일뿐입니다. 따라서 "원자"가 올바르게 기억된다면 다른 하드웨어 지원이 값을 변경하지 못하도록하기 위해 내장되어 있음을 의미합니다. 근본적으로 잠금 메커니즘을 구현하는 "원자"를 만드는 것인가?"원자"를 본질적으로 잠금 메커니즘으로 만들고 있습니까?

답변

0

메모리에 저장된 값을 업데이트하는 것은 3 단계 프로세스입니다. 먼저 메모리에서 값을 가져 와서 CPU의 레지스터 중 하나로 가져옵니다. 그런 다음 레지스터 값이 어떤 식 으로든 변경됩니다 (증분). 마지막으로, 새 값이 다시 사용될 수 있도록 메모리에 다시 기록됩니다.

이 작업 (또는 다른 작업)은 기본적으로 세 단계가 모두 수행되거나 전혀 수행되지 않음을 의미합니다.

동일한 메모리 값을 사용해야하는 다른 스레드 나 프로세스가있을 때만 재미 있거나 중요합니다. 둘 다 값을 증가시키고 자 할 때, 초기에는 0입니다. 원자 연산이 없으면 두 번째 스레드는 첫 번째 스레드가 레지스터에서이를 증가시키는 경우에도 원래 값 (0)을 메모리에서 읽을 수 있습니다. 실제로 두 스레드는 값 0을보고 1로 증가시키고 메모리로 리턴 할 수 있습니다. 이 시퀀스가 ​​끝나면 두 번 증가했지만 메모리의 값은 1이됩니다.

원자 단위 증가 연산을 사용하면 해당 시퀀스가 ​​발생할 수있는 방법이 없습니다. 첫 번째 스레드가 원자 순서로 들어가면 첫 번째 스레드가 메모리를 증가시키고 메모리에 다시 기록하기 전에 두 번째 스레드가 메모리의 값을 읽을 수있는 방법이 없습니다. 항상 올바른 값을 얻을 수 있습니다 (2).

귀하의 질문에 답변하려면 의 약자입니다. 잠금 장치처럼입니다. 특히 원래 작업이 무엇이던간에 잠금 메커니즘과 비슷합니다. 원자 연산 자체는 뮤텍스 (mutex) 및 세마포어 (semaphore)와 같은 다른 잠금 메커니즘을 구현하는 데 자주 사용됩니다.

1

"원 자성"대 "고립"을 둘러싼 혼란이있을 수 있습니다. 그것들은 비슷한 개념이지만 그들 사이에 미묘한 차이가 있습니다. Atomicity는 작업이 완전히 완료되거나 완료되지 않는다는 것을 의미합니다. 격리는 동시에 발생하는 작업이 연속적으로 실행되어 발생할 수있는 상태가되도록합니다.

예를 들어, "x에 1을 더한 다음 x에 2를 곱하면"x가 3으로 시작하면 결과가 3 일 때 오류가 발생하고 그렇지 않으면 8이됩니다. 1이 추가 된 직후에 전원이 끊어 지더라도 재부팅 할 때의 결과는 3으로 보장됩니다.

이제이 작업을 두 번 동시에 수행하면 어떻게되는지 생각해보십시오. 두 가지 모두 실패 할 수 있으며 x = 3이됩니다. 하나는 실패 할 수 x = 8. 둘 다 성공할 수 있습니다, x = 18. 우리가 고립을 보장 받으면 유일한 결과입니다. 그러나 고립이 아닌 원 자성이 주어지면 개별 파트가 "1을 더하고 1을 더하고 2를 곱하고 2를 곱하여"x = 20이되는 네 번째 결과가 발생할 수 있습니다! x는 3, 4, 5, 8, 10, 또는 상기 모든 18.

, 이것은 일반적인 오해는 =로

만 격리를 보장하는 경우

아니라 자성, 당신은 끝낼 수 있었다 사람들이 "원 자성 (atomicity)"이라고 말할 때 종종 둘 다 의미합니다. 그것이 OpenMP 문서에서 의미하는 바를 의심합니다.

관련 문제