转自:https://kheresy.wordpress.com/2007/11/05/nvidia-cuda-api%EF%BC%88%E4%B8%8A%EF%BC%89/

Function type qualifiers

用來指定 function 是要在 host 或 device 上執行,以及是用來被 host 或 device 呼叫。他的類別有三種:

  • __device__

    在 device 上執行,且只能被 device 呼叫。 
    同時,他永遠是 inline function。

  • __global__

    將 function 宣告成一個 kernel,在 device 上執行,只能被 host 呼叫。 
    他的 return type 必須要是 void;傳入的參數會是透過 shared memory 給 device,大小不能超過 256byte(這個 Heresy 比較不清楚)。而在乎叫時,必須要指定執行的參數(請參考下面的「Directive to specify how a kernel is executed」)。

  • __host__

    在 host 上執行,且只能被 host 呼叫。(相當於一般的 function)

如果沒有指定的話,自然就是一般的 function,和 __host__ 一樣了。而 __host__ 和 __device__ 可以同時使用,這樣 function 會編譯成同時可以在 device 和 host 執行。

而在 device 上執行的function(__device__ 和 __global__)有一些基本的限制:

  • 不支援遞迴
  • 不能有 static 變數
  • 不能使用 variable number of arguments
Variable type qualifiers

在變數類型方面,是用來指定記憶體的類型。分成三種:

  • __device__

    宣告變數存在 device 上;可以和下面兩者同時使用,來做更進一步的設定。如果沒有額外指定的話,那這個變數會

    • 存在 global memory 空間
    • 生命週期和程式相同
    • 可以被 grid 中的所有 thread 透過 runtime library 存取。
  • __constant__

    可和 __device__ 同時使用,會將變數宣告成:

    • 存在 constant memory 空間
    • 生命週期和程式相同
    • 可以被 grid 中的所有 thread 透過 runtime library 存取。
  • __shared__

    可和 __device__ 同時使用,會將變數宣告成:

    • 存在 thread block 的 shared memory 空間
    • 生命週期和 thread block 相同
    • 只能被 block 中的 thread 存取
Directive to specify how a kernel is executed

指定 kernel 在 device 上執行的設定參數,主要就是指定這份 kernel 要用多大的 block grid(也就是多少個 block)、每個 block 多大(也就是每個 block 有多少 thread)。所以呼叫 __global__ 的地方,都要指定 execution configuration;他的形式式在 function name 和參數之間,加入「<<< Dg, Db, Ns >>>」。

其中,三個值的意義如下:

  • Dg 的型別是 dim3(屬於 common runtime component 的部分,一種簡單的資料結構),用來指定 grid 的維度和大小;Dg.x * Dg.y 就是 grid 中會被執行的 block 數目。
  • Db 的型別是 dim3,用來指定 block 的維度和大小;Db.x * Db.y * Db.z 就是每個 block 中的 thread 數目。
  • Ns 的型別是 size_t,用來指定每個 block 在 shared memory 中動態分配的變數的位元數。這個值可以不用指定,預設值是 0。

如果 function 是宣告成「__global__ void Func(float* parameter);」,那呼叫的方法就是「Func<<< Dg, Db, Ns >>>(parameter);」。而在 device 上總共會被產生的執行序數目,就會是 (Dg.x * Dg.y ) *  ( Db.x * Db.y * Db.z )

Built-in variables

指定 grid 和 block 的維度,以及 block 和 thread 的索引,有下面這些:

  • gridDim 
    資料型別是 dim3,儲存 grid 的維度資料。
  • blockIdx 
    資料型別是 uint3,儲存 grid 中 block 的索引值。
  • blockDim 
    資料型別是 dim3,儲存 block 的維度資料。
  • threadIdx 
    資料型別是 uint3,儲存 block 中 thread 的索引值。

而這些變數都是唯獨的,不能去修改他們的值;此外,也不能去用他們的位址。而他們主要的用處,是讓 device 上的程式,可以知道自己是哪一個 block 的 哪一個 thread,進而知道自己在陣列或 texture 中該取的值;某種程度上,就相當於迴圈中不斷累加、用來計數的 index。

Extension 的部分大概就是上面這些了~而 runtime library 的部分,請參考《nVidia CUDA API(下)》。

