当前位置: 首页 > 知识库问答 >
问题:

如何创建和使用来自CUDA C的动态库“. so”,并在Linux环境(CentOS)下的C#代码中使用它?

姜彬郁
2023-03-14

我试图创建一个动态库。所以用CUDA C内核在Linux环境(CentOS)下的C#代码内部使用。我寻找一种方法来做到这一点,但不幸的是没有找到一个完整清晰的解决方案。有些解决方案只是其中的一部分,比如在Linux上创建C共享库,或者使用nvcc在CUDA中创建库链,但是没有从CUDA C中创建动态库的方法。就像在这个解决方案中一样。

有没有办法创建这个动态库并在C#代码中成功使用它?

共有1个答案

宇文曦
2023-03-14

在搜索了多个不同的解决方案,并试图收集和测试可用的可能性之后,我终于找到了这个简单的方法。
原始的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/

这适用于简单的CUDAC代码,也可能适用于其他代码,但根据其复杂性,可能会出现一些问题。

 类似资料:
  • 问题内容: 我想构建一个 使用用户名作为参数 的 程序,并创建用户及其主文件夹 (具有一些诸如文件夹之类的硬编码规范,以及诸如用户名之类的安全检查不能是root或现有用户)。 我的应用程序需要创建用户才能授予SSH访问权限。 该程序将使用 sudo 执行。我读过它应该用C或C ++而不是脚本编写,因为脚本很容易被利用。 您能给我 一些建议或好的做法 吗? 我应该使用一些 Pam 库吗?有没有例子?

  • 嘿,我尝试使用此代码自动创建docker容器 但我也得到了这个错误内部服务器错误(“OCI运行时创建失败:container\u linux。go:370:启动容器进程导致:exec:“git clone”:stat git clone:没有这样的文件或目录:未知”) 有什么方法可以解决这个问题吗?或者有其他方法吗?

  • 本文向大家介绍Linux shell环境下Zabbix Api的使用,包括了Linux shell环境下Zabbix Api的使用的使用技巧和注意事项,需要的朋友参考一下 在linux shell环境下直接调用就可以,根据官网所述:在访问Zabbix中的任何数据之前,你需要登录并获取身份验证令牌。这可以使用该 user.login 方法完成。 根据官网所述,返回了用户身份验证令牌"77bfe44d

  • 我一直在测试使用facebook来创建亚马逊认知用户。我一直在关注下面的链接,但据我所知,示例使用客户端代码注册用户。我需要能够通过我的API实现注册,这样我就可以在注册之前应用业务规则。 https://docs.aws.amazon.com/cognito/latest/developerguide/facebook.html null 使用认知用户池,不使用认知联合标识(标识池)

  • 问题内容: 我正在使用 python 2.7 + virtualenv版本1.10.1 来运行myproject项目。由于其他一些项目要求,我不得不使用其他版本的python( Python 3.5 )和 Django 1.9 。为此,我在用户目录中安装了python。另外,我已经将virtualenv( version-15.1.0 )下载并安装到我的用户目录中。但是每当我尝试创建虚拟环境时,都

  • 我使用python 2.7虚拟环境版本1.10.1运行myproject项目。由于一些其他项目的要求,我必须使用Python的其他版本(Python 3.5)和Django 1.9。为此,我在我的用户目录中安装了python。此外,我已经下载并安装了虚拟环境(版本-15.1.0)到我的用户目录。但是每当我试图创建虚拟环境时,我都会遇到以下错误 谁能告诉我我做错了什么