如何创建和使用来自 CUDA C++ 的动态库".so",并在 Linux 环境 (CentOS) 下的 C# 代码中使用它?
How can I create and use a dynamic library ".so" from CUDA C++ and use it inside C# code under Linux environment (CentOS)?
我正在尝试创建一个动态库。因此使用CUDA C++内核在Linux环境(CentOS(下的C#代码中使用它。我寻找了一种方法来实现这一点,但不幸的是,没有找到一个完整清晰的解决方案。有些解决方案只是其中的一部分,比如在Linux上创建C++共享库,或者使用nvcc在CUDA中创建库链,但没有从CUDA C++创建动态库的方法。从C++创建的.so的使用可能与此解决方案类似。
有没有一种方法可以创建这个动态库并在C#代码中成功使用它?
在搜索了多个不同的解决方案,并尝试收集和测试可用的可能性后,我终于找到了这个简单的方法
原始C++库可以使用gcc在一个步骤中生成,如下所示。
gcc -shared -o dll.so -fPIC dllmain.cpp
但请确保在.cpp文件中的所需函数之前添加extern "C"
,如下所示:
#include <stdio.h>
extern "C" void func()
{
// code
}
对于CUDA C++,nvcc的使用方式与此答案和此答案的组合类似。请确保使用.so而不是.dll并使用正确的设备体系结构,我在这里使用了60,因为我正在使用";特斯拉P100-PCIE-16GB";。
nvcc -arch=sm_60 --compiler-options '-fPIC' -o dll.so --shared kernel.cu
.cu文件将与此类似。
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
extern "C" void myfunc(int a, int b, ...);
__global__ void kernel(int a, int b, ...);
__global__ void kernel(int a, int b, ...)
{
int i = threadIdx.x;
// kernel code
}
void myfunc(int a, int b, ...)
{
// code
}
现在创建了动态库.so,并且可以在类似这样的C#代码中使用。
using System;
using System.Runtime.InteropServices;
class Program
{
[DllImport("dll.so")]
static extern myfunc(int a, int b, ...);
private void Method()
{
int a, b;
// code
myfunc(a, b, ...);
}
}
然后使用Mono编译C#代码。
mcs Program.cs
mono Program.exe
但可能有必要像这样设置已使用库的路径。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library/
这适用于一个简单的CUDA C++代码,它可能适用于其他代码,但根据其复杂性可能会出现一些问题。
相关文章:
- 在 Azure DevOps 构建管道中使用英特尔C++编译器为 Linux 环境构建C++代码
- Stringstream编译错误仅发生在linux环境中
- 我可以让我的本地C 编译器与Linux环境中的编译器不同吗?
- Vulkan + GLFW + Cmake在Linux环境下的链接问题
- BLE在Linux环境中使用C++的服务器端实现
- 在Linux环境中开发Visual Studio C 项目
- C++ Linux 在部署环境中安装可执行文件
- 在 Linux 上使用 Getenv 在 C++ 中读取数组环境变量
- 在 Linux 环境中运行内联汇编(使用 GCC/G++)
- 在Linux环境下用MYSQL.h编译C++程序
- 在 Linux 环境程序中访问地址之前,如何检查地址的有效性?
- 在 Linux 上为 OpenGL 4.2 设置开发环境(查找 gl.h 时遇到麻烦)
- 用 C++ 编写一个简单的 Linux 桌面环境
- Linux环境下构建32位和64位应用程序(C++)
- 在linux环境下有适合perl和c++的智能ide吗?
- 使用OpenWRT工具链为OpenWRT Linux环境交叉编译POCO库
- 读取和Huffman压缩4字节二进制字符串STD C++Linux环境
- Linux 环境命令行参数
- 检查在linux环境下使用c++是否连接局域网设备
- 其中是特定于 Cell Linux 环境的 GDB 文档