해결된 질문
작성
·
264
0
- 출장이 잦아서, 답변에 시간이 좀 걸릴 수도 있습니다. 양해 바랍니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
선생님 너무 좋은 강의 다시 한번 감사드립니다. 다름이 아니고, video에서 각각의 frame별로 filter를 처리하는 부분을 cuda도 구현하는 코드를 짠다고 가정할 때, 각 프레임은 W x H x C ( rbg) 의 차원을 가지고 있고 영상이기 때문에 영상은 W x H x C x T 의 차원을 가지고 있을 겁니다. 그렇다면, cudaMalloc3D나 cudaMemecpy3D 부분을 사용해서 각 frame을 처리하고 ( device ) 나머지는 for 문 ( host ) 으로 시간에 따라 frame을 device로 보내도록 구현하였습니다. 그런데 혹시 시간 부분 까지 device에서 처리할 수 있는 방법이 있는 지가 궁금합니다.
답변 1
1
안녕하세요.
이미지 처리, 비디오 처리 분야도 CUDA 에서 많이 다루는 문제입니다.
보통, cudaMalloc3D( ) 로 메모리 영역을 잡게 될 것인데, 말씀하신대로, W x H x C x T 까지 고려하면, 4개의 차원이 되어서, 좀 애매한 상황이 생길 수 있습니다.
제가 많이 사용하는 방법은, pixel 당 RGBA 로, 4바이트 integer 를 할당하면, 0xRRGGBBAA 또는 0xAABBGGRR 형태로 저장될 겁니다.
이렇게 하면, data type 을 바이트가 아니라, 4 바이트 integer 로 바꾸면서, C 차원을 생략해도 되어서,
W x H 짜리 2차원 이미지로 되고, T 차원까지 고려하면, 3차원이 되어서, cudaMalloc3D( ) 로 메모리 관리가 가능할 것입니다.
픽셀마다의 access 패턴으로 보아도, 이쪽이 속도가 빠를 겁니다.
RGB 만 쓰더라도, A에 해당하는 1 바이트를 버려도, integer 단위로 자료를 주고 받는게 빠르다는 점을 고려해야 할 겁니다.
감사합니다.🍀