使用非托管内存指针交换固定数组的指针
Exchange pinned array's pointer with an unmanaged memory pointer
我正在固定和取消固定:
GCHandle pinArray(object a)
{
return GCHandle.Alloc(a, GCHandleType.Pinned);
}
void unpinArray(GCHandle h)
{
h.Free();
}
在 opencl 方法之前和之后,因此数组在计算时不会移动。现在我需要将支持数组指针与对齐的非托管数组指针交换,以便对其进行更快的 read/write 操作。
但我找不到任何类似 "change value of gchandle backing array pointer" 的信息。
我需要类似 "exchange" 方法的东西:
GCHandle h=pinArray(array);
// how to?
IntPtr oldBackingArray=exchange(h,alignedMallocCSpace(10000000,4096));
// unmanaged operations
copyValues(h,oldBackingArray);
compute(array,...); // only passing with "array" for simplicity everywhere
array[3]=5;
l=array.toList();
compute(array,....);
Console.WriteLine(array[3]);
copyValues(oldBackingArray,h);
freeCSpace(exchange(h,oldBackingArray));
unpinArray(h);
这是否需要反射来访问和更改该变量?还有许多 C# 方法在计算方法中使用这些数组,那么即使在 C# space 上它也会提供更快的速度吗?因此,我试图让 C# 对使用 "array" 对象的所有内容使用 alignedAlloc space,直到我取消固定它。
你不需要。 GCHandle
与托管内存有关;非托管内存不需要任何类型的 GCHandle
。也不能像管理数组一样与该内存对话。相反,您需要接受非托管数据是一个指针,而且只是一个指针。您可以对其进行抽象以隐藏这些细节,但这不会改变现实。幸运的是,对于不经意的观察者来说,与 SomeType[]
交谈与与 SomeType*
交谈非常相似——只要你绕过自己的长度。
将来,即将推出的 Span<T>
在统一指针和数组方面做得很好,但这目前只是实验性的。
我正在固定和取消固定:
GCHandle pinArray(object a)
{
return GCHandle.Alloc(a, GCHandleType.Pinned);
}
void unpinArray(GCHandle h)
{
h.Free();
}
在 opencl 方法之前和之后,因此数组在计算时不会移动。现在我需要将支持数组指针与对齐的非托管数组指针交换,以便对其进行更快的 read/write 操作。
但我找不到任何类似 "change value of gchandle backing array pointer" 的信息。
我需要类似 "exchange" 方法的东西:
GCHandle h=pinArray(array);
// how to?
IntPtr oldBackingArray=exchange(h,alignedMallocCSpace(10000000,4096));
// unmanaged operations
copyValues(h,oldBackingArray);
compute(array,...); // only passing with "array" for simplicity everywhere
array[3]=5;
l=array.toList();
compute(array,....);
Console.WriteLine(array[3]);
copyValues(oldBackingArray,h);
freeCSpace(exchange(h,oldBackingArray));
unpinArray(h);
这是否需要反射来访问和更改该变量?还有许多 C# 方法在计算方法中使用这些数组,那么即使在 C# space 上它也会提供更快的速度吗?因此,我试图让 C# 对使用 "array" 对象的所有内容使用 alignedAlloc space,直到我取消固定它。
你不需要。 GCHandle
与托管内存有关;非托管内存不需要任何类型的 GCHandle
。也不能像管理数组一样与该内存对话。相反,您需要接受非托管数据是一个指针,而且只是一个指针。您可以对其进行抽象以隐藏这些细节,但这不会改变现实。幸运的是,对于不经意的观察者来说,与 SomeType[]
交谈与与 SomeType*
交谈非常相似——只要你绕过自己的长度。
将来,即将推出的 Span<T>
在统一指针和数组方面做得很好,但这目前只是实验性的。