잡 예약을 할 때 하나의 작업을 수행하는 잡은 하나만 있을 수 있습니다.그러나 많은 오브젝트에 대해 동일한 작업을 수행해야 하는 경우가 있습니다.이렇게 하려면 IJobParallelFor
에서 상속되는 ParallelFor 잡 타입을 사용합니다.
ParallelFor 잡은 데이터 소스로 작동할 데이터의 NativeArray
를 사용합니다.다수의 CPU 코어에서 실행되는 ParallelFor 잡코어당 하나의 잡이 있으며, 각 잡은 워크로드의 서브셋을 처리합니다.
IJobParallelFor
는 IJob
처럼 동작하지만, 단일 Execute
메서드 대신 데이터 소스에서 항목당 한 번씩 Execute
메서드를 호출합니다.또한 Execute
메서드에는 정수 파라미터 인덱스가 있으며, 이를 사용하여 잡 구현 내에서 데이터 원본의 단일 요소에 액세스하고 작업할 수 있습니다.
다음은 ParallelFor 잡 정의의 예입니다.
struct IncrementByDeltaTimeJob:IJobParallelFor
{
public NativeArray<float> values;
public float deltaTime;
public void Execute (int index)
{
float temp = values[index];
temp += deltaTime;
values[index] = temp;
}
}
ParallelFor잡을 예약하려면 분할하려는
NativeArray데이터 소스의 길이를 지정해야 합니다.구조체에 여러 개가 있는 경우 잡 시스템은 데이터 소스로 사용하려는
NativeArray`를 알지 못합니다.길이는 또한 잡 시스템에 예상되는 ‘Execute’ 메서드 수를 알려줍니다.
Unity의 네이티브 코드에서는 ParallelFor
잡의 예약이 더 복잡합니다.Unity가 ParallelFor
잡을 예약하면 잡 시스템이 작업을 배치로 나누어 코어 간에 분배합니다.각 배치에는 ‘Execute’ 메서드의 하위 세트가 포함되어 있습니다.그런 다음 잡 시스템은 Unity의 네이티브 잡 시스템에서 CPU 코어당 하나의 잡을 예약하고 해당 네이티브 잡을 배치에 전달하여 완료합니다.
네이티브 잡이 다른 잡보다 먼저 배치를 완료하면, 다른 네이티브 잡에서 남은 배치를 훔쳐 가져옵니다.캐시 집약성을 보장하기 위해 네이티브 잡의 남은 배치의 절반만 한 번에 훔칩니다.
프로세스를 최적화하려면 배치 수를 지정해야 합니다.배치 수는 사용자가 얻는 잡 수와 스레드 간 작업 재분배의 세분화 정도를 제어합니다.배치 수를 1과 같이 낮게 설정하면 스레드 간에 작업이 고르게 분산됩니다.그러나 약간의 오버헤드가 발생하므로 배치 수를 늘리는 것이 더 나은 경우도 있습니다.1에서 시작하여 성능이 미미하게 향상될 때까지 배치 수를 늘리는 것이 좋은 전략입니다.
다음은 ParallelFor 잡 예약의 예입니다.
잡 코드:
// Job adding two floating point values together
public struct MyParallelJob : IJobParallelFor
{
[ReadOnly]
public NativeArray<float> a;
[ReadOnly]
public NativeArray<float> b;
public NativeArray<float> result;
public void Execute(int i)
{
result[i] = a[i] + b[i];
}
}
메인 스레드 코드:
NativeArray<float> a = new NativeArray<float>(2, Allocator.TempJob);
NativeArray<float> b = new NativeArray<float>(2, Allocator.TempJob);
NativeArray<float> result = new NativeArray<float>(2, Allocator.TempJob);
a[0] = 1.1;
b[0] = 2.2;
a[1] = 3.3;
b[1] = 4.4;
MyParallelJob jobData = new MyParallelJob();
jobData.a = a;
jobData.b = b;
jobData.result = result;
// Schedule the job with one Execute per index in the results array and only 1 item per processing batch
JobHandle handle = jobData.Schedule(result.Length, 1);
// Wait for the job to complete
handle.Complete();
// Free the memory allocated by the arrays
a.Dispose();
b.Dispose();
result.Dispose();
ParallelForTransform
잡은 Transforms에서 작동하도록 특별히 설계된 ParallelFor
잡의 또 다른 타입입니다.이것은 잡에서 Transform 작업을 효율적으로 수행하는 데 유용합니다.자세한 내용은 ParallelForTransform API 문서를 참조하십시오.