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

使用nvcc从CUDA创建DLL

佴涵蓄
2023-03-14

我想从CUDA代码(kernel.cu)创建一个. dll,以便从外部C程序中使用这个库。经过一些尝试,我只是在. cuhtml" target="_blank">文件中留下了一个简单的C函数。代码如下:

kernel.cu

#include <stdio.h>
#include "kernel.h"

void hello(const char *s) {
        printf("Hello %s\n", s);
}/*

内核.h

#ifndef KERNEL_H
#define KERNEL_H

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#ifdef __cplusplus
extern "C" {
#endif

void __declspec(dllexport) hello(const char *s);

#ifdef __cplusplus
}
#endif

#endif  // KERNEL_H

我首先尝试使用nvcc生成一个core. o对象,然后使用g创建DLL,如下所示:

nvcc -c kernel.cu -o kernel.o
g++ -shared -o kernel.dll kernel.o -L"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\x64" -lcudart

它工作正常,并生成kernel.dll。为了测试DLL文件,我编写了一个简单的程序main.c

#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

void __declspec ( dllimport ) hello(const char *s);

#ifdef __cplusplus
}
#endif

int main(void) {
        hello("World");
        return 0;
}

编译方式:

g++ -o app.exe main.c -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include" -L. -lkernel

结果是执行开始时的内存访问错误。

然而如果我重新命名。cu文件在。C(因为它只是C代码),使用相同的命令,它确实工作。nvcc的输出有变化,据我所知是因为用了默认的C编译器而不是CUDA一。

你怎么看,这是nvcc的问题吗?还是我犯了什么错误?

编辑:我忘了一些可能很重要的信息。警告出现在对g的第一次调用中(当创建dll时),并且根据.cu.c还是.cpp的不同而有所不同。

。铜

Warning: .drectve `/FAILIFMISMATCH:"_MSC_VER=1600" /FAILIFMISMATCH:"_ITERATOR_DEBUG_LEVEL=0" 
/DEFAULTLIB:"libcpmt" /DEFAULTLIB:"LIBCMT" /DEFAULTLIB:"OLDNAMES" /EXPORT:hello ' unrecognized

而且没用。

.cpp和。英语字母表中第三个字母

Warning: .drectve `/DEFAULTLIB:"LIBCMT" /DEFAULTLIB:"OLDNAMES" /EXPORT:hello ' unrecognized

它起作用了。

共有2个答案

秋兴思
2023-03-14

在visual studio中,您还可以通过浏览以下选项将它编译成. dll而不是. obj文件:

调试-

从应用程序更改选项(。exe)到动态库(。dll)

编译后可以在 DEBUG 文件夹或 RELEASE 文件夹中找到 dll

赵辉
2023-03-14

解决了。我仍然不知道为什么会发生(也许是因为没有像Robert Crovella所说的那样使用官方编译器),但将用于制作DLL的两个命令替换为这个命令是有效的:

nvcc -o kernel.dll --shared kernel.cu

请注意双破折号(nvcc是这样工作的),以及直接制作它而不是先创建. o然后从对象制作DLL的事实。

 类似资料:
  • 我的目标是:正在使用和正在使用(应该链接库)(可能还有 工作起来没有任何问题。但它并没有形成一个图书馆链。< code>library1.cu和< code>library2.cu在同一个< code >中。so文件。 失败 如果我通过检查 ,则目标(T)内部。

  • Im使用CMake生成visual studio 2013解决方案。下一步我将尝试构建它,但出现以下错误: 构建NVCC(设备)对象模块/核心/CMakeFiles/cuda_compile.dir/src/cuda/Debug/cuda_compile_generated_gpu_mat.cu.obj nvcc致命:不支持的gpu体系结构“compute_11” 我尝试版本2.10和3.0与cu

  • 我最近安装了 Cuda 工具包 v9,并一直在尝试在 Visual Studio 2017 中运行一些示例项目,以验证设置,但似乎无法通过 Visual Studio 构建 Cuda 应用程序。“微软视窗的CUDA安装指南”建议运行两个应用程序;设备查询,然后进行带宽测试。deviceQuery应用程序运行正常,但 bandwidthTest(以及我尝试过的所有其他示例应用程序)似乎都失败了,出现

  • 我正在尝试在Swiftui2.0Xcode 12.4中创建一个WebView视图,但它太新了,我找不到答案和最佳实践的好例子。对于下面的代码,我得到以下错误。 类型SwiftUIWebView不符合协议UIView表示 此外,配置设置已更改,我无法启用。正确地允许使用JavaScript。尝试将其添加到“perfs”会触发一个错误,抱怨不喜欢Bool。

  • 我有一个集成,在其中验证另一个服务创建的JSON。它们提供了一个公共endpoint来获取要验证的公共证书。 但我正在为此设置一个测试,并希望与Nimbus创建相同的JWT,以使用我自己的私钥对其进行签名。所以我这样做(这是一个嵌套的加密JWT):https://connect2id.com/products/nimbus-jose-jwt/examples/signed-and-encrypte

  • 嗨,我的要求是从创建分析,即从中提取数据,并将该数据放入HDFS位置中,然后从HDFS中使用Tableau或HUE UI创建分析报告。我在CDH5.5的spark-shell的scala控制台尝试了以下代码,但无法从http链接获取数据 我在scala控制台遇到以下错误: java.io.ioException:方案没有文件系统:http在org.apache.hadoop.fs.FileSyst