0

我正在固定和取消固定:

    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# 为所有使用“数组”对象的所有内容使用对齐的分配空间,直到我取消固定它为止。

4

1 回答 1

1

你不需要。与GCHandle托管内存有关;非托管内存不需要任何类型的GCHandle. 也不能像管理数组一样与该内存通信。相反,您需要接受非托管数据是一个指针并且只是一个指针。您可以在此之上进行抽象以隐藏这些细节,但这不会改变现实。幸运的是,对于不经意的观察者来说,与 a 交谈与与 aSomeType[]交谈非常相似SomeType*——只要您绕过自己的长度。

未来,即将推出Span<T>的新版本在统一指针和数组方面做得很好,但这目前还只是实验性的。

于 2016-09-14T15:14:45.167 回答