CUDA--用于大量数据的超级计算
CUDA介绍与案例

CUDA介绍与案例CUDA架构将GPU的大量并行计算能力开放给开发者,通过简化GPU 编程的复杂性,使得开发者可以更容易地利用并行计算来加速各种任务。
CUDA的核心思想是将计算任务划分成很多个互不相关的小任务,并在GPU 上并行执行这些小任务。
这种并行计算模型使得GPU能够执行大量的浮点计算,从而大大提高计算性能。
CUDA主要包括两个方面的内容:CUDA框架和CUDA工具包。
CUDA框架包括了GPU计算架构、编译和链接工具、运行时API等。
CUDA工具包提供了诸如CUDA C编译器、CUDA GDB(CUDA调试工具)、CUDAProfiler(CUDA性能分析器)等工具,可以帮助开发者进行CUDA程序的开发、调试和性能优化。
现在让我们来看一个使用CUDA加速的实际案例。
假设我们要计算一个非常大的矩阵的乘法。
传统的CPU计算方法会在一个线程上进行逐个元素的计算,效率低下。
而使用CUDA可以将这个任务划分成多个并行的小任务,在GPU上同时执行,大大提高计算速度。
以下是一个示例的CUDA 程序:```cpp#include <iostream>#define MATRIX_SIZE 1024__global__ void matrixMul(float *a, float *b, float *c, int size)int col = blockIdx.x * blockDim.x + threadIdx.x;int row = blockIdx.y * blockDim.y + threadIdx.y;float sum = 0.0f;if (col < size && row < size)for (int i = 0; i < size; ++i)sum += a[row * size + i] * b[i * size + col];}c[row * size + col] = sum;}int mainfloat *a, *b, *c;float *dev_a, *dev_b, *dev_c;int size = MATRIX_SIZE * MATRIX_SIZE * sizeof(float); //分配CUDA内存cudaMalloc((void**)&dev_a, size);cudaMalloc((void**)&dev_b, size);cudaMalloc((void**)&dev_c, size);//初始化矩阵a = new float[MATRIX_SIZE * MATRIX_SIZE];b = new float[MATRIX_SIZE * MATRIX_SIZE];c = new float[MATRIX_SIZE * MATRIX_SIZE];for (int i = 0; i < MATRIX_SIZE * MATRIX_SIZE; ++i)a[i]=1.0f;b[i]=1.0f;}//将数据从主机内存复制到设备内存cudaMemcpy(dev_a, a, size, cudaMemcpyHostToDevice);cudaMemcpy(dev_b, b, size, cudaMemcpyHostToDevice);dim3 blockSize(16, 16);dim3 gridSize((MATRIX_SIZE + blockSize.x - 1) / blockSize.x, (MATRIX_SIZE + blockSize.y - 1) / blockSize.y);//在GPU上执行矩阵乘法//将结果从设备内存复制回主机内存cudaMemcpy(c, dev_c, size, cudaMemcpyDeviceToHost);//打印结果for (int i = 0; i < MATRIX_SIZE; ++i)for (int j = 0; j < MATRIX_SIZE; ++j)std::cout << c[i * MATRIX_SIZE + j] << " ";}std::cout << std::endl;}//释放内存delete[] a;delete[] b;delete[] c;cudaFree(dev_a);cudaFree(dev_b);cudaFree(dev_c);return 0;```在这个示例中,我们首先在主机上分配了输入矩阵a和b的内存,并初始化为1、然后利用cudaMalloc函数分配了GPU上的内存dev_a、dev_b和dev_c。
1_CUDA_简介

Grid: 一组thread block
以1维、2维或3维组织 共享全局内存
Kernel: 在GPU上执行的 核心程序 One kernel One grid
上海大学计算机学院
CUDA—内存空间
Each thread can:
Read/write per-thread registers Read/write per-thread local memory Read/write per-block shared memory Read/write per-grid global memory Read/only per-grid constant memory
这样的4D矢量运算单元在渲染3D图形时会有很高的效率,但在处理复杂指令 时的效率会大打折扣,比如DX10新引入的几何着色、物理加速等,尤其在面对 非图形渲染指令时优势全无。
上海大学计算机学院
GPU到CUDA
GPU多“核”:SM 真正意义的变革
GeForce 8800
通用计算 重要突破
GeForce 6800
Host
Global Memory Constant Memory
上海大学计算机学院
CUDA处理器术语
SPA
Streaming Processor Array (流处理器阵列, 8 in G80)
TPC
Thread Processing Cluster (线程处理集群,2 SM + Texture, in G80,3SM+Texture,in GTX200)
SP
SP
SP
SP
SP
SP
SP
SP
SP
CUDA架构

