【问题标题】:Is it possible to alter .NET array allocation method?是否可以更改 .NET 数组分配方法?
【发布时间】:2015-09-14 15:40:49
【问题描述】:

我在 .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);
  }
};

【问题讨论】:

  • 我认为这是不可能的,但您可以在 unsafe 上下文中处理指针和 stackalloc

标签: c# .net memory-management cuda


【解决方案1】:

您不能在 C# 中覆盖 new 运算符或更改本机 C# 数组的行为。但是您可以使用 IEnumerable 接口和 [] 运算符来实现一个类。因此,您的类就像 C# 中的原生数组一样。

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

【讨论】:

  • 感谢您的回答。我检查了你的类型,问题是,我看到你为不同的元素类型创建了具体的类,为什么不创建泛型类型?
  • 您不能在 C# 中将指针与泛型一起使用,这就是我在 Visual Studio 中使用 tt-scripting 直接创建所有不同类的原因。首先,我有另一种使用带有封送处理的泛型的方法,但这太慢了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 2017-09-27
  • 2012-12-15
  • 1970-01-01
  • 2010-09-19
相关资源
最近更新 更多