"Use GPU-accessible memory to store sampling data."
샘플링 데이터를 저장하기 위해 GPU가 접근 가능한 메모리를 사용합니다.
카운터 집합을 샘플링하려면, GPU가 데이터를 쓸 수 있는 위치에 두는 것이 필요합니다. GPU가 메모리 접근을 필요하는 다른 곳처럼, 데이터를 갖기 위해 Metal 리소스(카운터 샘플 버퍼)를 사용하게 됩니다. 샘플을 Metal 리소스에 저장하기까지, 카운터 집합을 샘플링할 때 Metal은 비용이 많이 드는 CPU-GPU 싱크를 피합니다.
카운터 샘플 버퍼는 GPU에 따라 달라지는 private 데이터 포맷을 사용합니다. 샘플 데이터에 접근하려면, 샘플링 후 어느 시점에서는 Metal에게 해당 데이터를 일반적인 포맷으로 변환하도록 알려줘야 합니다.
아래 예시는 렌더링 앱을 위한 타임스탬플르 저장하기 위해 카운터 샘플 버퍼를 생성하는 예시입니다. MTLCounterSampleBuffer
객체를 생성하려면 코드는 MTLCounterSampleBufferDescriptor
를 초기화하고 이것의 속성을 카운터 집합, 저장 모드, 버퍼의 용량을 선택하도록 설정합니다.
__autoreleasing NSError* error = nil;
MTLCounterSampleBufferDescriptor* timestampSamplerDesc = [[MTLCounterSampleBufferDescriptor alloc] init];
timestampSamplerDesc.counterSet = timestampCounterSet;
timestampSamplerDesc.storageMode = MTLStorageModeShared;
timestampSamplerDesc.sampleCount = 4;
id< MTLCounterSampleBuffer > rendererTimestampCounterSampleBuffer = [device newCounterSampleBufferWithDescriptor:timestampSamplerDesc error:&error];
코드를 보면 아래 내용을 수행합니다.
MTLStorageMode.shared
저장 모드를 구체화해서 앱이 샘플 데이터를 CPU가 접근할 수 있는 메모리로 해석할 수 있습니다. 오직 GPU에서만 카운터 데이터를 작업하고 있다면 MTLStorageMode.private
을 선택해야 합니다.makeCounterSampleBuffer(descriptor:)
메소드를 호출합니다.Metal 명령을 인코딩할 때 언제 카운터를 샘플링할지 결정합니다.
https://developer.apple.com/documentation/metal/counter_sampling/sampling_gpu_data_into_counter_sample_buffers
https://velog.io/@panther222128/Sampling-GPU-Data-into-Counter-Sample-Buffers
카운터 샘플 버퍼 생성을 위해 사용되는 설정입니다.
https://developer.apple.com/documentation/metal/mtlcountersamplebufferdescriptor
https://velog.io/@panther222128/MTLCounterSampleBufferDescriptor