[컴] DirectStorage

 

Direct Storage / 다이렉트 스토리지 기술 / 다이렉트 엑스 / 게이밍 / gaming / directx

DirectStorage

최근의 SSD 와 PCIe 기술으리 발전, 특히 NVMe 기술, 은 옛날 하드 드라이브 기술에서 가능한 것 보다 더 높은 대역폭을 전송하는 storage solution 들을 게이밍 pc가 갖게 해준다. “초당 몇십MB” 가 아니라, NVMe 는 “초당 수십GB” 를 가능하게 해준다.

많은 data 양을 shared memory/GPU accessible memory 에 맞추기 위해서는 data loading 최적화가 필요하다.

게임들은 이제, 큰 덩어리로 load 한번에 불러와서 매우 적은 IO request 를 사용하는 것 대신에, 텍스쳐(textures) 같은 asset 들을 작은 조각으로 쪼개서 현재 화면에서 rendering 되야 할 필요한 조각들만 불러온다. 이것은 더 많은 IO request 를 만들지만 좀 더 효율적으로 memroy 를 사용할 수 있고, 더 나은 화면(scene)을 보여준다.

하지만 기존 storage APIs 들은 이런 많은 IO request 에 적합하지 않다. 아주빠른 PC hw 를 사용하고, NVMe drive 를 사용해도, 게임들이 현재의 APIs 를 사용하면 완전히 IO 파이프라인을 사용하지 못하게 되고 귀중한 bandwidth(대역폭) 을 남겨놓게 된다.

그래서 DirectStorage for PC 가 나오게 된 것이다. 이 API 는 PC 게이밍에서 발전하는 storage 와 IO 전망에 대한 응답이다. DirectStorage 는 NVMe drives 이 있는 시스템들을 지원할 것이다.

새로운 api 에서 향상되는 분야는 2가지이다.

  1. 긴 load time 이 줄어줄고
  2. 게임이 이전보다 좀 더 detailed 하고 광활하게(expansive) 하게 된다.

이 2개는 결국 DirectStorage 가 가져오는 IO 시스템발전 에 의해 이뤄진다.

예전에는 초당 몇백개의 IO request 들이 가능했다. 이제는 초당 수만개의 IO request 가 가능하다. 만약 게임에서 50MB/s 로 asset streaming 을 해야한다라고 한다면, 64k block size 로 요청을 하는 경우에, 몇백번의 IO request 가 발생할 것이다. 그런데 NVMe 를 사용해서 더 빠른 asset streaming 를 사용한다고 하면 초당 수십GB 이기 때문에 수만개의 IO request 가 발생한다.

기존의 API 들은 application 이 각각의 request 를 다루게 했다. request 를 보내고, 끝나기를 기다리고, 그리고 그것의 완료를 처리하고 했다. 그런데 이것이 느린 HDD 에서는 큰문제가 안됐다. 하지만 NVMe 처럼 수만개의 IO 가 가능한 환경에서는 이렇게 하는 것은 부하가 된다.

게다가 보통 이 asset 들은 압축되어 있다. CPU 나 GPU 에서 사용하려면 압축을 풀어야 한다. DirectStorage 를 사용하는 것으로 최고의 최신 압축풀기(decompress) 기술과 향후 압축풀기 기술을 사용할 수 있다. 다음 frame 을 위해서 수천개의 block 들을 load 하고 decompress 하는 것이 필요하다. one-at-a-time model(한번에 하나씩 처리하는 model) 에서는 data block 이동의 다양한 지점에서 효율성의 저하가 나온다.

DirectStorage API 는 이 모든것을 고려해서 설계되었고, NVMe 드라이브에서 GPU까지 전체 파이프라인에서 성능을 극대화 한다. 이것은 다음의 방식을 통해 이뤄진다.

  1. request 당 NVMe 오버헤드를 줄이고,
  2. GPU 에게 효과적으로 공급할 수 할 수 있는 batched many-at-a-time 병렬 IO reuqests 를 가능하게 하고,
  3. 작은 IO 완료에 일일이 반응하는 대신에, IO request 완료 의 알림을 받을때 게임들에게 세부적인 제어를 줄 수 있다.

개발자들에게 많은 여러 명령들을 훨씬 효율적으로 더많은 IO request 들을 submit/handle 할 수 있는 효과적인 방법을 제공한다. 그리고 이것들이 궁극적으로 게임을 기다리는 시간을 줄이고, 더 큰, 더 자세한 가상세계를 가져오는 시간을 줄인다.(게임 캐릭터가 그 세계를 이동할 수 있을 만큼 빠르게)

NVME 를 사용하는 이유

NVMe queue라는 하드웨어 데이터 액세스 파이프를 가지고 있다. 드라이브에서 데이터를 가져오기 위해 OS가 드라이브에 요청을 제출하면 데이터가 이러한 queue을 통해 앱으로 전송된다. NVMe 디바이스에는 여러 개의 queue가 있을 수 있고, 각 queue에는 한 번에 많은 request 가 들어갈 수 있다. 최신 게임 작업량의 “병렬 및 일괄 처리 특성” 과 잘 맞는다. DirectStorage 프로그래밍 모델은 기본적으로 개발자에게 고도로 최적화된 하드웨어를 직접 제어할 수 있는 기능을 제공한다.

기존 스토리지 API는 IO 요청을 하는 애플리케이션과 storage 디바이스에서 요청을 이행하는 단계 사이에 많은 ’추가 단계’가 발생했다.(정상적인 IO 작동하는 동안 특정 부분에서 필요한 “데이터 변환”과 같은 것)

“DirectStorage는 지원되는 NVMe 드라이브”와 적절히 구성된 게이밍 기계에서는 이러한 추가 단계가 필요하지 않음을 미리 감지하고 불필요한 검사/작업을 건너뛰게 할 수 있다. 그래서 모든 IO 요청을 더 저렴하게 만들 수 있다.

Reference

  1. DirectStorage is coming to PC | DirectX Developer Blog, 2020-09-01

댓글 없음:

댓글 쓰기