使用 CUDA __device__ 函数时出现链接器错误 2005 和 1169(多重定义的符号)(默认情况下应内联)

2024-04-11

这个问题与以下问题有很大关系:

A) 如何将CUDA代码分成多个文件 https://stackoverflow.com/questions/2090974/how-to-separate-cuda-code-into-multiple-files

B) 尝试同时编译多个 CUDA 文件时出现链接错误 LNK2005 https://stackoverflow.com/questions/1976587/link-error-lnk2005-when-trying-to-compile-several-cuda-files-togheter

以下建议来自这里:https://meta.stackexchange.com/questions/42343/same-question-but-not-quite https://meta.stackexchange.com/questions/42343/same-question-but-not-quite和这里https://meta.stackexchange.com/questions/8910/asking-a-similar-but-not-the-same-question https://meta.stackexchange.com/questions/8910/asking-a-similar-but-not-the-same-question

我问一个非常相似的问题,但我想绝对清楚我的问题和上面链接的问题之间的区别在哪里。

当包含头文件时,我从标题中收到链接器错误,其中包含 a 的定义__device__函数,到多个源文件中。

这与链接 A) 不同,链接 A) 会发生相同的错误__kernel__函数因为__device__根据CUDA手册暗示inline:

在为计算能力 1.x 的设备编译的设备代码中,__device__默认情况下,函数始终是内联的。这__noinline__然而,函数限定符可以用作编译器在可能的情况下不要内联函数的提示(请参见第 E.1 节)。

链接 B) 更相关(一个答案正确地指出,无论手册说什么,它似乎都不会内联),但链接 B) 指的是 NVIDIA 提供的标头而不是自己的标头,因此问题很可能是位于我的头文件中,它不太可能位于 NVIDIA 头文件中。换句话说,链接 B) 和我的问题很可能有不同的答案。

与此同时,我发现将函数声明为__device__ inline解决了问题,因此以上内容只是为世界其他地区记录解决方案。

悬而未决的问题是这种行为的原因。

我想出的可能的解释:

  • 说明书有误
  • nvcc -arch=compute_11不符合“为计算能力 1.x 的设备进行编译”的资格,或者 nvcc 中存在错误
  • 这是 MS-VS 特定的,并且可以在 NVIDIA 测试的平台上运行
  • 我对如何做有一个严重的误解inline作品。可以在这里找到与 cuda 无关的示例:使用内联函数多重定义的链接器错误 https://stackoverflow.com/questions/3160484/multiply-defined-linker-error-using-inlined-functions我的理解是“caf”所表达的“编译器不应该生成函数的外部定义,因此它不应该打扰链接器”那里的其他人似乎不同意。

如果有更有洞察力的人能够澄清这里发生的事情,我将不胜感激。


在 MS VS 以及 gcc 和可能的其他编译器中(但不是在“多重定义的链接器错误”链接引用的编译器中),内联默认意味着静态。您可以强制函数成为外部内联,但是,除非您这样做,否则编译器不会将函数的外部定义放入目标文件中,或者会将其标记为可以安全复制。

