오늘은 Burst 컴파일러에 대해 알아보고자 합니다.
공부하면서 스쳐 지나가듯 이름만 들어본 Burst 컴파일.
궁금해서 한번 찾아 정리해 봤습니다.
컴파일러?
특정 프로그래밍 언어의 문서를
다른 프로그래밍 언어로 번역하는 프로그램입니다.
그중 Burst는 유니티 내부에서 사용하고자 만든 컴파일러입니다.
왜 일까요?
유니티는 c#을 토대로 작성하지만
사실 내부 엔진 로직들은 c++로 되어 있습니다.
그래서 실제로 프로그램이 동작하는 과정은
C# - IL( Intermediate Language/ 중간 언어) 생성 - C++ 처리
- Assembly - Machine Code 순으로 동작한다고 합니다.
이 과정에서 IL을 c++로 바꿔주는 과정을 IL2CPP라고 합니다.
Burst의 동작 원리
C# - IL - IR - 최적화된 IR - Assembly - Machine Code
LLVM(Low Level Virtual Machine) 이라는 컴파일러를 통해서
여러 번의 IR( Intermediate Representation )과정을 내부적으로 거치게 됩니다.
IL2CPP나 Burst처럼 프로그램을 실행하기 전에 미리 기계어로 컴파일하는 방식을
AOT( ahead-of-time compile )라고 합니다.
그와 반대되는 JIT(Just In Time / 프로그램 실행 중에 필요한 부분을 그때그때 컴파일)방식도 있는데,
이전에 c#의 컴파일 방식에 대해 글을 작성하면서, 적은 기억이 있어서 남깁니다.
뭔가 재미있지 않나요? 나만 그런가?
아무튼 그래서 Burst를 왜 사용하는 건데
궁금하실 분이 있으실 거 같아서 찾아봤습니다.
Burst의 이점
SIMD(Single instruction Multiple Data)에 맞게 최적화를 해준다.
= 하나의 연산으로 여러 데이터를 동시 처리하는 구조.
ex) Arm NEON, Intel SSE
정리하자면 최적화를 통한 성능 향상을 목적으로 사용하는 것 같습니다.
사용 방법
Unity 2019.3x이후부터는 기본으로 포함되어 있다고 합니다.
자세히 보면 Job에서 Burst를 들어가는 걸 확인 할 수 있습니다.
Open inspecter를 누르면 실제로 Burst 컴파일한 내용들을 확인하실 수 있습니다.
아직은 봐도 잘 모르겠네요;;
코드는 아래의 공식 문서에서 가져왔습니다.
https://docs.unity3d.com/Packages/com.unity.burst@0.2/manual/index.html
Burst User Guide | Package Manager UI website
Burst User Guide Overview Burst is a compiler, it translates from IL/.NET bytecode to highly optimized native code using LLVM. It is released as a unity package and integrated into Unity using the Unity Package Manager. Quick Start Compile a Job with the b
docs.unity3d.com
using Unity.Burst;
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;
public class MyBurst2Behavior : MonoBehaviour
{
void Start()
{
var input = new NativeArray<float>(10, Allocator.Persistent);
var output = new NativeArray<float>(1, Allocator.Persistent);
for (int i = 0; i < input.Length; i++)
input[i] = 1.0f * i;
var job = new MyJob
{
Input = input,
Output = output
};
job.Schedule().Complete();
Debug.Log("The result of the sum is: " + output[0]);
input.Dispose();
output.Dispose();
}
// Using BurstCompile to compile a Job with Burst
[BurstCompile]
private struct MyJob : IJob
{
[ReadOnly]
public NativeArray<float> Input;
[WriteOnly]
public NativeArray<float> Output;
public void Execute()
{
float result = 0.0f;
for (int i = 0; i < Input.Length; i++)
{
result += Input[i];
}
Output[0] = result;
}
}
}
몇 가지 핵심적인 부분들만 간단하게 짚고 넘어가자면
[BurstCompile]이라고 붙은 부분만 Burst 컴파일이 된다고 합니다.
Burst를 사용할 때는 Native라는 형식을 사용해야 하며,
메모리를 자동 처리해 주는 c#과 달리
직접 Dispose()로 메모리를 해제하면서 사용해야 한다고 합니다.
Myjob을 선언할 때 클래스로 안 하고 structure로 한 걸 확인 할 수 있는데
structure를 사용해야만 이점을 얻을 수 있다고 합니다.
일단 오늘은 평소 Burst 컴파일러가 뭔지 궁금해서
간단하게나마 찾은 내용들을 정리해 봤습니다.
실제 프로그래밍하는 자료를 찾고 싶었는데
제가 못 찾는 건지 유튜브에선 다들 설명 위주만 하더군요.
다음에 공식 문서나 자료를 좀 더 자세히 뒤져보고, 공부해 봐야 할 것 같습니다.
또 Job System / ECS, Dots 라는 것과 시너지가 좋다고 하던데,
이것들에 대한 개념도 조만간 정리를 한번 해보겠습니다.
참고한(혹은 참고하면 좋을) 자료
https://www.youtube.com/watch?v=-9X965jXrn8
https://youtu.be/ZuzBOXUuEeM?si=p89Y5JNLIyOgwmIc
https://wolstar.tistory.com/24
유니티(Unity) Job 시스템 사용법-1
https://docs.unity3d.com/kr/2022.1/Manual/JobSystemOverview.html Job시스템에 대해서 알아보자면 Unity C# 잡 시스템을 통해 사용자는 나머지 Unity 기능과 잘 연동하고 수정 코드 작성을 용이하게 해주는 멀티스레
wolstar.tistory.com
'알아보자 시리즈' 카테고리의 다른 글
직렬화(Serialization)/ 역직렬화(Deserialization) (feat. JSON, CSV, XML, YAML) 에 대해 알아보자 (0) | 2024.09.30 |
---|---|
'깃/커밋 컨벤션' 에 대해 알아보자 (0) | 2024.09.10 |
'깃허브'에 대해 알아보자 (0) | 2024.09.09 |
유니티 - Unity Visual Scripting에 대해 알아보자 (0) | 2024.09.04 |
유니티 : 오브젝트 풀링(Object Pooling)에 대해 알아보자 (0) | 2024.08.27 |