Main Content

GPU Coder를 사용하여 시뮬레이션 속도 가속화하기

GPU Coder™를 사용하면 MATLAB Function (Simulink) 블록이 포함된 Simulink® 모델의 실행 속도를 높일 수 있습니다. GPU 가속 시뮬레이션은 Deep Learning Toolbox™의 Deep Neural Networks 라이브러리의 블록이나 Computer Vision Toolbox™의 Analysis and Enhancement 라이브러리의 블록이 포함된 모델에서도 작동합니다. GPU 가속 시뮬레이션을 수행하려면 CUDA® 지원 NVIDIA® GPU가 필요합니다.

GPU 가속 시뮬레이션을 활성화하면, MATLAB Function 블록으로부터 CUDA MATLAB® 실행 파일(MEX) 코드를 분할, 생성하고 이 생성된 코드를 시뮬레이션 중에 Simulink에 동적으로 연결합니다. 생성 코드에는 수천 개의 GPU 코어에서 병렬로 실행되는 CUDA 커널이 포함되어 있습니다. 또한 CPU에서 실행되는 순차적인 코드 섹션도 포함되어 있습니다.

GPU 가속 시뮬레이션을 수행하려면 다음을 수행해야 합니다.

  • 모델을 만들거나 엽니다. 애플리케이션의 계산 집약적인 부분을 MATLAB Function 블록으로 옮깁니다.

  • 솔버, 언어 및 기타 GPU 관련 구성 파라미터를 선택합니다.

  • GPU 가속 모델을 실행합니다.

Sobel 경계 검출 가속화하기

이 예제에서는 Sobel 경계 검출 모델의 GPU 가속 시뮬레이션을 수행하는 방법을 보여줍니다. 경계 검출 모델은 MATLAB Function 블록을 사용하여 검출 알고리즘을 구현합니다.

Sobel 경계 검출

Sobel 경계 검출 알고리즘은 회색조 영상에서 2차원 공간 기울기 연산을 수행합니다. 이 알고리즘은 입력 영상에서 경계에 해당하는 고주파수 공간 영역을 강조합니다.

Sobel 경계 알고리즘은 두 개의 직교 필터 커널인 kk'을 사용하여 입력 영상의 가로 방향 기울기 H와 세로 방향 기울기 V를 계산합니다. 필터링 연산 후에는 기울기 크기를 계산하고 임계값을 적용하여 영상에서 경계로 식별되는 영역을 찾습니다.

img = imread('peppers.png');
threshold = 100;
k = single([1 2 1; 0 0 0; -1 -2 -1]);
H = conv2(img(:,:,2),k, 'same');
V = conv2(img(:,:,2),k','same');
E = sqrt(H.*H + V.*V);
edgeImage = uint8((E > threshold) * 255);

h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);

image(ax1,img);
xticks(ax1,[]);
yticks(ax1,[])
title(ax1,'Test Image')

image(ax2,repmat(edgeImage,[1 1 3]));
xticks(ax2,[]);
yticks(ax2,[])
title(ax2,'Edge Detected Image')

경계 검출 모델 만들기

1. Simulink 모델을 생성하고 User-Defined Functions 라이브러리에서 두 개의 MATLAB Function 블록을 가져와 삽입합니다.

2. Constant 블록을 추가하고 값을 0.4로 설정합니다.

3. Computer Vision Toolbox™ 라이브러리의 From Multimedia File 블록을 추가합니다.

4. From Multimedia File 블록을 열고 파일 이름 파라미터를 rhinos.avi로 설정합니다. 영상 신호 파라미터를 One multidimensional signal(한 개의 다차원 신호)로 설정합니다.

5. Computer Vision Toolbox 라이브러리에서 Video Viewer 블록 두 개를 모델에 추가합니다.

다음을 입력하여 이들 블록이 포함된 모델을 엽니다.

open_system("edgeDetectionInitial")

6. MATLAB Function 블록 중 하나를 더블 클릭합니다. 디폴트 함수 시그니처가 MATLAB Function 블록 편집기에 나타납니다.

7. Sobel 경계 검출 알고리즘을 구현하는 sobel이라는 함수를 정의합니다. 함수 헤더는 sobel 함수에 대한 입력 인수로 grayImagethreshold를 선언하고 반환 값으로 edgeImage를 선언합니다.

편집기 문서를 저장합니다.

