C#与CUDA C dll互操作-redux
C# interop with CUDA C dll - redux
问了一些关于我正在进行的项目的问题,得到了一些很好的反馈,并取得了一些进展。这个想法是创建一个生成分形图像的应用程序,由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);
相关文章:
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 编译为 wasm 的 C++ 和 Rust 程序可以以某种方式互操作吗?
- 有什么语言可以与C++互操作吗
- 使 Flutter C/C++ 互操作示例正常工作
- C++互操作(隐式 PInvoke)的限制
- COM 互操作结构定义与内存布局不匹配
- _Complex 和 std::complex 之间的 C/C++ 互操作
- C# COM 服务器互操作 - System.InvalidCastException.
- 从C++与 C 灵活阵列成员互操作的正确方法是什么?
- 如何通过 COM 互操作访问复杂对象的属性?
- 如何区分"QObject"的亲子关系关注点,例如与其他所有者进行互操作?
- DirectWrite GDI 互操作:使用"IDWriteFontFace"绘制文本的简单方法
- opencl openGL互操作内核参数用于读取 写入
- Rust 互操作与 C++ std::string
- 将互操作 HwndSource 包装在 c++/cli 中,以用于本机 c++/MFC 应用程序
- 跨 C# 和 COM 互操作使用对象C++
- 尝试为c++互操作自动生成库时出错
- 在MS Visual Studio 2010上使用带有Cuda互操作的OpenGL缓冲区时出现异常错误
- WinRT 组件内C++类之间的互操作
- C#与CUDA C dll互操作-redux