.NET 11부터 다차원 Tensor 복사 및 대상을 받는 작업은 출력을 쓰기 전에 ArgumentException 지원되지 않는 겹치는 스토리지 레이아웃을 거부합니다. 또한 Tensor-span 생성자는 스토리지의 System.Array 요소 형식의 유효성을 검사합니다.
변경 내용은 지원되는 대상 프레임워크를 포함하여 System.Numerics.Tensors 패키지를 통해 제공됩니다. 패키지를 업데이트하면 이전 .NET 버전을 대상으로 하는 앱에 영향을 줄 수 있습니다. 별도의 TensorPrimitives API는 기존 중복 계약을 유지합니다.
도입된 버전
.NET 11
이전 동작
CopyTo, FlattenTo, TryCopyTo, 및 TryFlattenTo는 겹치는 원본 및 대상 스토리지에 대한 지원을 문서화했습니다. 설명된 Try 방법은 원본을 먼저 임시 스토리지에 복사한 것처럼 처리했습니다.
예를 들어 다음 소스 및 대상은 동일한 배열의 겹치는 영역을 참조합니다.
int[] storage = { 1, 2, 3, 4, 5, 6 };
ReadOnlyTensorSpan<int> source = new(storage, new nint[] { 2, 2 }, new nint[] { 3, 1 });
TensorSpan<int> destination = new(storage, new nint[] { 2, 2 });
source.CopyTo(destination);
문서화된 스냅샷 스타일 계약은 대상이 받을 [1, 2, 4, 5]것임을 암시합니다. 지원되지 않는 겹침에 대한 실제 결과는 레이아웃 및 순회 순서에 따라 달라질 수 있습니다. 구현이 해당 계약을 안정적으로 충족하지 못했습니다.
System.Array를 인수로 받는 생성자는 배열의 요소 형식이 T와 호환되는지 여부를 일관되게 확인하지 못했습니다.
새 동작
복사하기 전에 ArgumentException 예외를 발생시키는 예제입니다. 동일한 지원되지 않는 겹침도 셰이프 및 용량 검사가 성공할 때 TryFlattenTo와 TryCopyTo에서 발생합니다.
지원되는 겹침은 여전히 작업별입니다.
| 작업 | 겹침 지원 |
|---|---|
CopyTo 및 TryCopyTo |
원본과 대상이 둘 다 조밀하고 요소 개수가 같거나 보기가 정확히 동일합니다. |
FlattenTo 및 TryFlattenTo |
조밀한 원본 및 대상 스팬입니다. |
| 대상을 받는 요소별 연산 | 반복되는 논리 스토리지 위치가 없는 동일한 입력/출력 뷰입니다. 이동된 중첩 및 겹치는 브로드캐스트 입력은 거부됩니다. |
Tensor.ResizeTo |
밀집된 소스 및 대상입니다. 지원되지 않는 strided overlap은 거부됩니다. |
| 동일한 보기로 되돌리기 | 조밀한 제자리 반전 또는 동작 없음 반전. |
Try 복사 메서드는 대상이 너무 짧을 때 복사하지 않고도 계속 false를 반환합니다.
TryCopyTo는 호환되지 않는 셰이프에 대해서도 false를 반환합니다. 지원되지 않는 겹침은 용량 실패가 아니라 잘못된 레이아웃입니다.
Tensor.ResizeTo 및 기존 대상에 대한 연결은 둘 이상의 논리 요소를 포함하는 0-stride 차원을 거부합니다. 단일 차원에서 비어 있는 대상과 0개의 보폭은 허용된 상태로 유지됩니다.
ArrayTypeMismatchException를 받는 TensorSpan<T> 및 System.Array 생성자는 호환되지 않는 배열 요소 형식에 대해 ReadOnlyTensorSpan<T>를 throw합니다. 쓰기 가능한 텐서 스팬도 공변 배열을 거부합니다. 읽기 전용 텐서 스팬은 호환되는 참조 형식의 공변성을 허용합니다.
파괴적 변경 유형
이것은 동작 변경입니다.
변경 이유
임의로 겹치는 스트라이드 텐서 사이의 올바른 복사는 전체 텐서에 비례하는 임시 스토리지를 필요로 할 수 있습니다. 명시적 거부는 전체 텐서 스냅샷을 자동으로 할당하지 않고 순회 종속 손상을 방지합니다.
반복되는 출력 스토리지 위치는 서로 다른 논리적 결과를 나타낼 수 없습니다. 배열 요소 형식 유효성 검사는 호환되지 않는 스토리지가 T로 해석되는 것을 방지하고 공변 배열 스토리지를 통한 쓰기를 방지합니다.
권장 작업
겹치지 않는 출력 스토리지를 사용하거나 겹치는 복사 전에 원본을 명시적으로 스냅샷합니다. 앞의 예제에서
int[] snapshot = new int[checked((int)source.FlattenedLength)];
source.FlattenTo(snapshot);
ReadOnlyTensorSpan<int> independentSource = new(snapshot, source.Lengths);
independentSource.CopyTo(destination);
스냅샷에 [1, 2, 4, 5]가 포함됩니다. 대상/출력 인수를 받는 요소별 작업의 경우 겹치는 각 입력을 스냅샷으로 만들거나 별도의 결과를 할당합니다. 브로드캐스트 대상을 독립적으로 주소 지정 가능한 출력 스토리지로 대체합니다.
텐서 스팬의 System.Array경우 호환되는 요소 스토리지를 제공합니다. 쓰기 가능한 보기의 경우 공변성이 없는 배열을 사용하거나 요소를 새 T[]로 복사합니다.
Try 복사 메서드에서 예외가 발생할 수 없다고 가정하지 마세요.
false 결과는 용량 부족 또는 TryCopyTo의 경우 호환되지 않는 셰이프를 나타냅니다. 임의 중첩 동작을 복원하는 호환성 스위치는 없습니다.
영향을 받는 API
- System.Numerics.Tensors.IReadOnlyTensor<TSelf,T>.CopyTo;
- System.Numerics.Tensors.IReadOnlyTensor<TSelf,T>.FlattenTo;
- System.Numerics.Tensors.IReadOnlyTensor<TSelf,T>.TryCopyTo;
- System.Numerics.Tensors.IReadOnlyTensor<TSelf,T>.TryFlattenTo;
- Tensor<T>, TensorSpan<T> 및 ReadOnlyTensorSpan<T>의 해당 복사 및 평면화 메서드
- 단항, 이진 및 텐서/스칼라 작업을 포함하는 Tensor의 대상 인수를 받는 요소별 메서드입니다.
- System.Numerics.Tensors.Tensor.ResizeTo (모든 오버로드).
- System.Numerics.Tensors.Tensor.Reverse 및 System.Numerics.Tensors.Tensor.ReverseDimension(대상을 인수로 받는 오버로드)
- System.Numerics.Tensors.Tensor.Concatenate (대상을 매개 변수로 받는 오버로드).
-
TensorSpan<T> 및 ReadOnlyTensorSpan<T>(각 형식에서
System.Array를 사용하는 두 오버로드).
또한, 다음을 참조하세요.
.NET