【问题标题】:cuda - How does nvcc compile __host__ code?cuda - nvcc 如何编译 __host__ 代码?
【发布时间】:2017-08-27 20:23:11
【问题描述】:

我正在尝试将我的仅 c++ 项目转换为 cuda 代码以在 GPU 上运行。

我是 cuda 编程的新手,我不知道如何处理这种情况:

如果我有一个非常复杂的类定义,现在我想将一个类实例传递给设备并在设备上执行它的一些成员函数,那么我应该重写我的整个.cpp 文件。我只需要将设备上运行的那些函数转为__host__ __device__ 还是应该重写所有函数?

我认为nvcc 将没有函数类型限定符的函数视为__host__。它如何编译主机代码?它是否像g++ 一样编译它们?

【问题讨论】:

    标签: c++ cuda


    【解决方案1】:

    如果我有一个非常复杂的类定义,现在我想传递一个 类实例到设备并执行它的一些成员函数 在设备上,然后我应该重写我的整个 .cpp 文件。我只 需要将设备上运行的那些功能转为__host__ __device__ 或 我应该重写所有函数吗?

    这完全取决于您的代码。 CUDA 支持有限的 C++ 语言特性子集(完整记录 here),几乎不支持 C++ 标准库。所以没有通用的答案,但如果你想在 GPU 上调用它们,你可能必须至少重写一些类成员函数代码。

    我认为 nvcc 将没有函数类型限定符的函数视为__host__。它如何编译主机代码?它是否像 g++ 一样编译它们?

    首先要了解的是,nvcc 不是编译器,它是一个编译器驱动程序。默认情况下,没有 .cu 文件扩展名的文件中的纯 C++ 代码使用一组预定义的编译器选项直接传递给主机编译器,无需修改。

    .cu 扩展文件中的主机代码由 CUDA C++ 前端解析以查找 CUDA 语法,然后传递给主机编译器。此过程可能会在极其复杂的模板定义和前沿语言功能上失败。 nvcc 还自动包含 CUDA 标头,这些标头可能与您自己代码的内容发生冲突。但最终你的宿主代码会到达宿主 C++ 编译器,尽管是通过不同的途径。

    【讨论】:

      猜你喜欢
      • 2019-08-26
      • 2021-12-27
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 2011-01-21
      • 1970-01-01
      • 2012-12-09
      相关资源
      最近更新 更多