我正在固定和取消固定:
GCHandle pinArray(object a)
{
return GCHandle.Alloc(a, GCHandleType.Pinned);
}
void unpinArray(GCHandle h)
{
h.Free();
}
在 opencl 方法之前和之后,因此数组在计算时不会移动。现在我需要用对齐的非托管数组指针交换后备数组指针,以便对其进行更快的读/写操作。
但我找不到像“更改 gchandle 支持数组指针的值”这样的信息。
我需要类似“交换”方法的东西:
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# 空间上也会提供更快的速度吗?因此,我试图让 C# 为所有使用“数组”对象的所有内容使用对齐的分配空间,直到我取消固定它为止。