공식 문서 번역 006-함수 및 라이브러리
함수 및 라이브러리
이 장에서는 MTLFunction 객체를 Metal 셰이더 또는 계산 함수의 참조로 만드는 방법과 MTLlibrary 객체가 있는 함수를 구성하고 액세스하는 방법에 대해 설명합니다.
MTLFunction은 셰이더 또는 컴퓨팅 기능을 나타냅니다.
MTLFunction 객체는 Metal 음영처리된 언어로 작성된 별도의 기능을 나타내며 GPU에서 그래픽이나 계산 흐름선의 일부로 수행됩니다.Metal 음영처리 언어에 대한 자세한 내용은 "Metal 음영처리 언어 안내서"를 참조하십시오.
Metal 실행 시간과 Metal 음영처리 언어로 작성된 그래픽이나 계산 함수 사이에 데이터 또는 상태를 전달하려면 텍스쳐, 버퍼 및 샘플러에 매개변수 색인을 지정합니다.매개 변수 인덱스는 메탈이 실행될 때 메탈 착색 코드와 인용하는 무늬, 버퍼, 샘플러를 표시합니다.
렌더링 패스의 경우 렌더링 파이프 작성 상태에 설명된 대로 MTLFunction 객체 중 정점 또는 세그먼트 셰이더로 사용되는 MTLRenderPipelineDescriptor 객체를 MTLFunction 객체에 지정할 수 있습니다.계산 과정에 대해 MTLFunction은 MTLComputePipeline State에서 대상 장치에 대상을 만들 때 대상을 지정할 수 있습니다. 예를 들어 "계산 명령 인코더에 계산 상태와 자원을 지정합니다."와 같습니다.
하나의 Library는 하나의 함수 라이브러리입니다.
MTLlibrary 객체는 하나 이상의 저장소 MTLFunction 객체를 나타냅니다.단일 MTLFunction 객체는 음영처리된 언어로 작성된 메탈 함수를 나타냅니다.Metal 착색 언어 소스 코드에서는 Metal 함수 한정자 (vertex,fragment,kernel) 를 사용하여 MTL Function을 대표하는 라이브러리의 대상을 사용할 수 있습니다.이러한 함수 한정자 중 하나가 없는 메탈 함수는 착색기의 다른 함수로 호출될 수 있지만 MTLFunction 대상에서 직접 표시할 수 없습니다.
MTLFunction은 다음 중 하나에서 라이브러리의 객체를 작성할 수 있습니다.
MTLFunction 객체는 Metal 음영처리된 언어로 작성된 별도의 기능을 나타내며 GPU에서 그래픽이나 계산 흐름선의 일부로 수행됩니다.Metal 음영처리 언어에 대한 자세한 내용은 "Metal 음영처리 언어 안내서"를 참조하십시오.
Metal 실행 시간과 Metal 음영처리 언어로 작성된 그래픽이나 계산 함수 사이에 데이터 또는 상태를 전달하려면 텍스쳐, 버퍼 및 샘플러에 매개변수 색인을 지정합니다.매개 변수 인덱스는 메탈이 실행될 때 메탈 착색 코드와 인용하는 무늬, 버퍼, 샘플러를 표시합니다.
렌더링 패스의 경우 렌더링 파이프 작성 상태에 설명된 대로 MTLFunction 객체 중 정점 또는 세그먼트 셰이더로 사용되는 MTLRenderPipelineDescriptor 객체를 MTLFunction 객체에 지정할 수 있습니다.계산 과정에 대해 MTLFunction은 MTLComputePipeline State에서 대상 장치에 대상을 만들 때 대상을 지정할 수 있습니다. 예를 들어 "계산 명령 인코더에 계산 상태와 자원을 지정합니다."와 같습니다.
하나의 Library는 하나의 함수 라이브러리입니다.
MTLlibrary 객체는 하나 이상의 저장소 MTLFunction 객체를 나타냅니다.단일 MTLFunction 객체는 음영처리된 언어로 작성된 메탈 함수를 나타냅니다.Metal 착색 언어 소스 코드에서는 Metal 함수 한정자 (vertex,fragment,kernel) 를 사용하여 MTL Function을 대표하는 라이브러리의 대상을 사용할 수 있습니다.이러한 함수 한정자 중 하나가 없는 메탈 함수는 착색기의 다른 함수로 호출될 수 있지만 MTLFunction 대상에서 직접 표시할 수 없습니다.
MTLFunction은 다음 중 하나에서 라이브러리의 객체를 작성할 수 있습니다.
컴파일된 코드에서 라이브러리 만들기
최상의 성능을 얻으려면 프로그램의 Xcode 구축 과정에서 메탈 착색 언어 소스 코드를 라이브러리 파일로 컴파일하여 프로그램이 실행될 때 함수 소스를 컴파일하는 비용을 피하십시오.MTLlibrary 라이브러리 바이너리에서 객체를 만들려면 다음 방법 중 하나인 MTLDevice를 호출합니다.
빌드 과정에서 Metal 음영처리된 언어 소스 코드를 컴파일하는 방법에 대한 자세한 내용은 응용 프로그램 빌드 과정에서 라이브러리 만들기를 참조하시기 바랍니다.
소스 코드에서 라이브러리 만들기
MTLlibrary에 여러 함수가 포함될 수 있는 Metal 음영처리된 언어 소스 코드 문자열에서 하나를 만들려면 다음 방법 중 하나인 MTLdevice를 호출합니다.이 방법들은 라이브러리를 만들 때 원본 코드를 컴파일합니다.사용할 컴파일러 옵션을 지정하려면 MTLCompileOptions 객체의 속성을 설정합니다.
Library에서 기능 얻기
요청 이름이 있는 객체의 newFunctionWithName:메서드를 반환합니다.라이브러리에서 Metal 음영처리된 언어 기능 제한자를 사용하는 함수의 이름을 찾을 수 없으면 로 돌아갑니다.MTLLibraryMTLFunctionnewFunctionWithName:nil
명세서 4-1 전체 경로 이름을 통해 라이브러리 파일을 찾을 수 있는 new Library With File: error: 방법, MTLdevice, 그리고 그 내용을 사용하여 MTLlibrary가 하나 이상의 MTL Function 대상을 가진 대상을 만듭니다.파일을 불러올 때 오류 error가 발생했습니다.그런 다음 소스 코드에서 호출된 함수를 나타내는 객체를 만드는 newFunctionWithName: 메서드.되돌아오는 함수 대상은 현재 프로그램에서 사용할 수 있습니다.MTLLibraryMTLFunctionmy_funcmyFunc
명세서 4-1 라이브러리에서 함수 접근
NSError *errors;
id library = [device newLibraryWithFile:@"myarchive.metallib"
error:&errors];
id myFunc = [library newFunctionWithName:@"my_func"];
런타임 시 기능 세부 정보 식별
MTLFunction 객체의 실제 컨텐트는 MTLFunction에서 객체를 만들기 전에 컴파일할 수 있는 그래픽 셰이더나 계산 함수에 의해 정의되기 때문에 응용 프로그램에 직접 사용할 수 없는 소스 코드일 수 있습니다.MTLFunction은 런타임에 다음 속성을 질의할 수 있습니다.
MTLFunction에서는 함수 매개변수에 액세스할 수 없습니다.유수선 상태를 만드는 동안 반영물체(MTL RenderPipeline Reflection 또는 MTLCompute Pipeline Reflection은 명령 인코더의 유형에 따라)를 얻어 착색기나 계산 함수 파라미터의 세부 사항을 표시할 수 있다.파이프 상태 및 반사 객체 생성에 대한 자세한 내용은 렌더 파이프 상태 생성 또는 파이프 상태 계산 생성을 참조하시기 바랍니다.반사 데이터를 사용하지 않으면 사용하지 마십시오.
반사 대상은 MTLArgument 명령 인코더가 지원하는 모든 기능의 대상 그룹을 포함합니다.MTLComputeCommandEncoder 때문에 속성 중 MTLComputePipeline Reflection에는 계산 함수에 대응하는 매개 변수가 있는 MTLArgument 대상 그룹arguments가 있습니다.MTLRenderCommandEncoder의 경우 MTLRenderPipeline Reflection은 두 가지 속성을 가지고vertexArguments와fragmentArguments이다. 이것은 각각 정점 함수 파라미터와 부분 함수 파라미터, 진열에 대응하는 것이다.
함수가 아닌 모든 매개 변수가 반사 대상에 존재합니다.반사 객체에는 연관된 리소스가 있는 매개변수만 포함되지만 [[stage in]] 한정자나 [vertex id]] 또는 [attribute id]] 한정자를 사용하여 선언된 매개변수는 포함되지 않습니다.
명세서 4-2는 반사 대상을 가져오는 방법을 보여 줍니다. (본 예시에서 MTLComputePipeline Reflection) 그리고 MTLArgument의arguments 속성에 있는 대상을 옮겨다니는 방법을 보여 줍니다.
명세서 4-2 함수 매개 변수를 통해 교체
MTLComputePipelineReflection* reflection;
id computePS = [device
newComputePipelineStateWithFunction:func
options:MTLPipelineOptionArgumentInfo
reflection:&reflection error:&error];
for (MTLArgument *arg in reflection.arguments) {
// process each MTLArgument
}
MTLArgument 특성은 매개변수가 음영처리된 언어 기능에 전달되는 세부 사항을 보여줍니다.
type은 다른 MTLArgument 속성과 관련된 사항을 결정합니다.
버퍼 파라미터가 구조(즉, buffer DataType은 MTLdataType Struct)라면 buffer StructType 속성은 MTL StructType을 포함하고 buffer DataSize는 이 구조의 크기를 바이트 단위로 포함한다.버퍼 파라미터가 그룹 (또는 그룹을 가리키는 바늘) 이라면 버퍼 데이터 타입은 요소의 데이터 형식을 표시하고 버퍼 데이터 크기는 그룹의 요소 크기 (바이트 단위) 를 포함합니다.
명세서 4-3에서 MTL StructType 대상을 아래로 파고들어 구조체 구성원의 세부 사항을 검사합니다. 각각 MTL StructMember 대상이 표시합니다.구조체 구성원은 간단한 유형, 수조 또는 끼워 넣는 구조체일 수 있다.만약 이 구성원이 끼워 넣은 구조체라면, structType 방법인 MTLStructMember를 호출해서 MTLStructType이 구조체를 대표하는 대상을 가져와 깊이 있게 분석합니다.구성원이 배열인 경우 MTLArrayType 메소드 MTLStructMember를 사용하여 MTLArrayType이 배열을 나타내는 메소드를 가져옵니다.그런 다음 elementType 속성 MTLArrayType을 확인합니다.ElementType이 MTLdataTypeStruct인 경우 구조를 가져오고 구성원을 계속 파고들기 위해 ElementStructType 메서드를 호출합니다.ElementType이 MTLdataTypeArray라면 ElementArrayType 메소드를 호출하여 서브 패턴을 가져와 분석합니다.
명세서 4-3 처리 구조 파라미터
MTLStructType *structObj = [arg.bufferStructType];
for (MTLStructMember *member in structObj.members) {
// process each MTLStructMember
if (member.dataType == MTLDataTypeStruct) {
MTLStructType *nestedStruct = member.structType;
// recursively drill down into the nested struct
}
else if (member.dataType == MTLDataTypeArray) {
MTLStructType *memberArray = member.arrayType;
// examine the elementType and drill down, if necessary
}
else {
// member is neither struct nor array
// analyze it; no need to drill down further
}
}
다음 페이지
이전 페이지
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.