在带有C#应用程序的DLL中使用CUDA

在带有C#应用程序的DLL中使用CUDA,c#,c++,dll,cuda,unmanaged,C#,C++,Dll,Cuda,Unmanaged,我想做的是编写一个C#应用程序来生成分形图(mandlebrot和julia集)。我用非托管C++和CUDA做重举,C为用户界面。当我尝试运行此代码时,我无法调用我在DLL中编写的方法-我得到一个无效参数的未处理异常错误 C++的DLL被设计成返回一个指向位图的像素数据的指针,它被.NET位图使用来创建位图并在PICTIOBox控件中显示它。 以下是相关代码: C++:(为了简洁起见省略了CUDA方法 extern "C" __declspec(dllexport) int* generate

我想做的是编写一个C#应用程序来生成分形图(mandlebrot和julia集)。我用非托管C++和CUDA做重举,C为用户界面。当我尝试运行此代码时,我无法调用我在DLL中编写的方法-我得到一个无效参数的未处理异常错误

C++的DLL被设计成返回一个指向位图的像素数据的指针,它被.NET位图使用来创建位图并在PICTIOBox控件中显示它。 以下是相关代码:

C++:(为了简洁起见省略了CUDA方法

extern "C" __declspec(dllexport) int* generateBitmap(int width, int height)
{
int *bmpData = (int*)malloc(3*width*height*sizeof(int));
int *dev_bmp;

gpuErrchk(cudaMalloc((void**)&dev_bmp, (3*width*height*sizeof(int))));

kernel<<<BLOCKS_PER_GRID, THREADS_PER_BLOCK>>>(dev_bmp, width, height);
gpuErrchk(cudaPeekAtLastError());
gpuErrchk(cudaDeviceSynchronize());

cudaFree(dev_bmp);
return bmpData;
}
错误:

************** Exception Text **************
Managed Debugging Assistant 'PInvokeStackImbalance' has detected a problem in 'C:\...WindowsFormsApplication1.vshost.exe'.
<> P>我相信我的问题是用ItpTR——这是从非托管C++传递指针到C语言应用程序的正确方法吗?有更好的方法吗?是通过指针来完成我正在做的事情还是有更好的方法把像素数据从非托管C++ W/CUDA传递到C? 编辑:

从我调试应用程序时收到的错误中收集到的信息来看,PinvokeStackDistancement意味着非托管代码和托管代码的签名不匹配。但是,它们在我看来确实匹配


我觉得我在这里遗漏了一些明显的东西,任何帮助或推荐阅读都将不胜感激。

您需要在C和C中定义相同的调用约定: 在C中:

在C#中:

除了cdecl,您还可以使用stdcall,它只需要在两侧都相同。
在处理我自己的大量托管/非托管代码时,我建议您将图像数组作为参数传递,并在C语言中执行内存分配。这样,您就不需要在管理的世界中手动释放内存。

我将进一步深入,并在C++ DLL中保持任何不安全或不管理的状态。因此,我将在TH中创建位图。E+C++函数,使用代码>锁位< /代码> />代码>解锁位< /代码>以获取内存。
************** Exception Text **************
Managed Debugging Assistant 'PInvokeStackImbalance' has detected a problem in 'C:\...WindowsFormsApplication1.vshost.exe'.
extern "C" __declspec(dllexport) int* __cdecl generateBitmap(int width, int height)
[DllImport(@"C:\...\FractalMaxUnmanaged.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr generateBitmap(int width, int height);