C# 是否可以更改.NET数组分配方法?

C# 是否可以更改.NET数组分配方法?,c#,.net,memory-management,cuda,C#,.net,Memory Management,Cuda,我正在通过.NET中的p/Invoke使用CUDA。在CUDA中,它们提供了一种特殊的内存分配方法,可以在GPU上分配内存,同时,您可以从主机访问它们(当然,从.NET的角度来看是非托管内存)。这被称为CUDA的统一内存,它模糊了CPU和GPU内存之间的线路板 那么,是否可以将默认的.NET阵列内存分配方法更改为自定义的非托管内存分配?在该数组中,我只需要存储非常简单的基本类型,如int、double 例如,在CUDA C++中,它们重写新< /Cuff>运算符,使该类从CPU和GPU都可以看到

我正在通过.NET中的p/Invoke使用CUDA。在CUDA中,它们提供了一种特殊的内存分配方法,可以在GPU上分配内存,同时,您可以从主机访问它们(当然,从.NET的角度来看是非托管内存)。这被称为CUDA的统一内存,它模糊了CPU和GPU内存之间的线路板

那么,是否可以将默认的.NET阵列内存分配方法更改为自定义的非托管内存分配?在该数组中,我只需要存储非常简单的基本类型,如int、double

例如,在CUDA C++中,它们重写<代码>新< /Cuff>运算符,使该类从CPU和GPU都可以看到:

class Managed {
public:
  void *operator new(size_t len) {
    void *ptr;
    cudaMallocManaged(&ptr, len);
    cudaDeviceSynchronize();
    return ptr;
  }

  void operator delete(void *ptr) {
    cudaDeviceSynchronize();
    cudaFree(ptr);
  }
};

不能重写C#中的新运算符或更改本机C#数组的行为。但是您可以使用IEnumerable接口和[]-运算符实现一个类。因此,您的类将像C#中的本机数组一样工作


我已经为我的managedCuda库在Cuda中的托管内存实现了这一点,下面是指向上源代码的直接链接。我还进行了一个小的性能测试,结果表明cuda管理的内存在从主机读写时与本机C#数组的速度差不多。

我认为这是不可能的,但您可以在上下文中处理指针。谢谢您的回答。我检查了你的类型,问题是,我看到你为不同的元素类型创建了具体的类,为什么不创建泛型类型?你不能在C#中使用泛型指针,这就是为什么我在visual studio中使用tt脚本直接创建所有不同的类。首先,我有另一种方法使用泛型进行封送,但这太慢了。