device host global 函数要求的更多相关文章

  1. 二维数组的传输 (host <-> device)

    前言 本文的目的很明确:介绍如何将二维数组传递进显存,以及如何将二维数组从显存传递回主机端. 实现步骤 1. 在显存中为二维数组开辟空间 2. 获取该二维数组在显存中的 pitch 值 (cudaMa ...

  2. python第十三天,函数的嵌套定义,global,nonlocal关键字的使用,闭包及闭包的运算场景,装饰器

    今日内容 1. 函数的嵌套定义 2.global,nonlocal关键字 3.闭包及闭包的运用场景 4.装饰器 函数的嵌套定义 1. 概念:在一个函数内部定义另一个函数 2 .为什么要有函数的嵌套定义 ...

  3. 第六篇:二维数组的传输 (host <-> device)

    前言 本文的目的很明确:介绍如何将二维数组传递进显存,以及如何将二维数组从显存传递回主机端. 实现步骤 1. 在显存中为二维数组开辟空间 2. 获取该二维数组在显存中的 pitch 值 (cudaMa ...

  4. Linux usb 4. Device 详解

    文章目录 1. 简介 2. Platform Layer 2.1 Platform Device 2.2 Platform Driver 3. UDC/Gadget Layer 3.1 Gadget ...

  5. Device Tree(三):代码分析【转】

    转自:http://www.wowotech.net/linux_kenrel/dt-code-analysis.html Device Tree(三):代码分析 作者:linuxer 发布于:201 ...

  6. Device Tree(三):代码分析

    一.前言 Device Tree总共有三篇,分别是: 1.为何要引入Device Tree,这个机制是用来解决什么问题的?(请参考引入Device Tree的原因) 2.Device Tree的基础概 ...

  7. 【转】Device Tree(三):代码分析

    原文网址:http://www.wowotech.net/linux_kenrel/dt-code-analysis.html 一.前言 Device Tree总共有三篇,分别是: 1.为何要引入De ...

  8. flashcache中应用device mapper机制

    Device Mapper(DM)是Linux 2.6全面引入的块设备新构架,通过DM可以灵活地管理系统中所有的真实或虚拟的块设备. DM以块设备的形式注册到Linux内核中,凡是挂载(或者说“映射” ...

  9. ibv_get_device_guid()函数

    uint64_t ibv_get_device_guid(struct ibv_device *device); 描述 函数返回RDMA 设备的 GUID(The Global Unique IDen ...

随机推荐

  1. 【bzoj1596】[Usaco2008 Jan]电话网络

    题目描述 Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无线电通讯塔,来 ...

  2. 【PHP面向对象(OOP)编程入门教程】5.如何实例化对象?

    我们上面说过面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,既然我们类会声明了,下一步就是实例化对象了. 当定义好类后,我们使用new关键字来生成一个对象. $对象名称 = new 类名称 ...

  3. ini文件操作

    Config.ini 文件操作 [SYS] sysname=hy company=hyhy tel=2 using System; using System.Collections.Generic; ...

  4. 类加载器ClassLoader之jar包隔离

    小引子 最近做了一个根据同一模块的不同jar版本做同时测试的工具,感觉挺有意思,特此记录. 类加载器(ClassLoader)是啥? 把类加载阶段中的"通过一个类的全限定名(博主注:绝对路径 ...

  5. jQuery的常用函数扩展

    (function ($) { /**************************获得URL的参数************************************/ //参数:URL中的参 ...

  6. ExtJs xtype类型介绍

    自定义组件在定义的时候可以通过xtype配置为组件指定xtype短名称,此后创建对象可以通过xtype来创建自定义对象了,示例代码如下: Ext.define('MyApp.PressMeButton ...

  7. [转载]MySQL5.5 配置文件 my.ini 1067错误

    原文链接:http://blog.csdn.net/xiaochunyong/article/details/7438200 解压mysql-5.5.22-win32.zip后的目录中有5个my-xx ...

  8. 5.3(2)----机器人走方格2(CC150)

    这道题只需要把障碍点都设为0就可以了. public static int countWays(int[][] map,int x, int y){ if( x < 0 || y < 0) ...

  9. php内核和瓦力上线部署

    http://www.php-internals.com/ http://www.walle-web.io/

  10. JavaScript Window对象

    1.Window对象的location属性引用的是Location对象,它表示该窗口中当前显示的文档的URL,并定义了方法来使窗口载入新的文档.Location对象的href属性是一个字符串,后者包含 ...