문제를 간단하게 유지하고 내 문제의 핵심에 집중하기 위해 포인터 변수 ptr
에 의해 로컬로 지정된 메모리 위치가 여러 프로세스에서 공유된다고 가정 해 봅시다. 나는 특히 C/++의 MPI 공유 메모리 윈도우를 사용하여 메모리를 할당하고 공유한다. 구체적으로, 특정 공유 메모리 쓰기 작업 (MPI)의 동기화
float* ptr;
지금 모든 프로세스가 const float f
ptr이 할 수있는 동일한 값을 쓰려고한다고 가정
*ptr = f;
,이,의는 ptr
참조에게 부동 소수점 변수를 가정 해 봅시다 : 모든 프로세스가 동일한 방식으로 바이트를 수정하려고 시도 할 때 (즉, f
이 모든 프로세스에 대해 동일한 값을 갖는다는 점을 고려할 때),이 작업에는 동기화가 필요하거나 동시에 실행될 수 있습니까? 따라서 내 질문은 다음과 같이 요약됩니다. 부동 소수점 변수를 사용하면 모든 프로세스가 동일한 방식으로 메모리를 수정하려고해도 경쟁 조건으로 인해 일치하지 않는 바이트 패턴이 발생할 수 있습니다. 나는. 모든 프로세스가 동일한 데이터를 쓰는 것을 알고 있다면 동기화를 생략 할 수 있습니까?
답변 해 주셔서 감사합니다."서로 다른 프로세스에서 크기를 조정하는 것"이 의미하는 바를 더 자세히 말할 수 있습니까? MPI에서 적절한 동기화를 구현 한 경우 (확실한 방법을 알고 있음), 동기화 객체를 사용하지 않습니다. 그래서 나는 "가시성, 메모리 재정렬"이 어떻게 영향을 미치는지 이해하지 못한다. 문제를 해결하기 위해 C++ 표준 라이브러리 기능을 사용하지는 않을 것입니다. 충돌은 스레드가 아닌 데이터에 액세스하는 다른 프로세스 사이에서 발생한다는 점에 유의하십시오. – sperber
오타입니다. "거주"합니다. MPI가 동기화를 제공하는 경우 이는 다른 질문입니다. 예를 들어 예를 들어 답했습니다. 서로 다른 프로세스에서 벌거 벗은 포인터에 쓰기 –
동일한 데이터를 쓰는 여러 프로세스 (예 : 어셈블리 수준에서 잘못 될 수있는)로 메모리를 다시 정렬 할 때 무엇이 잘못 될 수 있습니까? – sperber