然而,文档中没有任何地方说 CUDA__device__函数被有效地声明为内联(因此是静态的)。文档说该函数“默认情况下总是内联的”。有一个微妙的区别。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 CUDA __device__ 函数时出现链接器错误 2005 和 1169(多重定义的符号)(默认情况下应内联) 的相关文章

  • __syncthreads() 死锁

    如果只有部分线程执行 syncthreads 会导致死锁吗 我有一个这样的内核 global void Kernel int N int a if threadIdx x
  • 无法在 CUDA 中执行设备内核

    我正在尝试在全局内核中调用设备内核 我的全局内核是矩阵乘法 我的设备内核正在查找乘积矩阵每列中的最大值和索引 以下是代码 device void MaxFunction float Pd float max int x threadIdx
  • 为什么 Visual Studio 只允许项目中的每个文件有一个链接?

    我希望在一个解决方案的多个不同项目中拥有一个文件 但是 Visual Studio 只允许每个解决方案有一个到该文件的链接 有办法解决这个问题吗 VS 项目中的单个文件有多个软链接会出现什么问题 Update 我已经添加了下面评论中所述的链
  • 设置最大 CUDA 资源

    我想知道是否可以设置 CUDA 应用程序的最大 GPU 资源 例如 如果我有一个 4GB GPU 但希望给定的应用程序只能访问 2GB 如果它尝试分配更多 就会失败 理想情况下 这可以在进程级别或 CUDA 上下文级别上设置 不 目前没有允
  • 在VS2008中,对于网站的FTP发布,有没有办法保存FTP登录密码?

    我喜欢 Visual Studio 2008 IDE 集成 非命令行 功能 可以选择通过 FTP 将 ASP NET 网站发布到我的网络服务器 我可以存储我的 FTP 用户名 但没有看到任何存储我的 FTP 密码的选项 因此我每次发布时都必
  • 在 __device/global__ CUDA 内核中动态分配内存

    根据CUDA 编程指南 http developer download nvidia com compute cuda 3 2 prod toolkit docs CUDA C Programming Guide pdf 第 122 页 可
  • Cuda 6.5 找不到 - libGLU。 (在 ubuntu 14.04 64 位上)

    我已经在我的ubuntu上安装了cuda 6 5 我的显卡是 GTX titan 当我想要制作 cuda 样本之一时 模拟 粒子 我收到这条消息 gt gt gt WARNING libGLU so not found refer to C
  • 尝试构建我的 CUDA 程序时出现错误 MSB4062

    当我尝试构建我的第一个 GPU 程序时 出现以下错误 有什么建议可能会出什么问题吗 错误 1 错误 MSB4062 Nvda Build CudaTasks SanitizePaths 任务 无法从程序集 C Program 加载 文件 M
  • 获取:错误C2668:'sqrt':对重载函数的不明确调用[重复]

    这个问题在这里已经有答案了 尝试根据教科书中给出的示例构建下面的源代码 我使用的是 Visual Studio 2008 编译器似乎不知道如何处理 sieve 1 gt Rebuild All started Project fig21 4
  • 如何在cmake中添加cuda源代码的定义

    我使用的是 Visual Studio 2013 Windows 10 CMake 3 5 1 一切都可以使用标准 C 正确编译 例如 CMakeLists txt project Test add definitions D WINDOW
  • 在 cudaFree() 之前需要 cudaDeviceSynchronize() 吗?

    CUDA 版本 10 1 帕斯卡 GPU 所有命令都发送到默认流 void ptr cudaMalloc ptr launch kernel lt lt lt gt gt gt ptr cudaDeviceSynchronize Is th
  • 为什么这些双精度数的返回值为-1.#IND?

    I have double score cvMatchContourTrees CT1 CT2 CV CONTOUR TREES MATCH I1 0 0 cout lt
  • TensorRT 多线程

    我正在尝试使用 python API 来使用 TensorRt 我试图在多个线程中使用它 其中 Cuda 上下文与所有线程一起使用 在单个线程中一切正常 我使用 docker 和 tensorrt 20 06 py3 图像 onnx 模型和
  • TeamCity 命令行构建运行程序:如何使构建失败?

    我们使用 TeamCity 的命令行构建运行程序来调用 bat 文件 bat 文件通过调用 Visual Studio 2008 的 devenv exe 来构建我们的解决方案 然后执行单元测试并创建正确的文件夹结构 我们想要做的是 如果对
  • Visual Studio 2008 中的本地化

    我正在尝试在 VS2008 中本地化桌面应用程序 C 我已经掌握了多种语言的表单本地化 并且我还有一个用于通用字符串的项目资源文件 但我无法弄清楚如何创建该文件的多个语言版本 似乎没有任何地方记录它 结果似乎是 如果我想生成应用程序的德语版
  • vs2008循环引用(c#)

    这是我在 vs2008 解决方案中的设置 名为 MyProject Data 的项目中的数据层 名为 MyProject Web 的项目中的 Web 应用程序 MyProject Web 引用了 MyProject Data 在 MyPro
  • 如何以编程方式在 vs 2008 中创建新的空白解决方案?

    基于设计的方法是 新建项目 gt 其他项目类型 gt Visual Studio 解决方案 gt 空白解决方案 我必须在 C 中以编程方式创建一个空白解决方案 并在此解决方案中添加新的空项目和文件 我在网上找到了很多使用 DTE 的代码 但
  • cudaMemcpy() 与 cudaMemcpyFromSymbol()

    我试图找出原因cudaMemcpyFromSymbol 存在 似乎 symbol func 可以做的所有事情 nonSymbol cmd 也可以做 symbol func 似乎可以轻松移动数组或索引的一部分 但这也可以使用 nonSymbo
  • 要发布哪些运行时库?

    我使用 Visual Studio 2008 进行 C C 工作 我相信我并不关心我的代码使用了哪些运行时库 因为我有开发人员设置 但是 当交付可执行文件时 所使用的运行时库也需要一起交付 我对吗 如果是 我如何确定实际使用了哪些共享库 或
  • RestKit链接器错误

    我一直遵循 RestKit 安装说明 但现在在尝试构建应用程序时出现错误 这是针对 ios iPad 的 我收到 命令 Developer Platforms iPhoneSimulator platform Developer usr b

随机推荐