简介
NVIDIA CUDA™是一款革命性的并行计算架构。作为一项同时支持硬件和软件的技术,CUDA可用图形处理 器中的多颗计算核心进行通用计算处理工作,计算性能可获得显著提升。它包含了CUDA指令集架构(ISA)以及 GPU内部的并行计算引擎。
开发人员现在可以使用C语言来为CUDA™架构编写程序,C语言是应用最广泛的一种高级编程语言。所编写出 的程序于是就可以在支持CUDA™的处理器上以超高性能运行。将来还会支持其它语言,包括FORTRAN以及C++。计 算行业正在从只使用CPU的“中央处理”向CPU与GPU并用的“协同处理”发展。为打造这一全新的计算典范, NVIDIA;(英伟达™)发明了CUDA并行计算架构,该架构现已应用于GeForce®(精视™)、ION™(翼扬™)、 Quadro以及Tesla GPU(图形处理器)上,对应用程序开发人员来说,这是一个巨大的市场。
在金融市场,Numerix以及CompatibL针对一款全新的对手风险应用程序发布了CUDA支持并取得了18倍速度 提升。Numerix为近400家金融机构所广泛使用。
使用GPU加速通用科学计算_CUDA技术解析

[GPU计算]深入浅出谈CUDA技术_42pp
![[GPU计算]深入浅出谈CUDA技术_42pp](https://img.taocdn.com/s3/m/abe48fc758f5f61fb736660b.png)
当然,使用显示芯片也有它的一些缺点:
1. 2.
显示芯片的运算单元数量很多,因此对于不能高度并行化的工作,所能带来的帮助就不大。 显示芯片目前通常只支持 32 bits 浮点数,且多半不能完全支持 IEEE 754 规格, 有些运算 的精确度可能较低。目前许多显示芯片并没有分开的整数运算单元,因此整数运算的效率较 差。
3.
4.
显示芯片通常不具有分支预测等复杂的流程控制单元, 因此对于具有高度分支的程序, 效率会 比较差。 目前 GPGPU 的程序模型仍不成熟,也还没有公认的标准。例如 NVIDIA 和 AMD/ATI 就 有各自不同的程序模型。
整体来说,显示芯片的性质类似 stream processor,适合一次进行大量相同的工作。CPU 则比较有 弹性,能同时进行变化较多的工作。 CUDA 架构 CUDA 是 NVIDIA 的 GPGPU 模型, 它使用 C 语言为基础, 可以直接以大多数人熟悉的 C 语言, 写出在显示芯片上执行的程序,而不需要去学习特定的显示芯片的指令或是特殊的结构。 在 CUDA 的架构下,一个程序分为两个部份:host 端和 device 端。Host 端是指在 CPU 上执行 的部份,而 device 端则是在显示芯片上执行的部份。Device 端的程序又称为 "kernel(核心)"。 通常 host 端程序会将数据准备好后,复制到显卡的内存中,再由显示芯片执行 device 端程序,完 成后再由 host 端程序将结果从显卡的内存中取回。
• • • • • •
bin -- 工具程序及动态链接库 doc -- 文件 include -- header 檔 lib -- 链接库档案 open64 -- 基于 Open64 的 CUDA compiler src -- 一些原始码 安装程序也会设定一些环境变量,包括:
cuda .c后缀 -回复

cuda .c后缀-回复什么是CUDA?CUDA(Compute Unified Device Architecture)是一种并行计算平台和编程模型,由NVIDIA公司推出。
它提供了一种通过NVIDIA GPU(图形处理器)进行高性能计算的方法。
CUDA允许开发人员利用GPU的大规模并行处理能力来加速各种计算任务,从而在许多领域如科学计算、机器学习、图形渲染和数据分析中获得更好的性能。
CUDA的起源和发展在了解CUDA之前,我们先来看一下GPU的发展历程。
最初,GPU主要用于处理图形渲染任务,因为其并行计算能力可以加速图形渲染的计算。
然而,随着硬件技术的快速发展,GPU的计算能力得到不断提升,使其能够处理更多类型的计算任务。
NVIDIA公司看到了GPU的潜力,并在2006年推出了CUDA技术。
CUDA 通过提供编程模型和工具套件,允许开发人员将GPU用于通用目的的高性能计算。
CUDA不仅简化了GPU编程的复杂性,而且为开发人员提供了灵活性和控制力,从而实现了更高的性能。
CUDA的编程模型CUDA的编程模型基于C/C++编程语言,开发人员可以使用CUDAC/C++语言扩展来描述和控制并行计算任务。
CUDA充分利用了GPU的并行计算能力,可以同时运行成百上千个线程,以处理大量数据。
在CUDA编程模型中,开发人员编写称为“内核函数”的代码,这些函数将在GPU上并行执行。
通过在内核函数中指定执行的线程数量和线程块的组织方式,开发人员可以充分利用GPU的并行计算能力。
从而,可以使用CUDA加速各种计算密集型任务,例如矩阵运算、图像处理、神经网络训练等。
CUDA的工作流程要理解CUDA的工作流程,我们可以将其分为三个基本步骤:数据传输、内核函数调用和结果返回。
首先,开发人员需要将计算任务的数据从主机内存(CPU)传输到GPU 内存。
这可以通过使用CUDA提供的内存管理函数来完成。
接下来,开发人员需要调用内核函数,以在GPU上并行执行计算任务。
基于GPU加速的大规模数据处理技术研究
基于GPU加速的大规模数据处理技术研究近年来,随着大数据应用的逐步普及,大规模数据处理技术已经成为了企业和研究机构巨大的瓶颈。
传统的CPU处理器能够进行的数据处理速度相对较慢,不利于企业实现高效率的数据处理和运营活动。
因此,GPU加速的大规模数据处理技术在近年来的发展已经成为了企业数据处理的一个重要方向。
GPU作为先进的图形处理器,不仅拥有高效的并行计算、高速的内存带宽和低延迟、低功耗等优势,还具有预测和规划任务高效执行的独特优势。
同时,GPU加速技术也可以通过对计算节点优化和极致并行化,实现高速的数据处理能力,进而帮助企业和研究机构更好的进行数据处理。
一、GPU加速计算的原理和特点GPU加速计算是通过CUDA技术实现的,其中GPU内部包含大量的流处理器,通常可以同时执行数千个线程。
与CPU的多线程技术不同的是,GPU利用锁步技术来进行并行计算,每一个线程都可以执行不同的指令,从而实现大规模的高速并行计算。
同时,由于GPU数值表达的在单精度和双精度范围内都是非常高的,因此可以保证计算精度。
通过GPU加速计算,可以有效地提高数据处理的效率和速度,实现同步进行多个任务的处理,提高系统的整体响应速度。
二、GPU加速的大规模数据处理技术的优势和应用场景GPU加速的大规模数据处理技术具有许多优势。
首先,GPU拥有更高的计算效率和处理速度,这可以广泛用于需要进行大规模数据处理和分析的科学研究和商业应用中。
其次,GPU技术可以大大缩短单次任务的处理时间,提高整体计算效率和生产力。
此外,由于GPU并行处理的优势,其可以帮助企业处理大规模图像、视频和文本数据等,使得企业能够快速有效地分析和解决基于大规模数据的问题。
在实际应用方面,GPU加速的大规模数据处理技术可以用于大规模数据挖掘、机器学习、人工智能、网络安全和推荐系统等领域。
例如,Baidu使用GPU加速进行实时的图像处理和语音识别,可视化分析平台Suchakra可以通过GPU进行动态网络可视化,在加强系统性能的同时,提高用户体验。
CUDA(一)GPU计算性能的相关计算公式
CUDA(一)GPU计算性能的相关计算公式1.理论峰值性能理论峰值性能是描述GPU能够达到的最大性能的指标。
它通过计算GPU核心频率(Hz)和每个时钟周期的浮点计算能力(FLOPS)之积来估算。
理论峰值性能公式如下:理论峰值性能=GPU核心数×GPU核心频率×浮点计算能力其中,GPU核心数表示GPU芯片上的并行处理单元数量,GPU核心频率表示GPU的主频,浮点计算能力表示GPU每个时钟周期能够执行的浮点计算操作数。
2.实际性能实际性能是指在特定应用程序下GPU能够达到的实际计算性能。
实际性能通常通过执行特定的基准测试程序或应用程序来测量。
实际性能受到很多因素的影响,包括算法、数据大小、数据访问模式、内存带宽等。
3.可浮动性能可浮动性能是描述在潜在的优化和调优下,GPU能够达到的最佳性能。
可浮动性能通常通过对算法和代码进行优化来提高计算性能。
优化包括减少内存访问、合并计算任务、利用GPU的共享内存等。
4.引用基准引用基准是用来衡量GPU计算性能的标准测试程序。
引用基准提供了一个统一的测试环境和指标,可以用于比较不同型号和品牌的GPU的性能。
常见的GPU计算性能基准测试程序包括:- CUDA SDK自带的基准程序:包括CUFFT(Fast Fourier Transform)、CuBLAS(Basic Linear Algebra Subroutines)、CUDPP (Parallel Primitives Library)等。
- SPECviewperf:基于真实应用程序的基准测试套件,用于评估GPU 在CAD、虚拟现实、计算机辅助设计等领域的性能。
- GPGPU-Sim:一个开放源代码的GPU模拟器,用于评估GPU在各种应用程序中的性能。
总结:GPU计算性能是通过不同的公式和测试方法进行评估的。
理论峰值性能是指GPU能够达到的最大性能,实际性能是在特定应用程序下GPU能够实际达到的性能,可浮动性能是通过优化和调优可以达到的最佳性能。
基于CUDA的并行计算技术研究与应用
基于CUDA的并行计算技术研究与应用在计算机科学领域中,计算速度一直是人们关注的一个重要问题。
CUDA是一种高级的并行计算技术,可用于加速计算机处理速度。
CUDA是NVIDIA公司开发的一种通用并行计算平台和应用程序编程接口,旨在利用GPU的高并发实现高性能计算和加速应用程序。
CUDA的出现,给科学计算提速带来了不可估量的贡献。
1. CUDA的架构CUDA是一种高级的并行计算技术,可以利用GPU的高并发性来实现高性能计算和加速应用程序。
CUDA的架构是一个以数据流为中心的计算平台,并包括以下几个要素:(1)CUDA硬件体系结构——CUDA硬件体系结构是一种先进的、具有高计算效率的并行处理架构,可用于多核心GPU并行计算。
CUDA GPU的核心是由许多小的线程块组成的,每个线程块内部有多个线程;(2)CUDA编程模型——相比较传统的CPU编程模型,CUDA编程模型相对复杂,需要开发人员深入了解GPU的硬件机制并进行适当的编程;(3)CUDA运行时库——CUDA运行时库是一组与GPU、操作系统和硬件相关联的工具和库,用于支持CUDA程序运行。
2. CUDA的应用CUDA具有高效性、可扩展性和灵活性,具有广泛的应用前景,涉及科学计算、图形学、深度学习等领域。
(1)科学计算——科学计算是CUDA最主要的应用领域。
科学计算需要大量计算和数据处理,CUDA采用并行计算技术进行快速处理,提高了计算速度和效率。
CUDA可应用于分子模拟、天文学、医学影像处理等领域,有助于开展更深入的研究工作。
(2)图形学——近年来,图形学的应用越来越广泛,无论是游戏、影视、还是交互式设计等,都需要高性能图形处理。
CUDA通过加速图形处理,使得图形渲染能够实时完成,提高了图形处理速度和精度。
(3)深度学习——深度学习是人工智能领域的一个重要方向,用于处理自然语言处理、计算机视觉、语音识别等方面。
CUDA中包含训练和推断两个核心环节,采用并行计算技术能够快速处理神经网络模型,提高模型的训练效率和精度。
使用超级计算技术进行大规模并行计算的步骤
使用超级计算技术进行大规模并行计算的步骤随着科技的进步和计算需求的不断增加,大规模并行计算成为了解决复杂问题的重要手段。
超级计算技术具备高性能、高并发和高可扩展性的特点,能够处理庞大的数据集和进行复杂计算,广泛应用于科学研究、工程模拟和商业分析等领域。
下面将介绍使用超级计算技术进行大规模并行计算的步骤。
1. 问题定义和分解:首先,需要明确解决的问题是什么,并将问题分解为更小、更简单的子问题。
问题分解是大规模并行计算的关键步骤,可以提高计算的效率和可扩展性。
2. 资源选择和准备:超级计算需要大量的计算资源,包括计算节点、存储和网络设备等。
根据计算需求和预算限制,选择合适的超级计算系统和相关设备,并进行相应的配置和准备工作。
3. 并行计算模型设计:根据问题的特点和计算资源的限制,设计合适的并行计算模型。
常见的并行计算模型包括MPI(Message Passing Interface)和OpenMP (Open Multi-Processing)等。
并行计算模型可以利用多个计算节点同时进行计算,提高计算效率。
4. 数据划分和通信策略:将问题需要的数据划分为适当的大小,并定义节点之间数据通信的策略。
数据划分和通信策略的合理设计可以减少节点之间的数据传输量和通信开销,提高计算效率。
5. 算法优化和调整:根据问题的特点和计算资源的限制,对算法进行优化和调整。
通过减少计算量、降低存储需求和提高计算效率,可以加快计算速度和降低计算成本。
6. 编程和并行化:根据选择的并行计算模型和算法优化方法,进行程序的编程和并行化。
编程需要使用相应的编程语言和开发工具,如C/C++、Python和CUDA等。
并行化则是将程序分解为多个任务,并进行并行计算。
7. 调试和测试:编程和并行化完成后,需要进行调试和测试。
检查程序是否存在错误和性能问题,并进行适当的修复和调整。
调试和测试是确保计算结果的正确性和计算效率的重要环节。
8. 执行和优化:在完成调试和测试后,将程序提交到超级计算系统中进行执行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CUDA——用于大量数据的超级计算 Rob Farber CUDA使您能够在开发GPU上运行的软件时使用熟悉的编程概念。 Rob Farber是西北太平洋国家实验室(Pacific Northwest National Laboratory)的高级科研人员。他在多个国家实验室进行大量数据平行计算的研究,并且是好几个新创企业的创始人之一。可以发邮件到 rob.farber@pnl.gov联系他。
您是否有兴趣在使用高级语言(比如C)编程时,通过标准多核处理器将性能提升几个数量级?您是否也希望拥有跨多个设备的伸缩能力? 很多人(包括我自己)都通过使用NVIDIA的CUDA(Compute Unified Device Architecture,即计算统一设备架构的简称)获得了这种高性能和可伸缩性,以编写廉价的多线程GPU程序。我特别强调“编程”是因为CUDA是为您的工作服务的架构,它不会迫使您的工作适应有限的一组性能库。使用CUDA,您可以发挥才能设计软件以便在多线程硬件上获得最佳性能——并从中获得乐趣,因为计算正确的映射是很有意思的,而且软件开发环境十分合理和直观。
第一部分
本文是这一系列文章的第一篇,介绍了CUDA的功能(通过使用代码)和思维过程,帮助您将应用程序映射到多线程硬件(比如GPU)以获得较大的性能提升。当然,并不是所有问题都可以有效映射到多线程硬件,因此我会介绍哪些可以进行有效映射,哪些不能,而且让您对哪些映射可以运行良好有个常识性的了解。 “CUDA编程”和“GPGPU编程”并不相同(尽管CUDA运行在GPU上)。以前,为GPU编写软件意味着使用GPU语言编程。我的一个朋友曾将这一过程描述为将数据从您的肘部拉到眼前。CUDA允许您使用熟悉的编程概念开发能在GPU上运行的软件。它可以通过将软件直接编译到硬件(例如,GPU汇编语言)避免图形层API的性能开销,这样可以提供更好的性能。 您可以任选一种CUDA设备。图1和图2分别显示了运行在笔记本和台式机的离散GPU上的CUDA 多体模拟(N-body simulation)程序。 2
CUDA真的可以将应用程序性能提高一到两个数量级——或者这只是一种与事实不符的夸张?
CUDA是一种相当新的技术,但是在一些书面作品和Internet中已经有很多实例突出介绍了这种技术在使用当前商用GPU硬件时对性能的极大提升。表1和表2显示了NVIDIA和Beckman Institute网站上相关内容的总结。CUDA的核心是让程序员能够使数千线程保持工作状态。目前这一代NVIDIA GPU能够有效地支持大量线程,因此它们可以将应用程序性能提高一到两个数量级。这些图形处理器的价位有高有低,几乎可供任何人使用。较新的主板将通过提供更大的内存带宽、异步数据传输、原子操作和双精度浮点计算等多项硬件技术改进扩展CUDA的功能。随着技术的不断进步,CUDA软件环境将不断扩展,最终GPU和“多核”处理器之间的区别也会逐渐消失。作为开发人员,我们可以预计,具有成千上万活动线程的应用程序将变得很常见而且CUDA将会运行在多个平台上,包括一般用途的处理器。 3
在20世纪80年代,作为Los Alamos National Laboratory的科学家,我有幸使用了拥有多达65,536个平行处理器的Thinking Machines超级计算机。CUDA被证明是天生用于现代大量平行(即高线程)环境的框架。它的性能优势非常明显。我的一段生产代码,现在用CUDA编写并且运行在NVIDIA GPU上,与2.6-Ghz四核Opteron系统相比,具有明显的线形伸缩和几乎两个数量级的速度提升。
启用CUDA的图形处理器作为宿主计算机内的联合处理器运行。这意味着每个GPU都被认为有其自己的内存和处理元素,它们是与宿主计算机分开的。要进行有效的工作,数据必须在宿主计算机的内存空间和CUDA设备之间传输。因此,性能结果必须包括IO时间才更有意义。同事们喜欢将其称为“诚实的数据”,因为它们会更准确地反映将要交付生产的性能应用程序。
我认为与现有技术相比,一到两个数量级的性能提升是一个巨变,可以在很大程度上改变计算的某些方面。例如,以前需要一年的计算任务现在只要几天就可以完成,几个小时的计算突然变得可交互了,因为使用新技术它们可以在几秒钟内完成,过去不易处理的实时处理任务现在变得极易处理。最后,它为具有正确技能集和能力的顾问和工程师们提供了良好的机会,使他们可以编写高线程(大量平行)软件。那么,对于您来说,这种计算能力又能给您的职业、应用程序或实时处理需求带来哪些好处呢?
开始不需要任何成本,可以轻松地从CUDA Zone 主页(找到Get CUDA)上下载CUDA。之后,按照用于您特定操作系统的安装说明进行操作。甚至不需要图形处理器,因为可以使用软件模拟器在当前笔记本或工作站上运行,可以立即开始工作。当然,通过启用CUDA的GPU运行可以获得更好的性能。或许您的计算机上已经有了一个启用CUDA的GPU。在CUDA Zone 主页上查看支持CUDA的GPU链接(支持CUDA的GPU包括共享的片上内存和线程管理)。 如果购买新的图形处理卡,我建议您阅读本系列文章,因为我将介绍各种硬件特征(比如内存带宽、注册数量、原子操作等等)如何影响应用程序性能,这将有助您选择适合应用程序的硬件。另外,CUDA Zone论坛提供了关于CUDA各个方面的丰富信息,包括购买哪些硬件。
一旦安装,CUDA Toolkit将提供一个合理的C语言程序开发工具集,它包括: • nvcc C编译器 • GPU 的CUDA FFT和BLAS库 • 性能分析器 • alpha 版本(截至2008年3月)的GPU的gdb调试器 • CUDA运行时驱动程序(现在还可以在标准的NVIDIA GPU驱动程序中得到) • CUDA编程手册
nvcc C编译器完成了大部分将C代码转换成将运行在GPU或模拟器上的可执行程序的工作。幸好,汇编语言编程不要求达到很高的性能。今后的文章将介绍从其它高级语言,包括C++、FORTRAN和Python使用CUDA的内容。我假设您熟悉C/C++。不需要有平行编程或CUDA经验。这与现有CUDA文档是一致的。 创建和运行CUDA C语言程序与创建和运行其它C编程环境的工作流是一样的。面向Windows和Linux环境的明确构建和运行说明在CUDA文档中。简言之,这一工作流就是: 1. 使用最喜欢的编辑器创建或编辑CUDA程序。注意:CUDA C 语言程序的后缀为.cu。 2. 使用nvcc编译程序创建可执行程序(NVIDIA提供了带有示例的完整makefiles。通常用于CUDA设备时您只需键入make,用于模拟器时只需键入make emu=1)。 3. 运行可执行程序。
列表1是一个带您入门的简单CUDA程序。它只是一个简单的程序,调用CUDA API将数据移入和移出CUDA设备。并没有添加新内容,以免在学习如何使用工具构建和运行CUDA程序时发生混淆。在下一篇文章中,我将介绍如何开始使用CUDA设备执行一些工作。 5 请尝试使用这些开发工具。对初学者的一些建议:可以使用printf语句看看在模拟器下运行时(使用make emu=1构建可执行程序)GPU上会发生什么。还可以随意试验调试器的alpha版本。
第二部分 在本系列文章的第一部分,我展示了第一个简单的CUDA(Compute Unified Device Architecture,计算统一设备架构)程序——moveArrays.cu,使您熟悉用于构建和执行程序的CUDA工具。对于C程序员而言,这个程序只是调用了CUDA API将数据移入和移出CUDA设备。并没有添加新内容,以免在学习如何使用工具构建和运行CUDA程序时发生混淆。
本文在第一个示例的基础上添加了几行代码,以便在CUDA设备上进行简单的计算——特别是在浮点数组中以1为增量增加每个元素。令人惊喜的是,该示例已经提供了使用CUDA解决很多问题的基本框架(“将数据移动到支持CUDA的设备、进行计算并获取结果”)!
在开始更高级的话题之前,您首先需要了解: • 什么是内核?内核是一个可以从主机调用又可以在CUDA设备上执行的函数——同时由多个线程平行执行。 • 主机如何调用内核?这涉及指定内核名称及执行配置。就本专栏文章而言,执行配置仅指定义在运行CUDA设备内核时组中的平行线程数及要使用的组数。这实际上是个很重要的话题,我们将在以后的栏目中详细介绍。 • 如何同步内核和主机代码。
在列表1的最上面(incrementArrays.cu),我们可以看到主机例程的例子,incrementArrayOnHost 和我们的第一个内核,incrementArraysOnDevice。
主机函数incrementArrayOnHost只是对数组元素数的简单循环,以1为增量增加每个数组元素。此函数用于在此代码末尾进行比较,以验证内核在CUDA设备上进行了正确的计算。
在列表1稍下面的位置是我们的第一个CUDA内核,incrementArrayOnDevice。CUDA提供了几个对C语言的扩展。该函数类型限定符__global__将函数声明为CUDA设备上的可执行内核,只能从主机调用。所有内核必须声明返回类型为void。 内核incrementArrayOnDevice与incrementArrayOnHost进行相同的计算。仔细查看incrementArrayOnDevice会发现里面没有循环!这是因为该函数是由CUDA设备上的一组线程同时执行的。但是,每个线程都具有一个唯一的ID,可以用于计算不同的数组索引或制定控制决策(比如,如果数组索引超过数组大小则不进行任何操作)。这使得incrementArrayOnDevice的计算变得非常简单,如同计算寄存器变量idx中的唯一ID一样,然后使用该变量唯一地引用数组中的每个元素并以1为增量递增。因为线程数可能超过数组大小,因此先将idx与N相比较(N是向内核中传递的一个参数,用于指定数组中的元素数),看一下是否需要进行一些操作。
那么内核是如何调用,执行配置又是如何指定的呢?控制按顺序流过源代码,从main开始到包含列表1中Part 2 of 2语句的注释下面。 // incrementArray.cu #include #include #include void incrementArrayOnHost(float *a, int N) { int i; for (i=0; i < N; i++) a[i] = a[i]+1.f; } __global__ void incrementArrayOnDevice(float *a, int N) {