인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

가나파이님의 프로필 이미지

작성한 질문수

삼각형의 실전! Vulkan 중급

Vulkan Semaphore

VkSubmitInfo2에 대해 질문드립니다.

작성

·

34

0

강의에서는 VkSubmitInfo2가 아닌 VkSubmitInfo를 통해 설명을 해주셨는데요. 다른 튜토리얼에서는 VkSubmitInfo2를 사용하고 있었는데 VkSubmitInfo2 구조체에 pWaitSemaphoreInfos와 pSignalSemaphoreInfos 두 가지 세마포어를 세팅해주고 있었습니다. 그리고 이 구조체를 vkQueueSubmit2 함수를 통해 큐에 제출하였는데요. 해당 튜토리얼에서는 엔진에서 graphics queue 하나를 사용하고 있었습니다. 근데 강사님께서는 큐와 큐 간의 동기화를 수행한다고 하셨는데, 큐를 하나 사용하는 경우에 두 개의 세마포어가 필요한 이유가 무엇일까요?

 

참고로 제가 본 튜토리얼은 vkguide 이고 https://vkguide.dev/docs/new_chapter_1/vulkan_mainloop_code/

이 내용이 그것입니다.

답변 2

1

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 가나파이님.

Vulkan의 VkSubmitInfo2vkQueueSubmit2에 대한 질문을 주셨네요. VkSubmitInfo2 및 관련 구조체들은 특히 서로 다른 작업 간의 보다 정교한 동기화 및 스케줄링을 가능하게 하기 위한 새로운 API입니다. 주로 여러 큐의 동시 작업을 관리할 때 사용되지만, 하나의 큐에서도 각 작업 간의 관계를 명확히 지정할 수 있습니다.

pWaitSemaphoreInfospSignalSemaphoreInfos는 각각 작업이 시작되기 전에 대기해야 하는 세마포어와 작업이 끝난 후 신호를 보내는 세마포어를 나타냅니다. 이 두 가지 세마포어를 통해 Vulkan은 도착 순서를 명확히 이해하고 작업을 효율적으로 처리합니다.

하나의 큐를 사용하는 경우에도 두 세마포어가 필요한 이유는 다음과 같습니다:

  1. 프레임 동기화: 하나의 큐에서도 프레임 간의 순서를 제어하기 위해 사용할 수 있습니다. GPU에 명령을 제출할 때, 이전 프레임의 작업이 완전히 끝났음을 보장해야 하는 경우가 있습니다. 이 경우 대기 세마포어는 이전 프레임의 완료를 기다리고, 신호 세마포어는 현재 프레임의 완료를 알립니다.

  2. 리소스 접근 제어: 동일한 리소스를 여러 번 업데이트 해야 하는 경우, 대기 세마포어와 신호 세마포어를 사용해 작업 간의 순서를 제어하여 리소스 충돌을 방지할 수 있습니다.

참고로 제공해 주신 vkguide의 튜토리얼에서도 이와 같은 개념을 설명하고 있으니, 세마포어가 같은 큐 내에서도 어떻게 동기화에 사용되는지에 대해 더 많은 예제를 확인해보실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공융자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0

삼각형님의 프로필 이미지
삼각형
지식공유자

안녕하세요?

VkSubmitInfo2VkSubmitInfo의 차이는 VkSubmitFlags flags가 있냐 없냐의 차이입니다. 원래는 있어야 했는데 스펙을 정의하면서 빼먹은 것이죠... VkSubmitFlags를 지정하지 않을 것이면 VkSubmitInfo 를 쓰셔도 무방합니다.

일반적으로는 Gracphis Queue에서 모든 작업이 가능합니다. 하지만 특수한 경우에는 Graphics Queue, Present Queue, Copy Queue를 따로 잡아서 사용해야 하는 경우가 생깁니다. 이 경우 각각 Queue끼리의 동기화가 필요합니다. Present Queue에서 쓰고 있는데 Graphics Queue에서 특정 계산을 수행하면 안되니까요.

Queue를 제출할 때, 세마포어가 2개 필요한 이유는 간단합니다. 하나는 지금 제출하는 커맨드 버퍼가 실행되기 전에 반드시 수행되어야 하는 세마포어 그리고 다른 하나는 다른 커맨드 버퍼가 현재 제출한 커맨드 버퍼가 실행되고 나서 처리되어야 하는데 이 시점을 알려주기 위한 세마포어입니다.

감사합니다.