Tensor<T> slice pinning starts at the parent array instead of the slice
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 78/100
Direzione di ricerca
Inizia da src/libraries/System.Numerics.Tensors/src/System/Numerics/Tensors/netcore/Tensor_1.cs, concentrandoti su GetPinnableReference() e GetPinnedHandle() per i tensori suddivisi. Esegui prima la riproduzione basata sul file TensorSlicePinning.cs, quindi verifica che il pinning inizi all’offset logico della slice e restituisca [11,12,21,22] con codice di uscita 0.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Description
A contiguous Tensor<long> slice returns different values through its pinning APIs than through its indexer or tensor span. With System.Numerics.Tensors 10.0.9, GetPinnableReference() and GetPinnedHandle() start at the parent array rather than the beginning of the slice.
Scenario
I'm prototyping a .NET ONNX text-embedding pipeline. I want to use tensors through preprocessing, inference, and postprocessing, including passing contiguous slices to native inference without another data copy.
The shape is correct, but the pointer addresses the wrong part of the data. That means a native consumer can receive different inputs without a shape error. The repro below removes ONNX and the rest of my application. It only needs System.Numerics.Tensors.
Parent [3,2] Logical slice [2,2], starting at [1,0]
[91,92] excluded
[11,12] [11,12] <- expected pointer start
[21,22] [21,22]
Observed pointer starts at 91, not 11.
Configuration
- Windows x64
- .NET SDK 10.0.401
- Runtime .NET 10.0.12
- NuGet
System.Numerics.Tensors10.0.9 - JIT,
net10.0; NativeAOT explicitly disabled
Reproduction Steps
You can find the runnable file-based app and captured output in this gist. The complete code is also included below.
Save the following as TensorSlicePinning.cs in a new directory outside a repository. File-based apps inherit project settings from parent directories.
#:package [email protected]
#:property TargetFramework=net10.0
#:property AllowUnsafeBlocks=true
#:property PublishAot=false
using System.Numerics.Tensors;
long[] values = [91, 92, 11, 12, 21, 22];
long[] expected = [11, 12, 21, 22];
var parent = Tensor.Create(values, [3, 2]);
var slice = parent.Slice([1, 0]);
Console.WriteLine($"Runtime: {System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription}");
Console.WriteLine($"Shape: [{string.Join(",", slice.Lengths.ToArray())}]; strides: [{string.Join(",", slice.Strides.ToArray())}]");
Console.WriteLine($"Expected slice: [{string.Join(",", expected)}]");
Console.WriteLine($"Indexer first: {slice[0, 0]}");
Console.WriteLine($"Tensor span: [{string.Join(",", slice.AsTensorSpan().GetSpan([0, 0], 4).ToArray())}]");
Console.WriteLine($"Flattened: [{string.Join(",", slice.ToArray())}]");
Console.WriteLine($"Parent GetPinnableReference: {parent.GetPinnableReference()} (expected 91)");
long referenceFirst = slice.GetPinnableReference();
Console.WriteLine($"Slice GetPinnableReference: {referenceFirst} (expected 11)");
unsafe
{
using var handle = slice.GetPinnedHandle();
long[] pinned = new ReadOnlySpan<long>(handle.Pointer, 4).ToArray();
Console.WriteLine($"Slice GetPinnedHandle: [{string.Join(",", pinned)}] (expected [{string.Join(",", expected)}])");
bool matches = slice[0, 0] == 11 && slice.ToArray().SequenceEqual(expected)
&& slice.AsTensorSpan().GetSpan([0, 0], 4).SequenceEqual(expected)
&& referenceFirst == 11 && pinned.SequenceEqual(expected);
Console.WriteLine(matches ? "PASS" : "FAIL: pinning does not start at the logical slice offset.");
return matches ? 0 : 1;
}
dotnet run --file .\TensorSlicePinning.cs
Actual behavior
Compilation succeeds. Running the app produces the following output and exits with code 1:
Runtime: .NET 10.0.12
Shape: [2,2]; strides: [2,1]
Expected slice: [11,12,21,22]
Indexer first: 11
Tensor span: [11,12,21,22]
Flattened: [11,12,21,22]
Parent GetPinnableReference: 91 (expected 91)
Slice GetPinnableReference: 91 (expected 11)
Slice GetPinnedHandle: [91,92,11,12] (expected [11,12,21,22])
FAIL: pinning does not start at the logical slice offset.
Expected behavior
The reference and pointer should start at 11, the first element of the slice. Reading four elements should return [11,12,21,22], matching the indexer and tensor span. The app should exit with code 0.
| Observation | Expected | Actual |
|---|---|---|
| Slice indexer, first element | 11 |
11 |
| Tensor-span and enumerated values | [11,12,21,22] |
[11,12,21,22] |
Slice GetPinnableReference() |
11 |
91 |
Four values through slice GetPinnedHandle() |
[11,12,21,22] |
[91,92,11,12] |
| Process exit code | 0 |
1 |
Other information
All pointer reads happen while the MemoryHandle is alive and stay within the allocated six-element array.
In the 10.0.9 source, Slice records _start, but GetPinnableReference() appears to return the array's first element without applying that offset. GetPinnedHandle() uses that reference. This looks related to the behavior above.
I've reproduced this on the configuration listed above. I haven't checked other versions or platforms.
- Lingua principale
- C#
- Stelle
- 18.3k
- Fork
- 5.6k
- Merge medio
- 2g 16h
- PR unite (30g)
- 620
Preparare l'ambiente
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di dotnet/runtime
-
area-System.Threading blocking-clean-ci Known Build Error untriaged
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
dotnet/runtime#134679 · 4 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
ARM64: conditional compare rejects negative immediates the emitter can already encode as `ccmn`Apertaarea-CodeGen-coreclr performance
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
dotnet/runtime#134663 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
area-System.Security untriaged
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
dotnet/runtime#134659 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
area-System.Numerics untriaged
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
dotnet/runtime#134654 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
area-Interop-coreclr untriaged
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
dotnet/runtime#134617 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di dotnet/runtime
Issue simili
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
fluentassertions/fluentassertions#3353 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
-
Difficoltà 2/5 Mezza giornata Idoneità per principianti 78/100
unoplatform/uno#24769 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
AvaloniaUI/Avalonia#22323 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
microsoft/onnxruntime-genai#2633 ·
I maintainer di solito rispondono entro 1 giorno