CUDA编程指南:NVIDIA GPGPU官方教程

3星 · 超过75%的资源 需积分: 20 91 下载量 42 浏览量 更新于2023-07-05 收藏 2.95MB PDF 举报
"NVIDIA CUDA C Programming Guide 是一本详细介绍如何在NVIDIA公司的GPU上进行并行编程的官方指南,适用于GPGPU(通用计算GPU)的CUDA平台,是学习CUDA C语言的重要教材。此版本为3.1.1,日期为2010年7月21日。" CUDA是NVIDIA推出的一种编程模型,它允许开发者利用GPU的强大计算能力执行通用计算任务,而不仅仅是图形处理。CUDA C是用于CUDA编程的语言,基于标准的C/C++,但增加了对并行计算特性的支持。 从版本3.1.1的更新中可以看出以下几个关键变化: 1. 移除了关于在64位主机代码中加载32位设备代码的部分,因为此功能在下一个工具包版本中将不再被支持。这意味着开发者需要确保他们的代码与目标GPU的位宽兼容。 2. 在3.2.6.3节中,提到了所有计算能力大于1.0的设备现在都支持映射的页锁定主机内存。这是一项优化,允许更快的主机与设备之间的数据交换,因为它消除了内存拷贝的开销。 3. 在3.2.7.1节中,指出对于64KB或更小的内存块,主机与设备之间的内存复制是异步的。这表示开发者可以并行执行多个内存操作,提高程序效率。 4. 修正了2.0计算能力设备的最大3D纹理引用大小(2048而不是4096),见G.1节。这对于使用大纹理的图形和计算应用来说是重要的规格更新。 5. 在C.2.1节中,关于`__fdividef(x, y)`函数的行为进行了澄清,解释了其在不同计算能力和编译标志下的行为。这个浮点除法函数的行为可能因硬件和编译选项而异。 本书的目录结构通常包括: 1. 第1章介绍了从图形处理到通用并行计算的转变,阐述了CUDA作为通用并行计算架构的角色,以及其可扩展的编程模型。这一章为初学者提供了基础概念和背景知识。 1.1节深入探讨了GPU如何从专用于图形处理转变为能够处理广泛计算任务的平台。 1.2节详细介绍了CUDA架构,包括GPU的多线程结构和内存层次。 1.3节则讨论了CUDA编程模型的可扩展性,包括并行执行单元、线程和线程块的组织。 通过这些章节,读者可以逐步掌握CUDA编程的基础,包括如何定义和管理线程、内存空间、同步以及如何有效地利用GPU的并行性。随着对CUDA编程的理解加深,开发者能够编写出高效利用GPU资源的并行应用程序,解决各种计算密集型问题,如物理模拟、科学计算、图像处理和机器学习等。

解释: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 上传