`
暴风雪
  • 浏览: 390790 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

CUDA基础知识

    博客分类:
  • cuda
 
阅读更多

转载自 http://blog.csdn.net/yanghangjun/article/details/5586883

CUDA编码

对于函数部分前缀

1.  __device__

使用 _device_ 限定符声明的函数具有以下特征:

n         在设备上执行;

n         仅可通过设备调用。

2. __global__

使用 _global_ 限定符可将函数声明为内核。此类函数:

n         在设备上执行;

n         仅可通过主机调用。

3. __host__

使用 _host_ 限定符声明的函数具有以下特征:

n         在主机上执行;

n         仅可通过主机调用。

仅使用 _host_ 限定符声明函数等同于不使用 _host__device_  _global_ 限定符声明函数,这两种情况下,函数都将仅为主机进行编译。

函数前缀的一些限制:

_device_  _global_ 函数不支持递归。

_device_  _global_ 函数的函数体内无法声明静态变量。

_device_  _global_ 函数不得有数量可变的参数。

_device_ 函数的地址无法获取,但支持 _global_ 函数的函数指针。

_global_  _host_ 限定符无法一起使用。

_global_ 函数的返回类型必须为空。

 _global_ 函数的任何调用都必须按规定指定其执行配置。

_global_ 函数的调用是异步的,也就是说它会在设备执行完成之前返回。

_global_ 函数参数将同时通过共享存储器传递给设备,且限制为 256 字节。

对于变量前缀:

1.__device__

_device_ 限定符声明位于设备上的变量。

在接下来的三节中介绍的其他类型限定符中,最多只能有一种可与 _device_ 限定符一起使用,以更具体地指定变量属于哪个存储器空间。如果未出现其他任何限定符,则变量具有以下特征:

n         位于全局存储器空间中;

n         与应用程序具有相同的生命周期;

可通过网格内的所有线程访问,也可通过运行时库从主机访问。

2.__constant__

_constant_ 限定符可选择与 _device_ 限定符一起使用,所声明的变量具有以下特征:

n         位于固定存储器空间中;

n         与应用程序具有相同的生命周期;

可通过网格内的所有线程访问,也可通过运行时库从主机访问。

3.__shared__

_shared_ 限定符可选择与 _device_ 限定符一起使用,所声明的变量具有以下特征:

n         位于线程块的共享存储器空间中;

n         与块具有相同的生命周期;

n         尽可通过块内的所有线程访问。

只有在 _syncthreads()_(参见第 4.4.2 节)的执行写入之后,才能保证共享变量对其他线程可见。除非变量被声明为瞬时变量,否则只要之前的语句完成,编译器即可随意优化共享存储器的读写操作。

限制:

不允许为在主机上执行的函数内的 struct  union 成员、形参和局部变量使用这些限定符。

_shared_  _constant_ 变量具有隐含的静态存储。

_device__shared_  _constant_ 变量无法使用 extern 关键字定义为外部变量。

_device_  _constant_ 变量仅允许在文件作用域内使用。

不可为设备或从设备指派 _constant_ 变量,仅可通过主机运行时函数从主机指派(参见第 4.5.2.3 节和第 4.5.3.6 节)。

_shared_ 变量的声明中不可包含初始化。

 

下面是具体的一个应用:

将共享存储器中的变量声明为外部数组时,例如:

extern __shared__ float shared[];

数组的大小将在启动时确定(参见第 4.2.3 节)。所有变量均以这种形式声明,在存储器中的同一地址开始,因此数组中的变量布局必须通过偏移显式管理。例如,如果一名用户希望在动态分配的共享存储器内获得与以下代码对应的内容:

short array0[128];

float array1[64];

int array2[256];

则应通过以下方法声明和初始化数组:

extern __shared__ char array[];

__device__ void func() // __device__ or __global__ function

{

    short* array0 = (short*)array;

     float* array1 = (float*)&array0[128];

     int* array2 = (int*)&array1[64];

}

 

在设备代码中声明、不带任何限定符的自动变量通常位于寄存器中。但在某些情况下,编译器可能选择将其置于本地存储器中。

只要编译器能够确定在设备上执行的代码中的指针指向的是共享存储器空间还是全局存储器空间,此类指针即受支持,否则将仅限于指向在全局存储器空间中分配或声明的存储器。

通过获取 _device__shared_  _constant_ 变量的地址而获得的地址仅可在设备代码中使用。通过cudaGetSymbolAddress()获取的 _device_  _constant_ 变量的地址仅可在主机代码中使用。

 

global函数进行配置

 _global_ 函数的任何调用都必须指定该调用的执行配置。

执行配置定义将用于在该设备上执行函数的网格和块的维度,以及相关的流。可通过在函数名称和括号参数列表之间插入 <<<Dg, Db, Ns, s>>> 形式的表达式来指定,其中:

Dg 的类型为 dim3,指定网格的维度和大小,Dg.x * Dg.y 等于所启动的块数量,Dg.z 无用;

Db 的类型为 dim3,指定各块的维度和大小,Db.x * Db.y * Db.z 等于各块的线程数量;

Ns 的类型为 size_t,指定各块为此调用动态分配的共享存储器(除静态分配的存储器之外),这些动态分配的存储器可供声明为外部数组的其他任何变量使用,Ns 是一个可选参数,默认值为 0

的类型为 cudaStream_t,指定相关流;是一个可选参数,默认值为 0

举例来说,一个函数的声明如下:

__global__ void Func(float* parameter);

必须通过如下方法来调用此函数:

Func<<< Dg, Db, Ns >>>(parameter);

执行配置的参数将在实际函数参数之前被评估,与函数参数相同,通过共享存储器同时传递给设备。

如果 Dg  Db 大于设备允许的最大大小,或 Ns 大于设备上可用的共享存储器最大值,或者小于静态分配、函数参数和执行配置所需的共享存储器数量,则函数将失败。

分享到:
评论

相关推荐

    CUDA基础知识介绍

    ### CUDA基础知识介绍 CUDA,全称为Compute Unified Device Architecture(统一计算设备架构),是NVIDIA推出的一种并行计算平台和编程模型。它使开发者能够在NVIDIA的GPU上编写高性能的并行代码,从而极大地提升了...

    cuda by example中文版

    1. **CUDA基础知识**:CUDA的核心是C++语言的扩展,允许程序员直接对GPU进行编程。书中首先会介绍CUDA编程环境的搭建,包括CUDA SDK的安装、CUDA编译器nvcc的使用以及CUDA运行时库的了解。 2. **CUDA编程模型**:...

    cuda 解码例子程序

    1. **CUDA基础知识**:CUDA的核心概念包括设备(Device)、上下文(Context)、内存类型(如全局内存、共享内存、常量内存、纹理内存)、流(Stream)和核函数(Kernel)。开发者需要理解这些基本概念,才能有效地...

    cuda-3d:用于3d点云操作,特征工程和基本算法的CUDA基础知识和本机CUDA实现

    CUDA基础教程 用于3D点云操作,功能工程和基本算法的本机CUDA实现 结构体 ├── operators │ └── README.md ├── README.md └── tutorials ├── hello_world │ ├── coordinating_parallel.cu ...

    风辰的CUDA入门教程

    ### CUDA基础知识详解 #### 第一章、CUDA的基本内容 ##### 第一节、CUDA及GPU简介 **GPU**,即**图形处理单元**(Graphic Processing Unit),最初设计用于图形渲染任务。然而,随着技术的进步,尤其是自九十年代起...

    cuda课件邓仰东老师版

    1. **CUDA基础知识**:CUDA提供了C++编程接口,允许开发者利用GPU的强大计算能力进行数据处理。课程可能涵盖了CUDA的基本架构,包括多核GPU的设计、流处理器(CUDA Cores)的工作原理、内存层次(全局内存、共享内存...

    《GPU高性能运算之CUDA》-张舒-源代码

    1. **CUDA基础知识**:介绍CUDA编程环境的搭建,包括CUDA SDK的安装,CUDA开发工具如nvcc编译器的使用,以及CUDA运行时库和驱动程序API的基本概念。 2. **GPU架构**:详细解析GPU的多核并行架构,包括流处理器...

    CUDA Programming A Developer's Guide to Parallel Computing with GPUs

    1. **CUDA基础知识**:首先,书中会介绍CUDA的基本概念,如CUDA架构、GPU的多核心特性、内存层次结构(全局内存、共享内存、常量内存和纹理内存)以及CUDA线程组织(线程块和网格)。 2. **CUDA编程环境**:设置...

    cuda-使用CUDA+Python实现的小波变换算法.zip

    1. CUDA基础知识: CUDA为开发者提供了一套C/C++编程接口,使得程序员可以编写能够直接运行在GPU上的程序。CUDA程序主要由两个部分组成:主机代码(Host Code)和设备代码(Device Code)。主机代码通常运行在CPU上...

    cuda 硬解码 decode vs2019

    1. CUDA基础知识:CUDA是NVIDIA开发的一种并行计算平台和编程模型,它允许开发者使用C/C++等高级语言直接编程,利用GPU的强大计算能力处理复杂的科学计算、图形渲染和视频编码/解码等任务。 2. 硬解码与软解码:软...

    主机端多线程cuda调用

    1. **CUDA基础知识**: - **CUDA架构**:CUDA架构由GPU和CPU两部分组成,CPU作为主机负责管理和调度任务,GPU作为设备执行计算密集型任务。 - **CUDA核心**:GPU内部包含大量CUDA核心,这些核心可以并行执行相同或...

    CUDA基础学习资料(含CUDA api中文版)

    总的来说,这个CUDA基础学习资料包为GPU编程初学者提供了一个全面的学习路径,从理论基础到实践应用,再到高级技术,覆盖了CUDA开发的各个方面。通过系统学习和实践,开发者可以充分利用GPU的并行计算能力,提升应用...

    CUDA C编程基础知识

    本人自己整理的cuda c编程的文档,富含一些基础知识,适合那些刚刚入门的初学者学习,是一个比较全的基础知识文档。

    CUDA入门经典

    总之,《CUDA入门经典》不仅是一本介绍CUDA基础知识的教程,更是一部涵盖了CUDA编程模型、API使用、性能优化和实际应用案例的综合性指南。对于希望利用GPU加速计算任务的开发者而言,掌握CUDA的原理和技术是不可或缺...

    cuda基础入门,轻松入门cuda

    ### CUDA基础入门详解 #### CUDA概述 CUDA(Compute Unified Device Architecture),是由NVIDIA推出的一种用于在GPU上进行高性能计算的并行计算平台和技术。通过CUDA,开发者能够利用GPU的强大并行处理能力来加速...

    cuda 编程指南 3.0

    在CUDA编程中,有几个核心概念和关键知识点: 1. **CUDA架构**:CUDA架构是由GPU和CPU组成的系统,其中GPU负责并行计算,CPU则负责控制和协调任务。CUDA架构的核心是流式多处理器(SM, Streaming Multiprocessors)...

    cuda安装与使用 cuda博客 cuda入门资料

    最后,作为CUDA的入门资料,这个压缩包中的博客和文档应该包含了CUDA编程的基础知识、实例演示以及常见问题解答,对于初学者来说是非常有价值的资源。通过学习这些内容,你将能够逐步掌握CUDA编程的基本技巧,进而...

    CUDA 基础篇

    本文档为台湾大学的一份CUDA基础课件,内容涵盖了CUDA的架构、编程模型,并通过实例代码帮助初学者快速入门。接下来,我们将详细探讨CUDA的几个关键知识点。 **为什么需要并行处理?** 在过去的二十年里,微处理器...

    cuda入门教程

    该教程涵盖了 CUDA 的基本概念、编程模型、存储器层次结构、主机和设备、软件栈、计算能力等方面的知识点。 CUDA 简介 CUDA(Compute Unified Device Architecture)是一种可伸缩的并行编程模型,由 NVIDIA 公司...

Global site tag (gtag.js) - Google Analytics