CUDA编程指南:从图形处理到通用并行计算

需积分: 16 0 下载量 174 浏览量 更新于2024-07-21 收藏 2.63MB PDF 举报
“NVIDIA CUDA Programming Guide 3.0” CUDA(Compute Unified Device Architecture)是由NVIDIA推出的并行计算平台和编程模型,旨在将图形处理器(GPU)转变为通用计算设备,以执行高性能计算任务。这份指南详细介绍了CUDA 3.0版本的编程方法和技术,对于初学者来说具有很高的学习价值。 在CUDA编程模型中,有几个关键概念: 1. **Kernels**:内核是运行在GPU上的并行可执行函数,它们可以被多个线程同时执行。程序员可以通过定义内核函数来指定GPU应如何处理数据。 2. **Thread Hierarchy**:CUDA线程组织成多级层次结构,包括线程块(thread block)、线程束(warp,一组并行执行的线程)和线程网格(grid)。这种分层结构允许程序员精细控制并行度和同步。 3. **Memory Hierarchy**:CUDA具有层次化的内存系统,包括全局内存、共享内存、纹理内存和页锁定的主机内存。全局内存是所有线程都可以访问的,而共享内存则局限于同一线程块内的线程使用。纹理内存优化了数据读取速度,适用于特定类型的访问模式。页锁定的主机内存允许GPU与CPU之间快速交换数据。 4. **Heterogeneous Programming**:CUDA支持异构编程,即同时利用CPU和GPU的计算能力。程序可以在主机代码中启动GPU内核,并在需要时传输数据。 5. **Compute Capability**:每个NVIDIA GPU都有一个特定的计算能力版本号,它定义了该设备支持的特性,如并发kernel执行、内存大小和指令集等。 编程接口方面,CUDA提供了C语言扩展CUDAC,以支持GPU编程: - **Compilation with NVCC**:CUDA程序需要通过NVCC编译器进行编译,它会生成针对特定硬件的二进制代码。NVCC支持PTX(Parallel Thread Execution)中间表示,保证代码能在不同CUDA兼容设备上运行。 - **CUDAC Extensions**:CUDAC增加了对GPU内存操作的支持,如设备内存、共享内存、多设备管理以及纹理内存和页锁定主机内存的访问。 - **Device Memory**:全局内存用于存储大部分程序数据,是所有线程可访问的。 - **Shared Memory**:线程块内的线程可以高效地共享数据,提供比全局内存更快的访问速度。 - **Multiple Devices**:如果系统有多个GPU,可以编写程序来同时利用它们的计算能力。 - **Texture Memory**:纹理内存用于优化连续数据的读取,特别适合图像和视频处理。 - **Page-Locked Host Memory**:页锁定的主机内存允许快速的GPU到CPU数据传输,常用于数据交换。 CUDA编程模型提供了一种高效的方式来利用GPU的并行性,解决科学计算、机器学习、图像处理等领域的问题。了解并掌握CUDA的编程方法和技术,能极大地提升开发者在这些领域的应用性能。

解释:if(CUDA_FOUND) message(STATUS "Found CUDA Toolkit v${CUDA_VERSION_STRING}") enable_language(CUDA) set(HAVE_CUDA TRUE) if (CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA") if(${CUDA_VERSION_STRING} VERSION_GREATER_EQUAL "11.1") execute_process(COMMAND ${CMAKE_CUDA_COMPILER} --list-gpu-code RESULT_VARIABLE EXIT_CODE OUTPUT_VARIABLE OUTPUT_VAL) if(EXIT_CODE EQUAL 0) #Remove sm_ string(REPLACE "sm_" "" OUTPUT_VAL ${OUTPUT_VAL}) #Convert to list string(REPLACE "\n" ";" __CUDA_ARCH_BIN ${OUTPUT_VAL}) #Remove last empty entry list(REMOVE_AT __CUDA_ARCH_BIN -1) else() message(FATAL_ERROR "Failed to run NVCC to get list of GPU codes: ${EXIT_CODE}") endif() elseif(${CUDA_VERSION_STRING} VERSION_GREATER_EQUAL "11.0") set(__CUDA_ARCH_BIN "35;37;50;52;53;60;61;62;70;72;75;80") elseif(${CUDA_VERSION_STRING} VERSION_GREATER_EQUAL "10.0") set(__CUDA_ARCH_BIN "30;32;35;37;50;52;53;60;61;62;70;72;75") elseif(${CUDA_VERSION_STRING} VERSION_GREATER_EQUAL "9.1") set(__CUDA_ARCH_BIN "30;32;35;37;50;52;53;60;61;62;70;72") else() set(__CUDA_ARCH_BIN "30;32;35;37;50;52;53;60;61;62;70") endif() else() message(FATAL_ERROR "Unsupported CUDA compiler ${CMAKE_CUDA_COMPILER_ID}.") endif() set(CUDA_ARCH_BIN ${__CUDA_ARCH_BIN} CACHE STRING "Specify 'real' GPU architectures to build binaries for") if(POLICY CMP0104) cmake_policy(SET CMP0104 NEW) set(CMAKE_CUDA_ARCHITECTURES ${CUDA_ARCH_BIN}) message(STATUS "CMAKE_CUDA_ARCHITECTURES: ${CMAKE_CUDA_ARCHITECTURES}") #Add empty project as its not required with newer CMake add_library(pcl_cuda INTERFACE) else() # Generate SASS set(CMAKE_CUDA_ARCHITECTURES ${CUDA_ARCH_BIN}) # Generate PTX for last architecture list(GET CUDA_ARCH_BIN -1 ver) set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -gencode arch=compute_${ver},code=compute_${ver}") message(STATUS "CMAKE_CUDA_FLAGS: ${CMAKE_CUDA_FLAGS}") add_library(pcl_cuda INTERFACE) target_include_directories(pcl_cuda INTERFACE ${CUDA_TOOLKIT_INCLUDE}) endif () endif()

2023-05-30 上传