다음을 통해 공유


IDMLBindingTable::BindInputs 메서드(directml.h)

리소스 집합을 입력 텐서로 바인딩합니다.

컴파일된 연산자에 바인딩하는 경우 바인딩 수는 선택적 텐서를 포함하여 연산자의 입력 수와 정확히 일치해야 합니다. 연산자를 만드는 데 사용되는 연산자 설명에서 확인할 수 있습니다. 바인딩이 너무 많거나 너무 적은 경우 디바이스 제거가 발생합니다. 선택적 텐서의 경우 DML_BINDING_TYPE_NONE 사용하여 '바인딩 없음'을 지정할 수 있습니다. 그렇지 않으면 연산자를 만들 때 바인딩 형식이 텐서 형식과 일치해야 합니다.

연산자 이니셜라이저의 경우 입력 바인딩은 초기화할 연산자당 하나의 입력 바인딩이 있는 DML_BINDING_TYPE_BUFFER_ARRAY 형식이어야 하며, 이니셜라이저를 만들거나 초기화하는 동안 연산자를 지정한 순서대로 제공됩니다. 각 버퍼 배열의 크기는 초기화할 해당 연산자의 입력 수와 같아야 합니다. DML_TENSOR_FLAG_OWNED_BY_DML 플래그가 설정된 입력 텐서는 초기화하는 동안 바인딩되어야 합니다. 그렇지 않으면 해당 텐서에 바인딩되지 않아야 합니다. 연산자 초기화를 위한 입력으로 바인딩할 항목이 없는 경우(즉, DML_TENSOR_FLAG_OWNED_BY_DML 플래그가 설정된 텐서가 없음) '바인딩 없음'을 나타내는 빈 DML_BUFFER_ARRAY_BINDING 제공할 nullptr 수 있습니다.

모든 입력 리소스의 바인딩을 해제하려면 rangeCount 0과 바인딩의 값을 nullptr 제공합니다.

입력 텐서에 DML_TENSOR_FLAG_OWNED_BY_DML 플래그가 설정된 경우 연산자 이니셜라이저를 실행할 때만 바인딩될 수 있습니다. 그렇지 않으면 DML_TENSOR_FLAG_OWNED_BY_DML 플래그가 설정되지 않은 경우 반대의 경우도 마찬가지입니다. 이니셜라이저를 실행할 때 입력 텐서는 바인딩되지 않아야 하지만 연산자 자체를 실행할 때는 바인딩되어야 합니다.

입력으로 바인딩되는 모든 버퍼에는 DML_TENSOR_FLAG_OWNED_BY_DML 플래그가 설정된 경우를 제외하고 D3D12_HEAP_TYPE_DEFAULT 힙 형식이 있어야 합니다. 이니셜라이저에 대한 입력으로 바인딩되는 텐서에 대해 DML_TENSOR_FLAG_OWNED_BY_DML 설정된 경우 버퍼의 힙 형식은 D3D12_HEAP_TYPE_DEFAULT 또는 D3D12_HEAP_TYPE_UPLOAD 수 있습니다.

경우에 따라 여러 바인딩이 동일한 ID3D12Resource 를 참조할 수 있습니다. 그러나 운영자가 리소스의 동일한 지역에 동시에 읽고 쓸 때는 주의해야 합니다. 바인딩 쌍이 동일한 ID3D12Resource를 참조하고 하나 이상의 바인딩이 쓰기에 관련되고 버퍼 영역이 교차(하나 이상의 바이트로 겹침)하는 경우 바인딩 위험이 발생할 수 있습니다. 바인딩 위험은 DirectML 1.7.0을 기준으로 다음 규칙을 사용하여 유효성을 검사합니다.

  • 초기화를 위해 바인딩할 때 입력 바인딩은 출력 바인딩과 동일한 리소스를 참조할 수 없습니다. 입력은 출력 리소스에 복사되고(향후 실행을 위한 영구 리소스) 복사에는 리소스 상태 전환이 필요할 수 있습니다.
  • 실행을 위해 바인딩할 때 입력 바인딩은 출력 바인딩과 동일한 리소스를 참조할 수 있습니다. 그러나 해당 바인딩 범위는 영역이 동일 하고 연산자가 현재 위치 실행을 지원하는 경우에만 교차할 수 있습니다.
  • 있는 경우 영구 바인딩은 출력 바인딩 또는 임시 바인딩과 교차해서는 안 됩니다.
  • 있는 경우 임시 바인딩은 입력 바인딩, 출력 바인딩 또는 영구 바인딩을 교차해서는 안 됩니다.

