Version: 2022.3
언어: 한국어
잡 종속성
멀티플레이어 및 네트워킹

병렬 잡

잡 예약을 할 때 하나의 작업을 수행하는 잡은 하나만 있을 수 있습니다.그러나 많은 오브젝트에 대해 동일한 작업을 수행해야 하는 경우가 있습니다.이렇게 하려면 IJobParallelFor에서 상속되는 ParallelFor 잡 타입을 사용합니다.

ParallelFor 잡은 데이터 소스로 작동할 데이터의 NativeArray를 사용합니다.다수의 CPU 코어에서 실행되는 ParallelFor 잡코어당 하나의 잡이 있으며, 각 잡은 워크로드의 서브셋을 처리합니다.

IJobParallelForIJob처럼 동작하지만, 단일 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 잡 예약

ParallelFor잡을 예약하려면 분할하려는NativeArray데이터 소스의 길이를 지정해야 합니다.구조체에 여러 개가 있는 경우 잡 시스템은 데이터 소스로 사용하려는NativeArray`를 알지 못합니다.길이는 또한 잡 시스템에 예상되는 ‘Execute’ 메서드 수를 알려줍니다.

Unity의 네이티브 코드에서는 ParallelFor 잡의 예약이 더 복잡합니다.Unity가 ParallelFor 잡을 예약하면 잡 시스템이 작업을 배치로 나누어 코어 간에 분배합니다.각 배치에는 ‘Execute’ 메서드의 하위 세트가 포함되어 있습니다.그런 다음 잡 시스템은 Unity의 네이티브 잡 시스템에서 CPU 코어당 하나의 잡을 예약하고 해당 네이티브 잡을 배치에 전달하여 완료합니다.

여러 코어 간에 배치를 나누는 ParallelFor 잡
여러 코어 간에 배치를 나누는 ParallelFor 잡

네이티브 잡이 다른 잡보다 먼저 배치를 완료하면, 다른 네이티브 잡에서 남은 배치를 훔쳐 가져옵니다.캐시 집약성을 보장하기 위해 네이티브 잡의 남은 배치의 절반만 한 번에 훔칩니다.

프로세스를 최적화하려면 배치 수를 지정해야 합니다.배치 수는 사용자가 얻는 잡 수와 스레드 간 작업 재분배의 세분화 정도를 제어합니다.배치 수를 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 잡

ParallelForTransform 잡은 Transforms에서 작동하도록 특별히 설계된 ParallelFor 잡의 또 다른 타입입니다.이것은 잡에서 Transform 작업을 효율적으로 수행하는 데 유용합니다.자세한 내용은 ParallelForTransform API 문서를 참조하십시오.

잡 종속성
멀티플레이어 및 네트워킹