cuda 영상처리 예제

 

신용: main.cpp: GL 함수 / NVIDIA cuda 샘플 코드 convolution.cu 에서 가져온 이미지 루프의 아이디어 : cuda 샘플 코드에서 convolutionSeparable.pdf를 기반으로 구현 된 알고리즘과 https://web.archive.org/web/20060718054020/http://www.acm.uiuc.edu/siggraph/workshops/wjarosz_convolution_2001.pdf 알고리즘의 병렬 구현이 프로그램은 CUDA 장치에서 실행되기 때문에 이미지 데이터를 GPU에 복사해야합니다. 또한 이 알고리즘에서는 결과를 작성하기 위해 최종 메모리와 함께 원본 데이터의 복사본이 필요합니다. 따라서 이미지가 GPU에 복사된 다음 해당 이미지가 GPU 에서 GPU 메모리 복사본으로 GPU의 다른 위치에 복사됩니다. 커널이 호출되고 마지막으로 결과 이미지를 호스트로 다시 복사할 수 있습니다. 이제 이미지에서 프로그램을 실행하고 출력 이미지를 보십시오. 흐릿한, 응? 이 프로세스의 용이성을 보여주기 위해 이미지 소용돌이 알고리즘 자습서에서 일부 코드를 가져와 CUDA에서 실행되도록 수정했습니다. i 및 j 계산 이외에는 핵심 알고리즘 코드를 변경할 필요가 없었습니다! 샘플 lena.ppm을 사용하거나 자신의 ppm 이미지 파일 단일 고화질 이미지가 2백만 픽셀 이상을 가질 수 있어야합니다. 대부분의 이미지 처리 알고리즘에는 픽셀당 수십 개의 부동 포인트 계산이 필요하므로 CPU 중 가장 빠른 경우에도 실행 시간이 느려질 수 있습니다. CPU의 느린 속도는 생산성에 심각한 장애물, CUDA 가능한 그래픽 카드 없이 포토샵을 사용 하는 사람으로 당신을 말할 것 이다. CUDA에서는 일반적으로 픽셀당 정확히 하나의 스레드를 생성할 수 있습니다.

각 스레드는 정확히 한 픽셀의 최종 색상을 계산합니다. 이미지는 자연스럽게 2차원이므로 각 스레드 블록을 2차원으로 만드는 것이 합리적입니다. 32 × 16은 각 스레드 블록이 512 개의 스레드를 실행할 수 있기 때문에 좋은 크기입니다. 그런 다음 전체 이미지를 덮기 위해 필요에 따라 x 및 y 차원에서 많은 스레드 블록을 생성합니다. 예를 들어 1024×768 이미지의 경우 스레드 블록의 그리드는 32×48이며 각 스레드 블록에는 32×16 스레드가 있습니다. 상승 할 수있는 한 가지 질문은 스레드 블록이 32 × 32 크기조차도 좋지 않은 이유입니다. 그 이유는 1.3 이하의 컴퓨팅 기능의 CUDA 장치가 블록당 최대 512개의 스레드를 가질 수 있기 때문입니다. 2.0 이상의 컴퓨팅 기능을 갖춘 Cuda 장치는 CUDA의 몇 가지 상당한 하드웨어 향상으로 인해 블록당 최대 1024개의 스레드를 가질 수 있습니다. 따라서 코드를 모든 CUDA 장치와 호환하려면 블록당 512 개 이하의 스레드를 가져야합니다.

그러나 슈퍼 컴퓨터 또는 하드웨어 구성을 아는 개인용 컴퓨터에서만 프로그램을 실행하는 경우 블록당 1024개의 스레드를 모두 자유롭게 사용할 수 있습니다. 필터링을 위해 이미지를 로드하고 저장하기 위해 lodepng를 사용하고 있습니다. 그것은 쉽게 매우 쉽고, 종속성이 없으며, 그냥 작동합니다. 예제 코드에서 명령줄 매개 변수의 입력 및 출력 이미지에 대한 파일 이름을 읽고 있습니다. 나는 그래픽과 이미지 처리를 좋아한다. 그래서 나는 일부 멀티 스레드 프로그래밍에 캐피틸화하기 위해 NVIDIAs CUDA와 함께 조금 만지작하고있다. 이미지 처리를 위해 CUDA와 힘을 시험해보고 싶은 사람들을 위해 작은 스타터 에디션을 만들었습니다. 이것은 CUDA를 통해 NVIDIA GPU의 병렬성을 활용 하는 여러 이미지 처리 알고리즘의 구현.

구현된 알고리즘은 다음과 같습니다: 데이터를 할당하고 GPU에 복사합니다. 커널이 읽을 수 있도록 GPU의 데이터가 필요합니다.