위의 규칙은 두 리소스가 힙의 동일한 영역에 별칭을 지정하지 않는다고 가정하므로 배치된 리소스 또는 예약된 리소스를 사용할 때는 주의해야 합니다.

구문

void BindInputs(
                 UINT                   bindingCount,
  [in, optional] const DML_BINDING_DESC *bindings
);

매개 변수

bindingCount

형식: UINT

이 매개 변수는 바인딩 배열의 크기를 결정 합니다 (제공된 경우).

[in, optional] bindings

형식: const DML_BINDING_DESC*

바인딩할 텐서 리소스에 대한 설명을 포함하는 DML_BINDING_DESC 상수 배열에 대한 선택적 포인터입니다.

반환 값

없음

설명

바인딩 위험 예제

아래 예제에서 사각형은 바인딩 테이블에서 하나 이상의 바인딩에서 참조하는 버퍼 리소스를 나타냅니다. 각 행은 명명된 바인딩에 의해 잠재적으로 읽거나(R) 쓰기(W)할 수 있는 바이트 범위를 나타냅니다. 모든 예제에서는 리소스가 동일한 실제 메모리를 공유하지 않는다고 가정합니다.

예 1

이 예제에서는 다양한 리소스를 참조하는 입력 및 출력 바인딩을 보여 줍니다. 다른 리소스를 참조하는 바인딩 쌍은 결코 위험하지 않으므로 항상 유효한 바인딩입니다.

          Resource A          Resource B
          +---------------+   +---------------+
Input  0: |RRRRRRRRRRRRRRR|   |               |
Output 0: |               |   |WWWWWWWWWWWWWWW|
          +---------------+   +---------------+

예제 2

이 예제에서는 동일한 리소스의 다른 지역을 참조하는 입력 및 출력 바인딩을 보여 줍니다. 동일한 리소스의 겹치지 않는 영역이 있는 바인딩 쌍은 실행을 위해 바인딩할 때 위험하지 않습니다. 실행을 위해 바인딩할 때 유효한 바인딩이지만 초기화를 위해 바인딩할 때는 유효하지 않습니다.

          Resource A      
          +---------------+
Input  0: |RRRRRRR        |
Output 0: |       WWWWWWWW|
          +---------------+

예제 3

이 예제에서는 범위와 겹치는 두 개의 입력 바인딩을 보여 줍니다. 읽기 전용 바인딩 쌍(입력 바인딩 및 영구 바인딩)은 버퍼 지역 교집합에 관계없이 위험할 수 없으므로 항상 유효한 바인딩입니다.

          Resource A          Resource B
          +---------------+   +---------------+
Input  0: |RRRRRRRRR      |   |               |
Input  1: |      RRRRRRRRR|   |               |
Output 0: |               |   |WWWWWWWWWWWWWWW|
          +---------------+   +---------------+

예제 4

이 예제에서는 동일한 지역이 있는 입력 및 출력 바인딩을 보여 줍니다. 바인딩되는 연산자가 현재 위치 실행을 지원하고 바인딩이 실행용인 경우에만 이 바인딩이 유효합니다.

          Resource A      
          +---------------+
Input  0: |RRRRRRRRRRRRRRR|
Output 0: |WWWWWWWWWWWWWWW|
          +---------------+

예제 5

다음 바인딩은 동일하지 않은 영역이 겹치는 바인딩 쌍을 포함하므로 연산자의 현재 위치 실행 지원과 관계없이 유효하지 않습니다.

          Resource A      
          +---------------+
Input  0: |RRRRRRRRRRRRR  |
Output 0: |    WWWWWWWWWWW|
          +---------------+

요구 사항

요구 사항

   
대상 플랫폼 Windows
헤더 directml.h
라이브러리 DirectML.lib
DLL DirectML.dll

추가 정보

DirectML의 바인딩

IDMLBindingTable