2015-09-14 44 views
1

我在.NET中通过P/Invoke使用CUDA。在CUDA中,它们提供了一种特殊的内存分配方法,它可以在GPU上分配内存,同时可以从主机访问它们(当然,从.NET角度来看,这是非托管内存)。这被称为CUDA的统一存储器,它模糊CPU和GPU内存之间的板卡。是否有可能改变.NET数组的分配方法?

那么,是否有可能将默认的.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); 
    } 
}; 
+0

我不认为这是可能的,但你可以处理指针和[''stackalloc''](https://msdn.microsoft.com/en-US/library/cx9s2sy4.aspx)在[ ''unsafe''](https://msdn.microsoft.com/en-US/library/chfa2zb8.aspx)上下文。 –

回答

1

不能覆盖C#中的新运营商或改变行为本地C#数组。但是你可以用IEnumerable接口和[]操作符实现一个类。因此,你的类将像C#中的本地数组一样行事。

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

+0

感谢您的回答。我检查了你的类型,问题是,我看到你为不同的元素类型创建具体的类,为什么不制作泛型? –

+0

您不能在C#中使用带泛型的指针,这就是为什么我在visual studio中使用tt-scripting来直接创建所有不同的类。首先,我有另一种使用泛型编组的方法,但这太慢了。 – kunzmi

相关问题