Search Unity

Feedback Tuples NativeContainers with Burst

Discussion in 'Entity Component System' started by crazyguy90, Jan 8, 2022.

  1. crazyguy90

    crazyguy90

    Joined:
    Aug 27, 2015
    Posts:
    12
    Unity version: 2020.3.20f1 Personal <DX11>
    Burst version: 1.7.0-pre.1
    Jobs version: 0.11.0-preview.6

    Hey folks,

    I'm trying to use tuples like (int, int) myTuple for key and value in NativeContainers. The error occures in an IJobParallelFor struct with a [BurstCompile]-Attribute where I have a
    public NativeHashMap<(int, int), (int, int)>.ParallelWriter pathData;

    and I try to
    pathData.TryAdd((theTile, theOtherTile), (1, 2));


    The following error message appears even though the code runs absolutely fine and wih the expected results:

    (0,0): Burst error BC1016: The managed function `System.Collections.Generic.EqualityComparer`1<int>.get_Default()` is not supported

    at System.ValueTuple`2<System.Int32,System.Int32>.Equals(System.ValueTuple`2<int,int>* this, System.ValueTuple`2<int,int> other)
    at Unity.Collections.LowLevel.Unsafe.UnsafeHashMapBase`2<System.ValueTuple`2<System.Int32,System.Int32>,System.ValueTuple`2<System.Int32,System.Int32>>.TryGetNextValueAtomic(Unity.Collections.LowLevel.Unsafe.UnsafeHashMapData* data, ref System.ValueTuple`2<int,int> item, ref Unity.Collections.NativeMultiHashMapIterator`1<System.ValueTuple`2<int,int>> it) (at C:\Users\JustMe\Desktop\20211101_Prototype\Library\PackageCache\com.unity.collections@1.0.0-pre.5\Unity.Collections\UnsafeHashMap.cs:871)
    at Unity.Collections.LowLevel.Unsafe.UnsafeHashMapBase`2<System.ValueTuple`2<System.Int32,System.Int32>,System.ValueTuple`2<System.Int32,System.Int32>>.TryGetFirstValueAtomic(Unity.Collections.LowLevel.Unsafe.UnsafeHashMapData* data, System.ValueTuple`2<int,int> key, ref System.ValueTuple`2<int,int> item, ref Unity.Collections.NativeMultiHashMapIterator`1<System.ValueTuple`2<int,int>> it) (at C:\Users\JustMe\Desktop\20211101_Prototype\Library\PackageCache\com.unity.collections@1.0.0-pre.5\Unity.Collections\UnsafeHashMap.cs:856)
    at Unity.Collections.LowLevel.Unsafe.UnsafeHashMapBase`2<System.ValueTuple`2<System.Int32,System.Int32>,System.ValueTuple`2<System.Int32,System.Int32>>.TryAddAtomic(Unity.Collections.LowLevel.Unsafe.UnsafeHashMapData* data, System.ValueTuple`2<int,int> key, System.ValueTuple`2<int,int> item, int threadIndex) (at C:\Users\JustMe\Desktop\20211101_Prototype\Library\PackageCache\com.unity.collections@1.0.0-pre.5\Unity.Collections\UnsafeHashMap.cs:612)
    at Unity.Collections.LowLevel.Unsafe.UnsafeHashMap`2.ParallelWriter<System.ValueTuple`2<System.Int32,System.Int32>,System.ValueTuple`2<System.Int32,System.Int32>>.TryAdd(Unity.Collections.LowLevel.Unsafe.UnsafeHashMap`2.ParallelWriter<System.ValueTuple`2<int,int>,System.ValueTuple`2<int,int>>* this, System.ValueTuple`2<int,int> key, System.ValueTuple`2<int,int> item) (at C:\Users\JustMe\Desktop\20211101_Prototype\Library\PackageCache\com.unity.collections@1.0.0-pre.5\Unity.Collections\UnsafeHashMap.cs:1333)
    at Unity.Collections.NativeHashMap`2.ParallelWriter<System.ValueTuple`2<System.Int32,System.Int32>,System.ValueTuple`2<System.Int32,System.Int32>>.TryAdd(Unity.Collections.NativeHashMap`2.ParallelWriter<System.ValueTuple`2<int,int>,System.ValueTuple`2<int,int>>* this, System.ValueTuple`2<int,int> key, System.ValueTuple`2<int,int> item) (at C:\Users\JustMe\Desktop\20211101_Prototype\Library\PackageCache\com.unity.collections@1.0.0-pre.5\Unity.Collections\NativeHashMap.cs:443)
    at PathfindingSystemAStar.CalculateNodesAndConnections.CalculateAndStoreL1Nodes(PathfindingSystemAStar.CalculateNodesAndConnections* this, int startAt, int endAt, PathfindingSystemAStar.Dir top_or_right, Unity.Collections.NativeArray`1<int>* tileIndexArr) (at C:\Users\JustMe\Desktop\20211101_Prototype\Assets\Scripts\PathfindingSystemAStar.cs:1133)
    at PathfindingSystemAStar.CalculateNodesAndConnections.FindAndCalculate(PathfindingSystemAStar.CalculateNodesAndConnections* this, ref Unity.Collections.NativeArray`1<int> tileIndexArr, TileFrameIndexes* blockFrame, PathfindingSystemAStar.Dir dir) (at C:\Users\JustMe\Desktop\20211101_Prototype\Assets\Scripts\PathfindingSystemAStar.cs:1110)
    at PathfindingSystemAStar.CalculateNodesAndConnections.Execute(PathfindingSystemAStar.CalculateNodesAndConnections* this, int index) (at C:\Users\JustMe\Desktop\20211101_Prototype\Assets\Scripts\PathfindingSystemAStar.cs:1051)
    at Unity.Jobs.IJobParallelForExtensions.ParallelForJobStruct`1<PathfindingSystemAStar.CalculateNodesAndConnections>.Execute(ref PathfindingSystemAStar.CalculateNodesAndConnections jobData, System.IntPtr additionalPtr, System.IntPtr bufferRangePatchData, ref Unity.Jobs.LowLevel.Unsafe.JobRanges ranges, int jobIndex)


    While compiling job:
    Unity.Jobs.IJobExtensions+JobStruct`1[[PathfindingSystemAStar+PathfindingAStarHeapBidirectional, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null::Execute(PathfindingSystemAStar+PathfindingAStarHeapBidirectional&, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|Unity.Jobs.LowLevel.Unsafe.JobRanges&, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
    Unity.Jobs.IJobExtensions+JobStruct`1[[PathfindingSystemAStar+PathfindingAStar, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null::Execute(PathfindingSystemAStar+PathfindingAStar&, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|Unity.Jobs.LowLevel.Unsafe.JobRanges&, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
    Unity.Jobs.IJobParallelForExtensions+ParallelForJobStruct`1[[PathfindingSystem+BuildTileFramesJob, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null::Execute(PathfindingSystem+BuildTileFramesJob&, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|Unity.Jobs.LowLevel.Unsafe.JobRanges&, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
    Unity.Jobs.IJobExtensions+JobStruct`1[[PathfindingFloodFill+InitialFloodFill, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null::Execute(PathfindingFloodFill+InitialFloodFill&, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|Unity.Jobs.LowLevel.Unsafe.JobRanges&, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
    Unity.Jobs.IJobParallelForExtensions+ParallelForJobStruct`1[[PathfindingSystemAStar+CalculateNodesAndConnections, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null::Execute(PathfindingSystemAStar+CalculateNodesAndConnections&, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|Unity.Jobs.LowLevel.Unsafe.JobRanges&, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
    Unity.Jobs.IJobExtensions+JobStruct`1[[PathfindingSystem+BuildWorldNet, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null::Execute(PathfindingSystem+BuildWorldNet&, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|Unity.Jobs.LowLevel.Unsafe.JobRanges&, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
    Unity.Jobs.IJobParallelForExtensions+ParallelForJobStruct`1[[PathfindingSystem+IntraConnectTileFramesInWorldBlock, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null::Execute(PathfindingSystem+IntraConnectTileFramesInWorldBlock&, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|Unity.Jobs.LowLevel.Unsafe.JobRanges&, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
    Unity.Jobs.IJobParallelForExtensions+ParallelForJobStruct`1[[PathfindingSystem+FindNeighbourTilesJob, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null::Execute(PathfindingSystem+FindNeighbourTilesJob&, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|Unity.Jobs.LowLevel.Unsafe.JobRanges&, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
    Unity.Jobs.IJobParallelForExtensions+ParallelForJobStruct`1[[PathfindingSystem+GetRelevantConnections, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null::Execute(PathfindingSystem+GetRelevantConnections&, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|Unity.Jobs.LowLevel.Unsafe.JobRanges&, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
    Unity.Jobs.IJobExtensions+JobStruct`1[[PathfindingSystemAStar+CalculateUniqueL1NodeTable, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null::Execute(PathfindingSystemAStar+CalculateUniqueL1NodeTable&, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|Unity.Jobs.LowLevel.Unsafe.JobRanges&, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
    Unity.Jobs.IJobExtensions+JobStruct`1[[PathfindingSystemAStar+PathfindingAStarHeap, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null::Execute(PathfindingSystemAStar+PathfindingAStarHeap&, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|Unity.Jobs.LowLevel.Unsafe.JobRanges&, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)

    Would be nice if that could be fixed.
     
  2. tertle

    tertle

    Joined:
    Jan 25, 2011
    Posts:
    3,761
     
  3. crazyguy90

    crazyguy90

    Joined:
    Aug 27, 2015
    Posts:
    12
    I saw it in the changelog too. I figured out that I could use tuples in native containers such as NativeMultiHashMap as a value but not as a key. I find it hard to tell, why that would "enter or escape the Burst function boundaries", because tuples are just two or more values put together in one variable. Once I define, say a NativeMultiHashMap<(int, int), (int, int) myMultiHashmap, I could not extend these values as I could, if I would use a multidimensional or nested nativecontainer.
    The code gets complied fine even when using burst but there is that annoying error message when I start up unity...

    Hmm, i guess to use a struct like
    struct Mystruct 
    {
    int a = 7;
    int b = 234;
    }

    would not work as a key parameter in a native container aswell, right?
     
  4. eizenhorn

    eizenhorn

    Joined:
    Oct 17, 2016
    Posts:
    2,685
    it will, if it will implement
    IEquatable<Mystruct>
     
    crazyguy90 likes this.
  5. crazyguy90

    crazyguy90

    Joined:
    Aug 27, 2015
    Posts:
    12
  6. Baggers_

    Baggers_

    Joined:
    Sep 10, 2017
    Posts:
    98
    Not sure if this would be useful but here is NTuple which only accepts unmanaged values and is blittable. It has implicit casts to and from ValueTuple so you can write ValueTuples to NativeCollections of NTuples. e.g.
    Code (CSharp):
    1. static void Foo()
    2. {
    3.     var foo = new NativeArray<NTuple<int, float>>(5, Allocator.Persistent);
    4.     foo[0] = (1, 2.2f);
    5.     ...
    6. }
    Haven't checked this code in a while, but hopefully it's useful.
     
    crazyguy90 likes this.