Vulkan : UniformBuffer 및 StoreBuffer 동기화
UniformBuffers 및 StoreBuffers는 CPU 측에서 memcpy. 이러한 설명자 유형에 대해 동기화는 어떻게 작동합니까? memcpy를 사용하면 응용 프로그램이 memcpy가 다음 명령문을 계속하기 전에 GPU에 데이터를 업로드 할 때까지 기다린다는 의미입니까? 그렇다면 이러한 유형의 버퍼를 동기화하는 데 장벽이 필요하지 않음을 의미합니까?
답변
동기화는 모든 메모리 리소스에 대해 동일한 방식으로 작동합니다 . 드문 경우를 제외하고 메모리를 변경 한 경우 이러한 변경 사항을 확인하려면 메모리 종속성이 필요합니다. 동기화 시스템은 UBO로 사용되는지 여부에 상관하지 않습니다. 소스 작업 (호스트) 및 대상 작업 (특정 셰이더 단계에서 읽기)의 특성을 고려합니다.
를 들어 호스트 - 디바이스 메모리 작업 , 당신은 "도메인 작업"로 알려진 동기화의 형태를 수행해야합니다. 다행히 호출 vkQueueSubmit전에 표시되는 모든 호스트 쓰기에 대해 도메인 작업을 자동으로 수행합니다 vkQueueSubmit. 따라서 GPU 표시 메모리에 내용을 작성한 다음 호출 vkQueueSubmit(동일한 스레드에서 또는 CPU 측 스레드 간 통신을 통해)하면 해당 제출 호출 (또는 이후 항목)의 모든 명령이 작성한 값을 볼 수 있습니다.
당신이 그들을 표시했다고 가정합니다. 호스트 일관된 메모리에 대한 쓰기는 항상 GPU에 표시되지만 비 일관적인 메모리에 대한 쓰기는에 대한 호출을 통해 표시되어야합니다 vkFlushMappedMemoryRanges.
메모리를 읽는 GPU 프로세스에 비동기 적으로 메모리에 쓰려면 이벤트를 사용해야합니다. 메모리에 기록하고 필요한 경우 표시 한 다음 이벤트를 설정합니다. 여기에서 읽는 GPU 명령 VK_ACCESS_HOST_WRITE_BIT은 소스 액세스 및 VK_PIPELINE_STAGE_HOST_BIT소스 단계로 사용하여 이벤트를 기다립니다 . 대상 액세스 및 단계는 읽는 방법에 따라 결정됩니다.
VULKAN은 알고 아무것도 약을 memcpy. 메모리를 수정하는 방법은 중요하지 않습니다. 규칙에 따라 그렇게하는 데에만 관심이 있습니다.