真实计算能力:
这是指 GPU 硬件本身的计算能力,它由两个主要数字构成(例如,7.5),第一个数字代表主版本号,第二个数字代表次版本号。这些版本号直接对应于硬件的架构特性,如核心数量、时钟速度、内存带宽等。
真实计算能力决定了 GPU 支持的 CUDA 特性,包括:
原子操作、浮点精度、内存分配大小、核心数、线程和块的数量等限制
虚拟计算能力
虚拟计算能力是一个更加灵活的概念,用于软件层面。它允许开发者编译程序时指定一个虚拟的计算能力目标,以使生成的程序能在具有至少该虚拟计算能力的任何实际设备上运行。
这意味着,开发者可以为一种较新的计算能力编译程序,而该程序仍然能在只满足该虚拟计算能力要求的较旧硬件上运行。
虚拟计算能力主要用于保持程序的兼容性,尤其是在面对多种不同硬件时非常有用,因为它可以减少需要为特定硬件重新编译代码的次数。
总结
真实计算能力反映了 GPU 的硬件特性,虚拟计算能力是为了软件兼容性和灵活性而设计
在cuda编程时怎么使用两者来确保兼容性问题
1.在CMakeLists指定虚拟计算能力和真实计算能力
cmake_minimum_required(VERSION 3.16)
project(MyCudaApp LANGUAGES CXX CUDA)
# 设置 CUDA 编译器和链接器选项
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -arch=sm_75 -code=sm_75,compute_80")
# 添加可执行文件
add_executable(cuda_app 1.cu)
真实计算能力:-arch=sm_75
这表示您的程序将被优化为特定于计算能力 7.5 的硬件。这个参数会生成针对版本 7.5 的 NVIDIA GPU 的代码。该代码将直接利用该硬件架构的所有优势,如更快的执行速度和更高效的资源使用。
虚拟计算能力:-code=sm_75,compute_80
sm_75 指再次确认了针对计算能力 7.5 的 GPU 的优化代码。
compute_80 表示还生成了一份可在任何具有计算能力至少为 8.0 的 GPU 上运行的更通用的代码。这个设置确保了程序可以在旧硬件上以最佳性能运行的同时,也能在新硬件上运行,尽管可能不会完全优化利用新硬件的所有特性。
同时指定虚拟计算能力和真实计算能力可以获得较好的性能和可移植性
注意:
虚拟计算能力可以尽可能低,以便程序能够运行
真实计算能力尽可能和硬件的计算能力一致,以便获得更好的优化