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 경계 알고리즘은 두 개의 직교 필터 커널인 k
와 k'
을 사용하여 입력 영상의 가로 방향 기울기 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
함수에 대한 입력 인수로 grayImage
와 threshold
를 선언하고 반환 값으로 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. 구성 파라미터 대화 상자를 엽니다. 솔버 창을 엽니다. GPU 가속을 위해 모델을 컴파일하려면 가변 스텝 또는 고정 스텝 솔버를 사용할 수 있습니다. 이 모델에서 유형 파라미터는 Fixed-step
이고 솔버는 discrete (no continuous states)
입니다.
2. 왼쪽 창에서 시뮬레이션 타깃을 클릭한 다음 GPU 가속 파라미터를 활성화합니다. 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) 항목을 참조하십시오.
참고 항목
함수
open_system
(Simulink) |load_system
(Simulink) |save_system
(Simulink) |close_system
(Simulink) |bdclose
(Simulink) |get_param
(Simulink) |set_param
(Simulink) |sim
(Simulink) |slbuild
(Simulink)
관련 항목
- Code Generation from Simulink Models with GPU Coder
- GPU Code Generation for Deep Learning Networks Using MATLAB Function Block
- GPU Code Generation for Blocks from the Deep Neural Networks Library
- Targeting NVIDIA Embedded Boards
- Numerical Equivalence Testing
- Parameter Tuning and Signal Monitoring by Using External Mode
- GPU Code Generation for Lane Detection in Simulink
- GPU Code Generation for a Fog Rectification Simulink Model