Unity Job System - Batch 와 자잘한 Tip

이장근·2023년 4월 16일
0

Unity DOTS

목록 보기
4/6
post-thumbnail

Unity Job System - Batch 와 자잘한 Tip

Batch를 할당하는 대략적인 방법..!

적당한 Batch Size: CPU의 가장 빠른 L1 캐시 메모리는 보통 32KB이므로, Batch의 크기는 32KB이하로 설정하는 것이 좋습니다. 따라서, [32KB / 요소의 크기]가 적당한 Batch Size라고 생각됩니다.

적당한 Batch 개수: [총 원소 수 / BatchSize] - 소수점 올림, 정수 (단, Batch 개수는 CPU 개수를 초과할 수 없다.)

[ 배치를 할당하는 예시 ]

float[] data = new float[10000];
NativeArray<float> result = new NativeArray<float>(10000, Allocator.TempJob);

var job = new MyJob 
{
    data = new NativeSlice<float>(data),
    result = result
};

var scheduleParams = new JobsUtility.JobScheduleParameters(
    UnsafeUtility.AddressOf(ref job), 
    MyJob.JobStructSize,
    2, // Batch Num
    new JobHandle()
);

JobHandle jobHandle = JobsUtility.ScheduleParallelFor(ref scheduleParams, job.data.Length, 8000);

가장 중요한 C# Job System Tips

• Static Data 액세스 피하기: 잡 시스템에서 제공하는 안전 시스템을 모두 회피하게 됩니다. 한마디로 위험!
• NativeContainer 컨텐츠를 직접 업데이트 하지 않기: NativeContainer는 복사된 데이터를 넘겨주므로 직접 값을 변경하는 것은 의미가 없다. (예: NativeContainer[0]++;) 값을 변경후 다시 덧씌워야 변경 사항이 적용된다.(예: NativeContainer[0] = 10;)
• JobHandle.Complete를 호출하기: 이를 호출해야만 메인 스레드가 네이티브 컨테이너 타입의 소유권을 다시 사용할 수 있으며, 종속성이 완료됩니다. 또 Complete를 호출해야 안전 시스템의 상태도 정리되며, 하지 않으면 메모리 누수가 발생합니다.
• 메인스레드에서 예약 및 완료: 이는 "Job에서 Job을 예약하지 않기"와 같습니다. 메인 스레드에서 JobHandle을 이용하여 종속성 관리를 해야합니다.
• [ReadOnly] 속성 적극 활용하기: 쓰기 권한에 대한 구분을 명확히 하는것은 쓰레드 성능 향상의 기본이됩니다.
• Job에서 메모리 할당하지 않기: Burst에서 언급했던 것과 같은 맥락인 것 같습니다. Job 내에서 관리되는 메모리 할당은 퍼포먼스를 크게 저하시킵니다.
profile
Red Queen's Paradox

0개의 댓글