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 |