是否有可能改变.net数组分配方法?

本文关键字:分配 方法 数组 net 能改变 是否 | 更新日期: 2023-09-27 18:12:37

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

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

例如,在CUDA c++中,它们覆盖new操作符,使该类从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);
  }
};

是否有可能改变.net数组分配方法?

您不能在c#中重写new操作符或更改本机c#数组的行为。但是你可以用IEnumerable接口和[]-操作符实现一个类。因此,你的类就像c#中的本地数组一样。

我已经为我的managedCuda库在Cuda中实现了托管内存,这里是直接链接到GitHub上的源代码。我还进行了一些性能测试,结果表明cuda管理的内存在从主机读取和写入时大约与本机c#数组一样快。