function edgeImage  = sobel(grayImage,threshold)   %#codegen
% Define Kernel for Sobel edge detection
k = single([1 2 1; 0 0 0; -1 -2 -1]);
% Detect Edge
H = conv2(single(grayImage),k, 'same');
V = conv2(single(grayImage),k','same');
E = sqrt(H.*H + V.*V);
edgeImage = uint8((E > threshold) * 255);
end

8. MATLAB Function 블록의 블록 파라미터를 엽니다. 코드 생성 탭에서 함수 패키징 파라미터를 Reusable function(재사용 가능 함수)으로 설정합니다. 함수 패키징 파라미터를 다른 값으로 설정하면 CUDA 커널이 생성되지 않을 수 있습니다.

9. 다른 MATLAB Function 블록을 수정하여 RGB에서 회색조로 변환을 구현합니다. MATLAB Function 블록의 함수 패키징 파라미터를 Reusable function(재사용 가능 함수)으로 설정합니다.

function gray = RGB2gray(RGB)   %#codegen
% Convert color image to grey image
gray = (0.2989 * double(RGB(:,:,1)) + ...
        0.5870 * double(RGB(:,:,2)) + ...
        0.1140 * double(RGB(:,:,3)));
end

10. 이들 블록을 아래 다이어그램과 같이 연결합니다. 모델을 edgeDetection.slx로 저장합니다. 다음을 입력하여 사전 구성된 모델을 엽니다.

open_system("edgeDetection");

11. 모델에 오류가 있는지 테스트하기 위해 모델을 시뮬레이션합니다. 툴스트립에서 실행을 클릭합니다.

시뮬레이션 중에 모든 비디오 프레임을 보기 위해 Video Viewer 블록을 열고 시뮬레이션 > 성능 향상을 위해 프레임 생략을 비활성화합니다.

set_param('edgeDetection', 'SimulationMode', 'Normal');
sim('edgeDetection');

GPU 가속을 위한 모델 구성하기

모델 구성 파라미터는 시뮬레이션 중에 사용되는 가속화 방법을 결정합니다.

1. 구성 파라미터 대화 상자를 엽니다. 솔버 창을 엽니다. 가속화를 위해 모델을 컴파일하고 CUDA 코드를 생성하려면 고정 스텝 솔버를 사용하도록 모델을 구성합니다. 다음 표는 이 예제의 솔버 구성을 보여줍니다.

2. 왼쪽 창에서 시뮬레이션 타깃을 클릭한 다음 GPU 가속 파라미터를 활성화합니다.

참고: 언어 파라미터는 자동으로 C++로 설정됩니다.

3. 원하는 경우 시뮬레이션 타깃 > GPU 가속을 클릭하여 GPU 관련 옵션을 확인하고 수정합니다. 이 예제에서는 해당 파라미터에 모두 디폴트 값을 사용할 수 있습니다.

4. 확인을 클릭하여 구성 파라미터 대화 상자를 저장하고 닫습니다.

또는 MATLAB 명령 창에서 set_param 함수를 사용하여 모델 파라미터를 프로그래밍 방식으로 구성할 수 있습니다.

set_param('edgeDetection','SolverType','Fixed-step');
set_param('edgeDetection','SolverName','FixedStepDiscrete');
set_param('edgeDetection','FixedStep','auto');
set_param('edgeDetection','GPUAcceleration','on');

GPU 가속 모델 빌드하기

GPU 가속 모델을 빌드하고 시뮬레이션하려면 실행을 클릭하거나 다음 명령을 사용합니다.

sim('edgeDetection');

소프트웨어는 먼저 모델에 대해 CUDA 코드가 이전에 컴파일되었는지 확인합니다. 이미 코드가 생성되어 있으면 모델을 실행합니다. 아직 코드가 빌드되지 않았다면, 먼저 CUDA 코드를 생성하고 컴파일한 다음 모델을 실행합니다. 코드 생성 툴은 생성 코드를 작업 폴더의 하위 폴더인 slprj/_slprj/edgeDetection에 저장합니다.

제한 사항

  • Stateflow® 차트 내의 MATLAB Function에 대해서는 GPU 코드 생성이 지원되지 않습니다.

  • GPU 가속을 활성화하면, 시뮬레이션 타깃 > 고급 파라미터 > 사용자 지정 코드 가져오기 파라미터를 사용하여 사용자 지정 CUDA 소스 파일(*.cu)을 가져올 수 없습니다. 대신 MATLAB Function 블록 내에서 coder.ceval을 사용하십시오.

  • MATLAB Function 블록은 MATLAB 언어의 일부 데이터형을 지원하지 않습니다. 지원되는 데이터형은 MATLAB Function (Simulink) 항목을 참조하십시오.

참고 항목

함수

관련 항목