CUDA C编程指南:从入门到实践

需积分: 10 2 下载量 36 浏览量 更新于2024-07-23 收藏 3.01MB PDF 举报
"CUDA_C_Programming_Guide" CUDA(Compute Unified Device Architecture)是NVIDIA推出的一种并行计算平台和编程模型,用于利用图形处理单元(GPU)进行高性能计算。CUDA_C_Programming_Guide 是一份详细的指南,旨在帮助开发者理解和使用CUDA编程接口,以便在NVIDIA GPU上编写高效的应用程序。 CUDA编程模型的核心概念包括: 1. **CUDA线程**:CUDA线程是执行计算的基本单元,它们被组织成多级结构,包括线程块(Thread Blocks)、线程网格(Grids)以及更细粒度的warps。每个线程有自己的独立执行路径,可以并行运行。 2. **SIMT架构**:SIMT(Single Instruction Multiple Threads)是CUDA的硬件实现基础,类似于CPU的SISD(Single Instruction Single Data)。在一个warp内,所有线程同时执行同一指令,但可以有不同的数据。 3. **内存层次**:CUDA提供了多种内存类型,如全局内存、共享内存、常量内存和纹理内存,每种都有其特定的访问速度和使用场景。例如,全局内存是所有线程都能访问的,而共享内存则局限于同一个线程块内的线程。 4. **内存操作**:CUDA编程涉及到内存管理,包括数据传输、内存分配和同步。内存 fence 函数用于控制内存操作的顺序和可见性,确保数据一致性。 5. ** warp vote 函数**:这些函数允许在一个warp内的线程进行投票操作,例如,所有线程都返回相同的值或找出第一个满足条件的线程等。 6. **读-只数据缓存加载函数**:为了提高效率,CUDA引入了读-只数据缓存加载函数,使得对全局内存的频繁访问能被缓存,减少延迟。 7. **内置函数和浮点运算标准**:CUDA提供了许多内置函数,如数学函数、位操作函数等,以及与IEEE浮点运算标准兼容的指令。例如,erff()、erfcinv()和normcdfinv()的误差边界在新版本中进行了更新。 8. **内在函数**:内在函数是直接映射到GPU硬件指令的函数,如新的__dsub_r{n,z,u,d}和__fsub_r{n,z,u,d},提供了浮点数的减法操作,并有不同精度选项。 9. **指令吞吐量**:在Arithmetic Instructions部分,指南详细介绍了更多指令的执行速度,这对于优化代码性能至关重要。 10. **模块和PTX链接器**:CUDA模块是编译单元,可以包含多个源文件。新版本的PTX链接器示例展示了如何将多个模块链接成一个可执行文件。 通过这份CUDA编程指南,开发者不仅可以学习到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 上传