⭐ Vulkan & CMake/Vulkan

[Vulkan] Command

Designerd 2024. 8. 5. 12:51

 

 

 

목차

     

     



    인프런 삼각형님의 '삼각형의 실전! Vulkan 중급' 강의를 참고하였습니다. 

    😎 [삼각형의 실전! Vulkan 중급] 강의 들으러 가기!

     

     

     

     

    Command


     

     

    Command란?

     

    Command는 ' 사용자가 컴퓨터에게 특정 작업을 수행하도록 지시하는 입력 '이다.

     

    glUseProgram(program);
    glBindVertexArray(vertexArray);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0)
    glBindVertexArray(0);
    glUseProgram(0);

    위의 코드는 OpenGL의 코드다. 

    program을 사용하고 vertexArray를 바인딩하고 primitive를 드로우하고 있다.

    각 API의 호출이 GPU에게 특정 작업을 수행하도록 지시하고 있다. 이런 지시들이 Command다. (단, OpenGL에는 Command란 용어를 사용하지 않는다.)


     

     

    Vulkan 아키텍처

     

    Vulkan에서 GPU에 명령을 내리는 과정

     

    Vulkan은 멀티 스레드를 지원하기 위해서 Command buffer에 Command를 기록하고 Queue에 제출하는 아키텍처를 사용한다.

    • Vulkan은 Command를 CPU에서 GPU로 효율적으로 전달할 수 있다.
    • Command buffer를 사용하면 여러 Command를 묶어서 한 번에 GPU로 전송할 수 있다. 따라서, CPU와 GPU 간의 커뮤니케이션 오버헤드를 줄이고 어플리케이션 성능을 최적화할 수 있다.

     

    동시에 여러 개의 Comman buffer에 Command를 기록할 수 있다.

    • OpenGL과의 차이점. OpenGL에서는 API 호출을 통해 Command가 기록되며 어플리케이션이 어느 Comman buffer에 Command를 기록할지 직접 제어할 수 없다. OpenGL은 멀티스레딩을 활용하는데 제한이 있다.
    • 반면 Vulkan은 개발자가 어느 Command buffer에 기록할지를 정할 수 있게 하여 멀티스레딩을 통해 동시에 여러 커맨드 버퍼에 커맨드를 기록하는 것을 가능하게 한다. 멀티스레드 환경에서의 성능 최적화에 유리하고 복잡한 그래픽스 작업이나 대규모 어플리케이션에 유용하다.

     

    제출한 Command buffer와 기록한 Command순차적인 실행보장된다. 하지만 순차적인 종료보장않는다.

    • 예를 들어, Command buffer 1과 Command buffer 2가 제출되었다고 가정하자. 위의 이미지처럼, 각 Command는 제출된 순서대로 실행이 되지만 Command buffer 2의 Command들이 처리 속도가 더 빨라 Command buffer 1의 Command들보다 먼저 완료될 될수 있다. 만약 Command buffer 2가 Command buffer 1의 결과에 의존을 하고 있다면 이로 인해 문제가 발생할 수 있다.
    • 이러한 상황을 방지하기 위해 Vulkan에서는 여러 동기화 메커니즘을 제공한다.

     

     

    Vulkan에서 멀티스레딩을 통해 Command buffer의 Command를 기록하는 과정

     

    멀티스레드를 활용하여 빠른 시간 내에 많은 Command buffer를 기록하여 GPU를 바쁘게 일하게 만든다.


     

     

    멀티스레드 지원이 중요한 이유

     

    CPU가 GPU에 충분한 명령을 공급하지 못해 GPU가 쉬고 있는 모습

     

    성능 문제의 대부분은 CPU Bound(=CPU가 GPU에 충분히 명령을 공급하지 못하여 발생하는 현상) 때문이다.

    이러한 문제는 렌더링 엔진에서 자주 발견되는 병목 현상이다. OpenGL에서는 이런 병목 현상이 자주 발생한다. OpenGL은 싱글 스레드에서 모든 것을 처리해야 하기 때문에 CPU 바운드가 걸리기 쉽다.

     

    반면 Vulkan은 멀티스레딩을 통해 각 스레드에서 병렬적으로 Command buffer를 기록할 수 있게 함으로써 CPU의 각 코어를 효율적으로 활용할 수 있다. 이는 CPU의 작업량을 분산시키고 GPU를 항상 바쁘게 만들어 성능 향상에 기여한다.