- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近开始了解 NVCC 如何为不同的计算架构编译 CUDA 设备代码。
根据我的理解,当使用 NVCC 的 -gencode 选项时,“arch”是程序员应用程序所需的最低计算架构,也是 NVCC 的 JIT 编译器将为其编译 PTX 代码的最低设备计算架构。
我也明白 -gencode 的“代码”参数是 NVCC 完全编译应用程序的计算架构,因此不需要 JIT 编译。
在检查了各种 CUDA 项目 Makefile 后,我注意到以下情况经常发生:
-gencode arch=compute_20,code=sm_20
-gencode arch=compute_20,code=sm_21
-gencode arch=compute_21,code=sm_21
-arch compute_20
-code sm_20
-code sm_21
最佳答案
粗略地说,代码编译流程是这样的:
CUDA C/C++设备代码源--> PTX --> SASS
虚拟架构(例如 compute_20
,无论 -arch compute...
指定什么)决定将生成什么类型的 PTX 代码。附加开关(例如 -code sm_21
)确定将生成什么类型的 SASS 代码。 SASS 实际上是 GPU(机器语言)的可执行目标代码。一个可执行文件可以包含多个版本的 SASS 和/或 PTX,并且有一个运行时加载器机制可以根据实际使用的 GPU 选择合适的版本。
正如您所指出的,GPU 操作的一项便利功能是 JIT 编译。 JIT 编译将由 GPU 驱动程序完成(不需要安装 CUDA 工具包),只要有合适的 PTX 代码可用,但合适的 SASS 代码不可用。 “合适的 PTX”代码的定义是在数值上等于或低于运行代码的目标 GPU 架构的代码。选择一个例子,指定 arch=compute_30,code=compute_30
会告诉 nvcc 在可执行文件中嵌入 cc3.0 PTX 代码。此 PTX 代码可用于为 GPU 驱动程序支持的任何 future 架构生成 SASS 代码。目前,这将包括 Pascal、Volta、Turing 等架构,假设 GPU 驱动程序支持这些架构。
包含多个虚拟架构(即 PTX 的多个版本)的一个优点是,您可以与更多种类的目标 GPU 设备具有可执行兼容性(尽管某些设备可能会触发 JIT 编译以创建必要的 SASS)。
包含多个“真实 GPU 目标”(即多个 SASS 版本)的优势之一是,当存在这些目标设备之一时,您可以避免 JIT 编译步骤。
如果您指定了一组错误的选项,则可能会创建一个无法(正确)在特定 GPU 上运行的可执行文件。
指定大量这些选项的一个可能的缺点是代码大小膨胀。另一个可能的缺点是编译时间,当您指定更多选项时,编译时间通常会更长。
也可以创建不包含 PTX 的可执行文件,这可能对那些试图隐藏其 IP 的人感兴趣。
创建适用于 JIT 的 PTX 应该由 specifying a virtual architecture 完成为 code
转变。
关于cuda - 在 Nvidia 的 NVCC 编译器中使用多个 "arch"标志的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17599189/
我已经在我的电脑上安装了 CUDA 工具包,但似乎有些东西坏了。 nvcc 无法编译,像这样的简单 hello-world 也无法编译: #include int main(int argc, ch
我想知道,为什么 NVCC 无法为小矩阵 (N=4) 展开以下 Cholesky 分解内核。 template __device__ inline void choleskyKernel2(T* C)
我将 cuda sdk 5.0 安装到/opt 甚至编译了所有示例,但我无法执行 nvcc。这是一些控制台输出: 我正在使用 linux mint 13。 最佳答案 更新 我对 .bash_profi
我想将我的 CUDA 代码组织成单独的目标文件,以便在编译结束时进行链接,就像在 C++ 中一样。为此,我希望能够声明一个指向 __constant__ 的外部指针。内存在头文件中,并将定义放在 .c
NVCC 对设备代码的优化效果如何?它是否进行了诸如常量折叠和公共(public)子表达式消除之类的优化? 例如,它会减少以下内容: float a = 1 / sqrtf(2 * M_PI); fl
我正在尝试在 CUDA 中做这样的事情: char_sig=code[k][1] & 0b00000010; 而且 NVCC 编译器一直给我错误预期的“;” 相同的代码适用于 GCC C 编译器。我注
我正在尝试在 CUDA 中做这样的事情: char_sig=code[k][1] & 0b00000010; 而且 NVCC 编译器一直给我错误预期的“;” 相同的代码适用于 GCC C 编译器。我注
这个问题已经有答案了: Using CUDA with Visual Studio 2017 (9 个回答) 已关闭 6 年前。 我一直在尝试让 CUDA 在我的电脑上运行。我尝试干净(重新)安装最新
为什么编译器不做一些可以在内核中完成的简单优化?我有以下矩阵乘法代码: __global__ void matrixMultiply(float * A, float * B, float * C,
我刚刚开始在 CUDA 上编码,我试图将我的代码管理到一堆不同的文件中,但我的一个宏由于某种原因不会接受传递的参数。 错误是: addkernel.cu(19): error: identifier
请原谅我的菜鸟。我们的研究小组最近购买了一台服务器,其中装有 2 个 NVIDIA Tesla 单元,我负责设置它。 服务器单元正在运行 Rocks 6.0。 所以我根据以下说明安装从 NVIDIA
我希望 NVCC 将以下警告视为错误: warning : calling a __host__ function("foo") from a __host__ __device__ function
我有一个项目正在使用 CUDA 运行。由于各种原因,它需要编译一个可执行文件,无论是否支持 GTK,无需重新编译所有相关文件。在 C 下,我通过将对象的基本版本编译为 *.o 来完成此操作。和对象的
我在带有 GTX 570(计算能力 2.0)的 Ubuntu 10.10 上使用 CUDA 4.0,以及 GCC 编译器套件。据我了解,在编译过程中,CUDA 编译器驱动程序 nvcc 拆分了 .cu
我正在尝试在我的 GPU 上测量峰值单精度触发器,因为我正在修改 PTX 文件以在寄存器上执行连续的 MAD 指令。不幸的是,编译器正在删除所有代码,因为它实际上没有任何用处,因为我没有执行任何数据加
我需要从命令行使用 nvcc 编译 cuda .cu 文件。该文件是“vectorAdd_kernel.cu”并包含以下代码: extern "C" __global__ void VecAdd_ke
我正在尝试使用 nvcc 编译一个 .cu 程序,但每次我尝试在 Unix 中编译后,我的命令都不再有效。我得到一个错误: “命令”:找不到命令。 这是为什么呢?每次编译后我都必须注销/退出。 [编辑
我正在尝试将 nvcc 与最简单的示例一起使用,但它无法正常工作。我正在编译并执行来自 https://devblogs.nvidia.com/easy-introduction-cuda-c-and
在我的 mac(Snow Leopard) 上更新 CUDA 后,nvidia 的 nvcc 编译器在编译时表现得很奇怪: nvcc batched_gemm.cu 我收到以下编译错误,我不知道如何
我正在尝试编译一些 CUDA,我希望显示编译器警告。相当于: g++ fish.cpp -Wall -Wextra 除了 NVCC 不理解这些,你必须通过它们: nvcc fish.cu --comp
我是一名优秀的程序员,十分优秀!