C#与CUDA C dll互操作-redux

C# interop with CUDA C dll - redux

本文关键字:互操作 -redux dll CUDA      更新时间:2023-10-16

问了一些关于我正在进行的项目的问题,得到了一些很好的反馈,并取得了一些进展。这个想法是创建一个生成分形图像的应用程序,由CUDA加速。我正在C#中创建ui,并让一个DLL来完成繁重的工作。

基本上,我在C#中分配一个字节数组,将其传递给dll以填充像素数据,然后使用它创建位图,并在ui中使用Windows Forms PictureBox显示它。以前的问题有所帮助-以前使用dll来分配内存,现在使用dll和c#之间的一致调用约定,但代码仍然在"img=new Bitmap(…)"处给出System.ArgumentException

相关代码:

C++

extern "C" __declspec(dllexport) void __cdecl generateBitmap(void *bitmap)
{
int width = 1920;
int height = 1080;
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());
gpuErrchk(cudaMemcpy(bitmap, dev_bmp, (width*height*3), cudaMemcpyDeviceToHost));
cudaFree(dev_bmp);
}

c#

    public unsafe class NativeMethods
{
    [DllImport(@"C:UsersBillDocumentsVisual Studio 2012ProjectsFractalMaxUnmanagedDebugFractalMaxUnmanaged.dll", CallingConvention=CallingConvention.Cdecl)]
    public static extern void generateBitmap(void *bitmap);
    public static Bitmap create()
    {
        byte[] buf = new byte[1920 * 1080 * 3];
        fixed (void* pBuffer = buf)
        {
            generateBitmap(pBuffer);
        }
        IntPtr unmanagedPtr = Marshal.AllocHGlobal(buf.Length);
        Marshal.Copy(buf, 0, unmanagedPtr, buf.Length);
        Bitmap img = new Bitmap(1920, 1080, 3, PixelFormat.Format24bppRgb, unmanagedPtr);
        Marshal.FreeHGlobal(unmanagedPtr);
        return img;
    }
}

//。。。

private unsafe void mandlebrotButton_Click(object sender, EventArgs e)
{
    FractalBox1.Image = (Image)NativeMethods.create();
}

我还在做错什么?据我所知,所有的参数都是无效的,但当我试图创建位图时,我在System.Drawing中得到了一个无效的参数异常。

我不确定在您的情况下会发生什么,因为您没有在异常中指定哪个参数无效。我知道你的步伐一定不对。

步幅类型:System.Int32

一个整数,用于指定1开头之间的字节偏移量扫描行和下一行。这通常(但不一定)像素格式的字节数(例如,每个16位为2像素)乘以位图的宽度。传递给此的值参数必须是四的倍数。。

所以你的构造函数应该是这样的:

Bitmap img = new Bitmap(1920, 1080, 1920 * 3, PixelFormat.Format24bppRgb, unmanagedPtr);