30.04.2014 Views

编程指南 - NVIDIA

编程指南 - NVIDIA

编程指南 - NVIDIA

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

程 指<br />

<strong>NVIDIA</strong> CUDA<br />

统 一 计 算 设 备 架 构<br />

编 程 指 南<br />

Version 1.1<br />

11/29/2007<br />

CUDA 编<br />

1.1 I<br />

南 Version


程 指<br />

II<br />

CUDA 编<br />

1.1<br />

南 Version


目<br />

录<br />

2 第<br />

3 第<br />

第 4<br />

1.1 作 章<br />

为 数 据 并 行 计 算 设 备 的 图 形 处 理 简<br />

置 向 量 类<br />

备 运 行 时 组 学 函 指 程<br />

1<br />

.................................................................................................... 1 器<br />

CUDA: 1.2 GPU .......................................................................................................... 3<br />

1.3 ................................................................................................................................................... 6<br />

............................................................................................................................................................ 7<br />

文 档 结 构 章 编 程 模 型 一 种 计 算 的 新 架 构<br />

理 处 协 程 线 多 度<br />

2.1 高<br />

2.2 线<br />

2.3<br />

章 内<br />

3.1 具<br />

3.2 执<br />

3.3 计<br />

3.4 多<br />

3.5<br />

章 显<br />

2.2.1 线<br />

2.2.2 线<br />

................................................................................................................................................... 批 程 块 网 程<br />

SIMD<br />

分 现 硬 件 实 有 片 上 共 享 内 存 的 一 组 多 处 理 存 模 行<br />

4.1 C 编<br />

4.2 语<br />

4.3 共<br />

4.4 设<br />

4.2.1 函<br />

4.2.2 变<br />

4.2.3 执<br />

4.2.4 内<br />

............................................................................................................................... 7 器<br />

7<br />

.............................................................................................................................................. 块<br />

7<br />

...................................................................................................................................... 8 格<br />

................................................................................................................................................. 10 型<br />

........................................................................................................................................................ 13 现<br />

.......................................................................................... 13 器<br />

................................................................................................................................................. 14<br />

................................................................................................................................................. 能 力 算 型<br />

15<br />

................................................................................................................................................. 备 设 个<br />

16<br />

模 式 切 示<br />

口 应 用 编 接 程 语 言 扩 言 扩 量 类 型 限 定 行 配 数<br />

变 置<br />

4.2.5 NVCC<br />

.....................................................................................................................................<br />

编 用 运 行 时 组 件 用 使<br />

4.3.1 内<br />

4.3.2 数<br />

4.3.3 时<br />

4.3.4 纹<br />

4.4.1 数<br />

......................................................................................................................................... 16 换<br />

................................................................................................................................................ 17 口<br />

...................................................................................................................................... 17 展<br />

................................................................................................................................................. 17<br />

............................................................................................................................ 符 展<br />

18<br />

............................................................................................................................ 19 符<br />

........................................................................................................................................ 21 置<br />

........................................................................................................................................ 21 量<br />

........................................................................................................................... 22 译<br />

23<br />

................................................................................................................................ 23 型<br />

24<br />

24<br />

24<br />

..................................................................................................................................... 26 件<br />

........................................................................................................................................ 26 数<br />

第 1<br />

CUDA<br />

介 简 介 ......................................................................................................................................................<br />

CUDA 编<br />

1.1 III<br />

南 Version<br />

........................................................................................................................................ 数 函 学<br />

........................................................................................................................................ 数 函 间<br />

........................................................................................................................................ 型 类 理


程 指<br />

第 5<br />

附<br />

4.5 宿<br />

5.1 指 章<br />

5.2 每<br />

5.3 宿<br />

5.4 纹<br />

5.5<br />

章 整<br />

6.1 概<br />

6.2 源<br />

6.3 源<br />

4.4.2 同<br />

4.4.3 类<br />

4.4.4 类<br />

4.4.5 纹<br />

4.4.6 原<br />

4.5.1 常<br />

4.5.2 运<br />

4.5.3<br />

........................................................................................................................................................ 性 能 指 南 驱<br />

5.1.1 指<br />

26<br />

................................................................................................................................ 换 函 数 转 型<br />

强 制 函 理 子 函 型<br />

运 行 时 组 用 概 行 主<br />

程 动<br />

26<br />

................................................................................................................................ 27 数<br />

........................................................................................................................................ 27<br />

........................................................................................................................................ 数 28<br />

....................................................................................................................................... 28 件<br />

........................................................................................................................................ 29 念<br />

API ..................................................................................................................................... 32 时<br />

API ................................................................................................................................. 39 序<br />

47<br />

................................................................................................................................................. 能 性 令<br />

47<br />

吞 吐 令<br />

.................................................................................................................................... 47 量<br />

5.1.2 ........................................................................................................................................ 49<br />

......................................................................................................................................... 块 的 线 程 数 宽 带 存 内<br />

62<br />

................................................................................................................. 设 备 之 间 的 数 据 传 送 和 主<br />

63<br />

拾 取 与 全 局 或 常 量 内 存 读 理<br />

......................................................................................................... 63 取<br />

................................................................................................................................. 64 优 化 策 略 例 矩 阵 乘 法 示 能 性 体<br />

................................................................................................................................................ 67 例<br />

67<br />

69<br />

................................................................................................................................................. 71 略<br />

6.3.1 Mul() ............................................................................................................................................ 71<br />

6.3.2 Muld() .......................................................................................................................................... 71<br />

........................................................................................................................................ 数 函 步<br />

第 6<br />

A 录<br />

A.1 通<br />

浮 录 附 数 数 学 函 A.2<br />

B 录 B.1 共<br />

设<br />

C 录<br />

C.1 算<br />

攻<br />

73<br />

码<br />

规 用<br />

................................................................................................................................................ 74<br />

点 标 范<br />

................................................................................................................................................ 74 准<br />

........................................................................................................................................................ 77<br />

..................................................................................................................................... 运 行 时 组 件 用 数<br />

77<br />

..................................................................................................................................... 80 件<br />

83<br />

行 时 组 术 函 运 备<br />

................................................................................................................................................. 83 数<br />

C.1.1 atomicAdd() ............................................................................................................................... 83<br />

C.1.2 atomicSub() ............................................................................................................................... 83<br />

C.1.3 atomicExch() ............................................................................................................................. 83<br />

述 .........................................................................................................................................................<br />

................................................................................................................................................. 单 清 码<br />

IV<br />

CUDA 编<br />

1.1<br />

格 技 术 规 格 ........................................................................................................................................................<br />

B.2 录 附 数 原 子 函 数 ........................................................................................................................................................<br />

南 Version


程 指<br />

C.1.4 atomicMin() ............................................................................................................................... 84<br />

C.1.5 atomicMax() ............................................................................................................................... 84<br />

C.1.6 atomicInc() ............................................................................................................................... 84<br />

C.1.7 atomicDec() ............................................................................................................................... 84<br />

C.1.8 atomicCAS() ............................................................................................................................... 84<br />

录 附 C.2 位<br />

D 录<br />

D.1 设<br />

..................................................................................................................................................... 85 数 函<br />

C.2.1 atomicAnd() ............................................................................................................................... 85<br />

C.2.2 atomicOr() .................................................................................................................................. 85<br />

C.2.3 atomicXor() ............................................................................................................................... 85<br />

API 运 行 时 考 参 备 管 参<br />

........................................................................................................................................... 87 考<br />

.................................................................................................................................................. 87 理<br />

D.1.1 cudaGetDeviceCount() .......................................................................................................... 87<br />

D.1.2 cudaSetDevice() ...................................................................................................................... 87<br />

D.1.3 cudaGetDevice() ...................................................................................................................... 87<br />

D.1.4 cudaGetDeviceProperties() .............................................................................................. 88<br />

D.1.5 cudaChooseDevice() .............................................................................................................. 89<br />

D.2 线<br />

.................................................................................................................................................. 89 理<br />

D.2.1 cudaThreadSynchronize() .................................................................................................. 89<br />

D.2.2 cudaThreadExit() ................................................................................................................... 89<br />

D.3 流<br />

管 程<br />

管<br />

...................................................................................................................................................... 89 理<br />

D.3.1 cudaStreamCreate() .............................................................................................................. 89<br />

D.3.2 cudaStreamQuery() ................................................................................................................. 89<br />

D.3.3 cudaStreamSynchronize() .................................................................................................. 89<br />

D.3.4 cudaStreamDestroy() ............................................................................................................ 89<br />

D.4 事<br />

.................................................................................................................................................. 90 理 管 件<br />

D.4.1 cudaEventCreate() ................................................................................................................. 90<br />

D.4.2 cudaEventRecord() ................................................................................................................. 90<br />

D.4.3 cudaEventQuery() ................................................................................................................... 90<br />

D.4.4 cudaEventSynchronize() ..................................................................................................... 90<br />

D.4.5 cudaEventDestroy() .............................................................................................................. 90<br />

D.4.6 cudaEventElapsedTime() ..................................................................................................... 90<br />

D.5 内<br />

.................................................................................................................................................. 91 理 管 存<br />

D.5.1 cudaMalloc() ............................................................................................................................. 91<br />

D.5.2 cudaMallocPitch() ................................................................................................................. 91<br />

CUDA 编<br />

1.1 V<br />

南 Version


程 指<br />

D.5.3 cudaFree() ................................................................................................................................. 91<br />

D.5.4 cudaMallocArray() ................................................................................................................. 92<br />

D.5.5 cudaFreeArray() ...................................................................................................................... 92<br />

D.5.6 cudaMallocHost() ................................................................................................................... 92<br />

D.5.7 cudaFreeHost() ........................................................................................................................ 92<br />

D.5.8 cudaMemset() ............................................................................................................................. 92<br />

D.5.9 cudaMemset2D() ........................................................................................................................ 92<br />

D.5.10 cudaMemcpy() ............................................................................................................................. 93<br />

D.5.11 cudaMemcpy2D() ........................................................................................................................ 93<br />

D.5.12 cudaMemcpyToArray() ............................................................................................................ 94<br />

D.5.13 cudaMemcpy2DToArray() ....................................................................................................... 94<br />

D.5.14 cudaMemcpyFromArray() ....................................................................................................... 95<br />

D.5.15 cudaMemcpy2DFromArray() .................................................................................................. 95<br />

D.5.16 cudaMemcpyArrayToArray() ................................................................................................ 96<br />

D.5.17 cudaMemcpy2DArrayToArray() ........................................................................................... 96<br />

D.5.18 cudaMemcpyToSymbol() .......................................................................................................... 96<br />

D.5.19 cudaMemcpyFromSymbol() ..................................................................................................... 96<br />

D.5.20 cudaGetSymbolAddress() ..................................................................................................... 97<br />

D.5.21 cudaGetSymbolSize() ............................................................................................................ 97<br />

D.6 纹<br />

D.7 执<br />

D.6.1 低<br />

.......................................................................................................................................... 97 管 理 考 参 理<br />

D.6.2<br />

行 控 高<br />

API .......................................................................................................................................... 97 层<br />

API .......................................................................................................................................... 98 层<br />

................................................................................................................................................ 100 制<br />

D.7.1 cudaConfigureCall() .......................................................................................................... 100<br />

D.7.2 cudaLaunch() ........................................................................................................................... 100<br />

D.7.3 cudaSetupArgument() .......................................................................................................... 100<br />

D.8 OpenGL ................................................................................................................................. 100 性 作 操 互<br />

D.8.1 cudaGLRegisterBufferObject()..................................................................................... 100<br />

D.8.2 cudaGLMapBufferObject() ................................................................................................ 101<br />

D.8.3 cudaGLUnmapBufferObject() ............................................................................................ 101<br />

D.8.4 cudaGLUnregisterBufferObject() ................................................................................ 101<br />

D.9 Direct3D ................................................................................................................................. 101 性 作 操 互<br />

D.9.1 cudaD3D9Begin() .................................................................................................................... 101<br />

D.9.2 cudaD3D9End() ........................................................................................................................ 101<br />

VI<br />

CUDA 编<br />

1.1<br />

南 Version


程 指<br />

D.10 错<br />

D.9.3 cudaD3D9RegisterVertexBuffer() ................................................................................ 101<br />

D.9.4 cudaD3D9MapVertexBuffer() ............................................................................................ 101<br />

D.9.5 cudaD3D9UnmapVertexBuffer() ....................................................................................... 102<br />

D.9.6 cudaD3D9UnregisterVertexBuffer() ........................................................................... 102<br />

D.9.7 cudaD3D9GetDevice() .......................................................................................................... 102<br />

处 误<br />

................................................................................................................................................ 102 理<br />

D.10.1 cudaGetLastError() ............................................................................................................ 102<br />

D.10.2 cudaGetErrorString() ........................................................................................................ 102<br />

E 录<br />

录 附 E.1 初<br />

参<br />

...................................................................................................................................... 103 考<br />

..................................................................................................................................................... 103 化<br />

E.1.1 cuInit() ..................................................................................................................................... 103<br />

E.2 设<br />

备 管 始<br />

................................................................................................................................................. 103 理<br />

E.2.1 cuDeviceGetCount() ............................................................................................................. 103<br />

E.2.2 cuDeviceGet() ......................................................................................................................... 103<br />

E.2.3 cuDeviceGetName() ............................................................................................................... 103<br />

考 参 E.2.4 cuDeviceTotalMem() ............................................................................................................. 104<br />

E.2.5 cuDeviceComputeCapability() ....................................................................................... 104<br />

E.2.6 cuDeviceGetAttribute() ................................................................................................... 104<br />

E.2.7 cuDeviceGetProperties() ................................................................................................. 105<br />

序 驱 动 程 序 API<br />

E.3 上<br />

E.4 模<br />

............................................................................................................................................. 106 理 管 文 下<br />

E.3.1 cuCtxCreate() ......................................................................................................................... 106<br />

E.3.2 cuCtxAttach() ......................................................................................................................... 106<br />

E.3.3 cuCtxDetach() ......................................................................................................................... 106<br />

E.3.4 cuCtxGetDevice() .................................................................................................................. 106<br />

E.3.5 cuCtxSynchronize() ............................................................................................................. 106<br />

管 块<br />

................................................................................................................................................. 106 理<br />

E.4.1 cuModuleLoad() ...................................................................................................................... 106<br />

E.4.2 cuModuleLoadData() ............................................................................................................. 107<br />

E.4.3 cuModuleLoadFatBinary() ................................................................................................. 107<br />

E.4.4 cuModuleUnload() .................................................................................................................. 107<br />

E.4.5 cuModuleGetFunction() ...................................................................................................... 107<br />

E.4.6 cuModuleGetGlobal() .......................................................................................................... 107<br />

E.4.7 cuModuleGetTexRef() .......................................................................................................... 108<br />

管<br />

CUDA 编<br />

1.1 VII<br />

E.5 流<br />

..................................................................................................................................................... 108 理<br />

南 Version


程 指<br />

E.5.1 cuStreamCreate() .................................................................................................................. 108<br />

E.5.2 cuStreamQuery() .................................................................................................................... 108<br />

E.5.3 cuStreamSynchronize() ...................................................................................................... 108<br />

E.5.4 cuStreamDestroy() ............................................................................................................... 108<br />

E.6 事<br />

................................................................................................................................................. 108 理 管 件<br />

E.6.1 cuEventCreate() .................................................................................................................... 108<br />

E.6.2 cuEventRecord() .................................................................................................................... 108<br />

E.6.3 cuEventQuery() ...................................................................................................................... 109<br />

E.6.4 cuEventSynchronize() ........................................................................................................ 109<br />

E.6.5 cuEventDestroy() .................................................................................................................. 109<br />

E.6.6 cuEventElapsedTime() ........................................................................................................ 109<br />

E.7 执<br />

............................................................................................................................................... 109 制 控 行<br />

E.7.1 cuFuncSetBlockShape() .................................................................................................... 109<br />

E.7.2 cuFuncSetSharedSize() ...................................................................................................... 110<br />

E.7.3 cuParamSetSize() .................................................................................................................. 110<br />

E.7.4 cuParamSeti() ......................................................................................................................... 110<br />

E.7.5 cuParamSetf() ......................................................................................................................... 110<br />

E.7.6 cuParamSetv() ......................................................................................................................... 110<br />

E.7.7 cuParamSetTexRef() ............................................................................................................. 110<br />

E.7.8 cuLaunch() ................................................................................................................................ 110<br />

E.7.9 cuLaunchGrid() ...................................................................................................................... 111<br />

E.8 内<br />

................................................................................................................................................. 111 理 管 存<br />

E.8.1 cuMemGetInfo() ...................................................................................................................... 111<br />

E.8.2 cuMemAlloc() ........................................................................................................................... 111<br />

E.8.3 cuMemAllocPitch() ............................................................................................................... 111<br />

E.8.4 cuMemFree().............................................................................................................................. 112<br />

E.8.5 cuMemAllocHost() .................................................................................................................. 112<br />

E.8.6 cuMemFreeHost() .................................................................................................................... 112<br />

E.8.7 cuMemGetAddressRange() ................................................................................................... 112<br />

E.8.8 cuArrayCreate() .................................................................................................................... 113<br />

E.8.9 cuArrayGetDescriptor() ................................................................................................... 114<br />

E.8.10 cuArrayDestroy() .................................................................................................................. 114<br />

E.8.11 cuMemset() ................................................................................................................................ 114<br />

E.8.12 cuMemset2D() ........................................................................................................................... 114<br />

VIII<br />

CUDA 编<br />

1.1<br />

南 Version


程 指<br />

E.8.13 cuMemcpyHtoD() ...................................................................................................................... 115<br />

E.8.14 cuMemcpyDtoH() ...................................................................................................................... 115<br />

E.8.15 cuMemcpyDtoD() ...................................................................................................................... 115<br />

E.8.16 cuMemcpyDtoA() ...................................................................................................................... 116<br />

E.8.17 cuMemcpyAtoD() ......................................................................................................................... 116<br />

E.8.18 cuMemcpyAtoH() ...................................................................................................................... 116<br />

E.8.19 cuMemcpyHtoA() ...................................................................................................................... 116<br />

E.8.20 cuMemcpyAtoA() ...................................................................................................................... 117<br />

E.8.21 cuMemcpy2D() ........................................................................................................................... 117<br />

E.9 纹<br />

......................................................................................................................................... 119 管 理 考 参 理<br />

E.9.1 cuTexRefCreate() .................................................................................................................. 119<br />

E.9.2 cuTexRefDestroy() ............................................................................................................... 119<br />

E.9.3 cuTexRefSetArray() ............................................................................................................. 119<br />

E.9.4 cuTexRefSetAddress() ........................................................................................................ 120<br />

E.9.5 cuTexRefSetFormat() .......................................................................................................... 120<br />

E.9.6 cuTexRefSetAddressMode() .............................................................................................. 120<br />

E.9.7 cuTexRefSetFilterMode() ................................................................................................. 120<br />

E.9.8 cuTexRefSetFlags() ............................................................................................................. 121<br />

E.9.9 cuTexRefGetAddress() ........................................................................................................ 121<br />

E.9.10 cuTexRefGetArray() ............................................................................................................. 121<br />

E.9.11 cuTexRefGetAddressMode() .............................................................................................. 121<br />

E.9.12 cuTexRefGetFilterMode() ................................................................................................. 121<br />

E.9.13 cuTexRefGetFormat() .......................................................................................................... 122<br />

E.9.14 cuTexRefGetFlags() ............................................................................................................. 122<br />

E.10 OpenGL .................................................................................................................................. 122 性 作 操 互<br />

E.10.1 cuGLInit() ................................................................................................................................ 122<br />

E.10.2 cuGLRegisterBufferObject() .......................................................................................... 122<br />

E.10.3 cuGLMapBufferObject() ...................................................................................................... 122<br />

E.10.4 cuGLUnmapBufferObject() ................................................................................................. 122<br />

E.10.5 cuGLUnregisterBufferObject() ..................................................................................... 123<br />

作 操<br />

E.11 Direct3D 互<br />

................................................................................................................................. 123 性<br />

E.11.1 cuD3D9Begin() ......................................................................................................................... 123<br />

E.11.2 cuD3D9End().............................................................................................................................. 123<br />

E.11.3 cuD3D9RegisterVertexBuffer() ..................................................................................... 123<br />

CUDA 编<br />

1.1 IX<br />

南 Version


程 指<br />

E.11.4 cuD3D9MapVertexBuffer() ................................................................................................. 123<br />

E.11.5 cuD3D9UnmapVertexBuffer() ............................................................................................ 123<br />

E.11.6 cuD3D9UnregisterVertexBuffer() ................................................................................ 124<br />

E.11.7 cuD3D9GetDevice() ............................................................................................................... 124<br />

F 录<br />

录 附 F.1 最<br />

F.2 线<br />

F.3 查<br />

125<br />

点 采 近<br />

过 找 性<br />

........................................................................................................................................... 126 样<br />

............................................................................................................................................... 127 滤<br />

................................................................................................................................................... 128 表<br />

取 纹 理 拾 取 .......................................................................................................................................................<br />

X<br />

CUDA 编<br />

1.1<br />

南 Version


程 指<br />

图<br />

CPU<br />

1-2. 图 更 多 晶 体 管 用 于 数 据 处 的 和<br />

GPU<br />

1-3. 一 计 算 设 备 架 构 软 件 堆 图 将<br />

1-4. 集 和 散 布 存 储 器 操 图 统<br />

1-5. 图 聚<br />

2-1. 程 分 图 共<br />

2-2. 图 线<br />

3-1. 图 内<br />

5-1. 图 硬<br />

5-2. 图 已<br />

未<br />

未<br />

无<br />

无<br />

有<br />

有<br />

矩<br />

...................................................................................... 1 数<br />

........................................................................................ 2 理<br />

................................................................................................ 3 栈<br />

........................................................................................................ 4<br />

享 内 存 让 数 据 更 接 作<br />

ALU ............................................................................................... 5 近<br />

................................................................................................................................ 9<br />

............................................................................................................................... 模 型 存 批<br />

11<br />

............................................................................................................................... 型 模 件<br />

14<br />

....................................................................................... 全 局 内 存 访 问 模 式 的 示 例 并 合<br />

52<br />

....................................................................................... 全 局 内 存 访 问 模 式 的 示 例 并 合<br />

53<br />

54<br />

58<br />

59<br />

........................................................................... 60 例<br />

............................................................................... 61 例<br />

............................................................................................................................... 68 法<br />

图 1-1.<br />

GPU<br />

每 秒 浮 点 运 算 次<br />

图 5-3.<br />

....................................................................................... 全 局 内 存 访 问 模 式 的 示 例 并 合<br />

图 5-4.<br />

........................................................................... 体 冲 突 的 共 享 内 存 访 问 模 式 示 例 储 存<br />

图 5-5.<br />

........................................................................... 体 冲 突 的 共 享 内 存 访 问 模 式 示 例 储 存<br />

图 6-1.<br />

阵 乘<br />

图 5-6.<br />

存 储 体 冲 突 的 共 享 内 存 访 问 模 式 示<br />

图 5-7.<br />

广 播 的 共 享 内 存 读 取 访 问 模 式 示<br />

CUDA 编<br />

1.1 XI<br />

南 Version


程 指<br />

可<br />

所<br />

专<br />

成<br />

就 (GPU)<br />

第 1 章<br />

CUDA 简 介<br />

1.1 作 为 数 据 并 行 计 算 设 备 的 图 形 处 理 器<br />

GPU 个 核 心 和 高 存 储 器 带 宽 的 配 合 下 , 最 新 的 多 在<br />

1-1 图 从<br />

看 到 , 经 过 短 短 几 年 的 发 展 , 可 编 程 图 形 处 理 器 具 备 了 高 的 计 算 能 力 。 为 了 图 形 和 非 图 形 处 理 的 超 强 工 具 。 以<br />

将<br />

和 (cache)<br />

(flow<br />

1-1. 1. CPU 和 GPU 的 每 秒 浮 点 运 算 次 数 图<br />

GPU 这 种 发 展 的 主 要 原 因 是 来 带<br />

为 计 算 密 集 型 和 高 度 并 行 的 计 算 设 计 ( 而 这 正 是 图 形 渲 染 所<br />

GPU 的 ), 因 此 要 需<br />

更 多 的 晶 体 管 专 用 于 数 据 处 理 , 而 非 数 据 高 速 缓 存<br />

流 控 制<br />

CUDA 编<br />

1.1 1<br />

。 示<br />

control), 如<br />

图 1-2<br />

南 Version


1-2.<br />

图<br />

,GPU 很<br />

相<br />

中<br />

进<br />

正 的 通 用 数 据 并 行 计 算 设 备 的 能 力 。 真<br />

渲<br />

程<br />

。<br />

的<br />

作<br />

一<br />

GPU 将 更 多 晶 体 管 用 于 数 据 处 理 具 体 来 说 2.<br />

合 于 解 决 数 据 并 行 ( 同 一 程 序 许 多 并 执 行 ) 的 高 运 算 密 度 ( 算 术 运 算 与 存 储 器 操 作 的 比 例 ) 计 算 问 题 。 因 为 在 每 个 数 据 元 素 上 执 行 同 一 程 序 , 所 以 对 复 杂 流 控 制 的 要 求 较 低 ; 又 因 为 具 有 高 运 算 密 度 的 同 一 程 序 在 大 量 数 据 元 素 上 执 行 , 也 就 可 以 通 过 大 量 的 计 算 而 非 大 量 的 数 据 高 速 缓 存 来 隐 藏 访 存 延 迟 适<br />

数 据 并 行 处 理 将 数 据 元 素 映 射 到 并 行 处 理 线 程 。 处 理 大 型 数 据 集 合 ( 比 如 数 组 ) 的 许 多 应 用 程<br />

程 。 同 样 地 , 图 像 和 媒 体 处 理 应 用 程 序 , 比 如 渲 染 图 像 的 后 期 处 理 、 视 频 编 码 和 解 码 、 图 像<br />

GPU<br />

线<br />

只<br />

放 、 立 体 视 觉 、 模 式 识 别 , 可 以 将 图 像 块 和 像 素 映 射 到 并 行 处 理 线 程 。 事 实 上 , 图 像 渲 染 和<br />

GPU DRAM<br />

缩<br />

程 的 可<br />

3D 以 使 用 数 据 并 行 编 程 模 型 来 加 速 计 算 。 在 可 序<br />

染 中 , 大 量 的 像 素 和 顶 点 集 合 被 映 射 到 并 行<br />

理 以 外 的 许 多 计 算 方 法 也 能 通 过 数 据 并 行 处 理 来 加 速 , 其 范 围 涵 盖 从 一 般 的 信 号 处 理 或 物 理 模 拟 , 到 计 算 金 融 学 或 计 算 生 物 学 等 的 诸 多 领 域 。 处<br />

的 事 : 般 不 太 适 用 于 非 图 形 应 用 程 序 。 易<br />

GPU , 在 此 之 前 , 获 得 是 但<br />

的 所 有 计 算 能 力 并 将 其 有 效 用 于 非 图 形 应 用 程 序 中 仍 然 不 是 件 容<br />

API 过 图 形 通 能<br />

API 程 , 从 而 把 较 高 的 学 习 曲 线 强 加 给 初 学 者 , 并 且 图 形 编 行<br />

一<br />

存<br />

的<br />

些 应 用 程 序 的 瓶 颈<br />

算 能 力 。 计<br />

GPU 用 一 般 方 式 来 读 取 ( 即 使 以<br />

DRAM 以 从 可 序<br />

任 何 部 分 聚 集 数 据 元<br />

本 文 档 描 述 了 一 种 创 新 性 的 硬 件 和 编 程 模 型 , 用 以 直 接 解 决 这 些 问 题 , 并 展 示<br />

为 一 种<br />

GPU 但 不 能 使 用 一 般 方 式 来 写 入 ( 即 ), 素<br />

DRAM 能 将 消 息 散 布 到 不 序<br />

任 何 部 分 ),<br />

与 CPU<br />

, 其 编 程 灵 活 性 大 大 受 限 。 比<br />

2<br />

CUDA 编<br />

1.1<br />

了 GPU<br />

是 DRAM<br />

GPU 带 宽 , 这 就 不 能 未 充 分 利 用 器 储<br />

Version 南 指 程


程 指<br />

CUDA(Compute Architecture, Unified Device<br />

、Tesla 解 视 统<br />

CUDA 软 。<br />

章<br />

所<br />

和<br />

解<br />

应<br />

及 (API)<br />

对 GPU<br />

1.2 CUDA: 一 种 GPU 计 算 的 新 架 构<br />

为 数 据 并 行 计 算 设 备 , 在 其 上 进 行 计 算 的 分 配 和 管 理 , 而 无 需 将 其 映 射 到 图 形<br />

8 系<br />

列<br />

计 算 设 备 架 构 ), 是 一 种 新 型 的 硬 件 和 软 件 架 决 方 案 ( 详 细 信 息 请 参 阅 附 录 用 程 序 和 图 形 应 用 程 序 一<br />

GPU 将<br />

API。 它 可 用 A)。 操 作 系 统 的 多 任 务 机 制 负 责 管 理 多 个 并 发 运 行 , 构<br />

于 GeForce<br />

的 访 问<br />

Quadro 案 和 一 些 方 决<br />

的 CUDA<br />

1-3 栈 由 几 层 组 成 , 如 图 堆 件<br />

: 硬 件 驱 动 程 序 , 应 用 编 程 接 口 其 运 行 时 两 个 库 会 在 单 独 的 文 档 中 介 示<br />

以 这 绍 )。 在 硬 件 设 计 上 , 驱 动 程 序 层 和 运 行 时 层 是 轻 量 级 的 , 这 样 更 能 够 达 到 高 性 能 。<br />

(runtime),<br />

CUFFT 个 更 高 层 的 通 用 数 学 库 两 及<br />

CUBLAS(<br />

,CUDA API 的<br />

语<br />

1-3.<br />

统 一 计 算 设 备 架 构 软 件 堆 栈 以 给 编 程 人 员 提 供 尽 量 低 的 学 习 曲 线 为 目 的 图<br />

语 法<br />

言 语 法 扩 展 而 来 ( 参 见<br />

CUDA 编<br />

1.1 3<br />

第 4<br />

)。<br />

由 C<br />

南 Version


所<br />

,CUDA 提<br />

和 (gather)<br />

1-4.<br />

聚 集 和 散 布 存 储 器 操 作 图<br />

的 (scatter)<br />

存<br />

CPU 编 的<br />

的<br />

储 器 寻 址 方 式 以 实 现 更 高 的 编 程 灵 活 性 , 这 就 是<br />

1-4 图 如<br />

示<br />

DRAM 通 用 的 了 供<br />

何 位 置 读 取 和 写 入 数 据 的 能 力 , 与 传 统<br />

一 样 。 程<br />

被 称 为 聚 集<br />

散 布<br />

DRAM 器 操 作 。 从 编 程 角 度 看 , 它 们 就 是 在 储 存<br />

任<br />

4<br />

CUDA 编<br />

1.1<br />

Version 南 指 程


程 指<br />

和 (overfetch)<br />

1-5.<br />

共 享 内 存 让 数 据 更 接 近 ALU 图<br />

章<br />

从 (round-trips),<br />

所<br />

内<br />

(shared 线 。<br />

memory),<br />

CUDA 提<br />

示 , 应 用 程 序 可 以 利 用 它 来 最 小 化 对<br />

DRAM 的<br />

供 了 极 高 读 写 速 度 的 并 行 数 据 高 速 缓 存 或 者 称 其 为 片 上 共 享 内 存<br />

3 以 使 用 它 来 互 相 共 享 数 据 ( 参 见 第 可 程<br />

1-5 图 如 )。<br />

过 取<br />

轮 询<br />

DRAM 低 对 降 而<br />

存 带 宽 的 依 赖 程 度<br />

CUDA 编<br />

1.1 5<br />

南 Version


第 章<br />

章<br />

的<br />

。<br />

。<br />

。 考<br />

。<br />

。<br />

程 指<br />

1.3 文 档 结 构<br />

第<br />

章<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

附 5<br />

章<br />

6<br />

章<br />

章<br />

A 给 录<br />

B 列 录<br />

C 列 录<br />

是 给 API 和<br />

概 述 编 程 模 型 :<br />

绍 硬 件 实 现 。 提 供 一 些 有 关 如 何 达 到 最 大 性 能 的 指 南 介<br />

过 分 析 一 些 简 单 示 例 的 代 码 来 进 一 步 说 明 前 几 章 的 内 容 通<br />

各 种 设 备 的 技 术 规 格 支 出<br />

支<br />

动 程 运<br />

出 有 关 纹 理 拾 取 一 些 细 节 驱<br />

般 性 介 绍 一<br />

行 时 运<br />

的 数 学 函 数 参 考 持<br />

参<br />

1<br />

CUDA 对 含 包<br />

本 文 档 分 为 下 列 几 章<br />

2<br />

3<br />

4<br />

CUDA 绍 介<br />

出 CUDA<br />

出 CUDA<br />

持 的 原 子 函 数<br />

录 F<br />

录 D<br />

序 API<br />

CUDA<br />

API 时 行<br />

录 E<br />

CUDA<br />

6<br />

CUDA 编<br />

1.1<br />

南 Version


程 指<br />

编<br />

或<br />

,host)<br />

看<br />

(DMA)<br />

调<br />

的<br />

装 kernel)<br />

(block),<br />

复<br />

x +zD x D y )。 为 的<br />

为<br />

个<br />

x ),<br />

(grid),<br />

中<br />

个<br />

device)。 它<br />

memory)。<br />

第 2 章 编 程 模 型<br />

2.1 高 度 多 线 程 协 处 理 器<br />

作<br />

用 许 多 不 同 的 线 程 去 执 行 。 要 达 到 这 种 效 果 , 可 以 将 这 样 一 个 函 数 编 译 到 设 备 的 指 令 集 中 , 并<br />

memory) 和<br />

准 确 地 说 , 应 用 程 序 中 , 多 次 但 在 不 同 数 据 上 独 立 执 行 的 部 分 可 以 被 独 立 放 到 在 此 设 备 上 ,<br />

2.2 线 程<br />

更<br />

线 程 分 批<br />

CUDA 过 通<br />

GPU , 将 时 程<br />

(compute 以 并 行 执 行 非 常 多 个 线 程 的 计 算 设 备 可 作<br />

主 CPU( 为<br />

称 为 宿 主 协 处 理 器 运 作 换 句 话 说 , 在 宿 主 上 运 行 的 应 用 程 序 中 , 数 据 并 行 的 、 计 算 密 集 型 的 部 分 被 装 载 到 计 算 设 备 上 。 被<br />

, 译 后 的 程 序 ( 被 称 为 内 核 编 将<br />

到 设 备 上 。 载<br />

分<br />

和<br />

所<br />

主 和 设 备 都 保 留 自 己 的 DRAM, 宿<br />

(host 为 宿 主 内 存 称 别<br />

(device 内 存 备 设<br />

引<br />

API 可 以 通 过 优 化 的 户 用<br />

DRAM 数 据 从 一 个 将 用<br />

DRAM 另 一 个 到 制<br />

, 该 过 程 使 用 了 设<br />

2.2.1 线 程 块<br />

再<br />

如<br />

备 的 高 性 能 直 接 内 存 访 问<br />

。 擎<br />

ID) 标<br />

的<br />

执 行 内 核 的 一 批 线 程 组 成 线 程 块<br />

由 线 程 块 组 成 网 格<br />

述 ,<br />

对 于 大 小<br />

x ,D y )<br />

线 程 的 线 的<br />

的<br />

x ,D y ,D z ) 的<br />

2.2.1<br />

2.2.2<br />

参 见 图 2-1。 并<br />

对 于 大 小<br />

三<br />

程 块 是 可 以 协 同 工 作 的 一 批 线 程 , 它 们 通 过 高 速 共 享 内 存 有 效 地 共 享 数 据 , 并 同 步 其 执 行 以 协 调 访 存 。 更 准 确 地 说 , 用 户 可 以 在 内 核 中 指 定 同 步 点 , 块 中 的 线 程 在 全 部 到 达 此 同 步 点 时 挂 起 。 线<br />

杂 寻 址 , 应 索 引 来 标 识 每 个 线 程 。 复<br />

CUDA 编<br />

1.1 7<br />

线 程 的 线<br />

维 块 , 索 引<br />

ID(thread 线 程 由 线 程 个 每<br />

ID 这 是 块 中 的 线 程 号 。 为 了 帮 助 基 于 线 程 , 识<br />

2 序 还 可 以 将 块 指 定 为 任 意 大 小 的 二 维 或 三 维 数 组 , 并 使 用 程 用<br />

或 3<br />

为 (D<br />

(x,y) 块 , 索 引 为 维 二<br />

程 ID<br />

(x+yD<br />

为 (D<br />

程 ID<br />

为 (x,y,z)<br />

(x+yD<br />

南 Version


为<br />

x )。<br />

的<br />

程 指<br />

2.2.2 线 程 块 网 格<br />

ID) 标<br />

可 以 包 含 的 最 大 线 程 数 是 有 限 制 的 。 但 是 , 执 行 相 同 内 核 的 , 具 有 相 同 维 度 和 大 小 的 块 可 以 分 批 组 合 到 一 个 块 网 格 中 , 这 样 单 个 内 核 调 用 中 启 动 的 线 程 总 数 就 可 以 变 得 很 大 。 但 这 是 以 线 块<br />

的<br />

个<br />

x ,D y ) 的<br />

协 作 性 的 降 低 为 代 价 的 , 因 为 同 一 网 格 中 不 同 线 程 块 中 的 线 程 不 互 相 通 信 和 同 步 。 此 模 型 允 许 内 核 有 效 运 行 , 而 不 必 在 具 有 不 同 并 行 能 力 的 各 种 设 备 上 重 新 编 译 : 如 果 设 备 具 有 非 常 低<br />

并 行 能 力 , 则 可 以 顺 序 运 行 网 格 的 所 有 块 , 如 果 具 有 很 高 的 并 行 能 力 , 则 可 以 并 行 运 行 网 格 的 所 有 块 , 或 者 是 多 数 情 况 下 的 二 者 组 合 使 用 。 程<br />

ID(block 块 由 块 个 每<br />

ID 这 是 网 格 中 的 块 号 。 为 了 帮 助 基 于 块 , 识<br />

复 杂 寻 址 , 应 用 程 序<br />

2 将 网 格 指 定 为 任 意 大 小 的 二 维 数 组 , 并 使 用 以 可<br />

(D 来 标 识 每 个 块 。 对 于 大 小 为 引 索<br />

二<br />

(x,y) , 索 引 为 块 维<br />

ID 块 的 块<br />

(x+yD<br />

8<br />

CUDA 编<br />

1.1<br />

南 Version


程 指<br />

主 执 行 一 连 串 对 设 备 的 内 核 调 用 。 每 个 内 核 作 为 一 批 线 程 来 执 行 , 若 干 个 线 程 组 成 线 程 块 , 再 由 线 程 块 组 成 网 格 。 图 2-1.<br />

线 程 分 批 宿<br />

CUDA 编<br />

1.1 9<br />

南 Version


DRAM 和 的<br />

片 上 存 储 器 , 可 访 问 的 内 存 空 间 如 下 , 示 意 图 见<br />

程 指<br />

和 5.1.2.3)。<br />

。<br />

2.3 内 存 模 型<br />

<br />

备 上 执 行 的 线 程 只 能 访 问 设 备 可 寄 存 器 , 在 设<br />

每 线 程 本 地 内 存 , 写 读<br />

可<br />

可<br />

可<br />

块 共 享 内 存 , 读 写 每 网 格 全 局 内 存 ,<br />

只<br />

常 量 , 读 每 网 格 纹 理 内 存 。<br />

图 2-2:<br />

只<br />

全 局 、 常 量 和 纹 理 内 存 空 间 可 以 通 过 宿 主 读 或 写 , 并 可 被 相 同 应 用 程 序 的 内 核 持 续 访 问<br />

5.1.2.1、5.1.2.2 、 常 量 和 纹 理 内 存 空 间 对 不 同 的 内 存 使 用 方 式 进 行 了 优 化 ( 参 见 局 全<br />

理 内 存 还 为 一 些 特 定 的 数 据 格 式 提 供 不 同 的 寻 址 模 式 和 纹 理 过 滤 模 式 ( 参 见 4.3.4)。 纹<br />

10<br />

CUDA 编<br />

1.1<br />

南 Version


程 指<br />

2-2.<br />

2. 内 存 模 型 图<br />

DRAM 和 的<br />

上 存 储 器 。 片<br />

线 程 可 以 通 过 不 同 范 围 的 一 组 内 存 空 间 来 访 问 设 备<br />

CUDA 编<br />

1.1 11<br />

南 Version


程 指<br />

12<br />

CUDA 编<br />

1.1<br />

南 Version


程 指<br />

来<br />

所<br />

第 3 章<br />

硬 件 实 现<br />

3.1 具 有 片 上 共 享 内 存 的 一 组 SIMD 多 处 理 器<br />

(SIMD) 架<br />

: 在 任 何 给 定 的 时 钟 周 期 , 多 处 理 器 中 的 每 个 处 理 器 执 行 相 同 的 指 令 , 但 操 作 不 同 的 数 据 。 每 个 多 处 理 器 具 有 下 列 四 种 类 型 的 片 上 存 储 器 : 构<br />

位<br />

每<br />

并<br />

memory), 由<br />

(multiprocessors) 作 为 一 组 多 处 理 器 备 设<br />

3-1 , 如 图 现 实<br />

示 。 每 个 多 处 理 器 具 有 单 指 令 多 数 据<br />

, 间<br />

只<br />

cache), 由<br />

存 空 间 为 设 备 内 存 的 只 读 区 域 , 内<br />

只<br />

cache), 由<br />

32 理 器 有 一 组 本 地 处 个<br />

存 器 , 寄<br />

空 间 为 设 备 内 存 的 只 读 区 域 。 存<br />

(shared 据 高 速 缓 存 或 称 为 共 享 内 存 数 行<br />

所 有 处 理 器 共 享 并 实 现 共 享 内 存 空<br />

unit)<br />

各 种 寻 址 模 式 和 纹 理 过 滤 模 式 。 访<br />

一<br />

地 和 全 局 内 存 空 间 为 设 备 内 存 的 可 读 写 区 域 , 且 无 高 速 缓 存 。 本<br />

(constant 量 高 速 缓 存 常 读<br />

所 有 处 理 器 共 享 并 加 速 从 常 量 内 存 空 间 的 读 取 , 常 量<br />

(texture 理 高 速 缓 存 纹 读<br />

所 有 处 理 器 共 享 并 加 速 从 纹 理 内 存 空 间 的 读 取 , 纹 理 内<br />

(texture 多 处 理 器 通 过 纹 理 单 元 个 每<br />

2.3 理 高 速 缓 存 , 其 中 纹 理 单 元 实 现 纹 问<br />

节 提 到 的<br />

CUDA 编<br />

1.1 13<br />

南 Version


SIMD 片 上 共 享 内 存 的 一 组 多 有 具<br />

理 器 。 处<br />

程 块 网 格 是 通 过 调 度 块 在 上 执 行 来 在 设 备 上 执 行 的 。 每 个 多 处 理 器 一 批 接 一 批 地 处 理 块 批 次 。 一 个 块 仅 在 一 个 多 处 理 器 内 处 理 , 所 以 存 在 于 片 上 共 享 内 存 中 的 共 享 内 存 空 间 能 够 提 供 极 高 的 访 存 速 度 。 线<br />

器 执 行 。 理<br />

3.2 执 行 模 型<br />

3-1.<br />

硬 件 模 型 图<br />

14<br />

CUDA 编<br />

因 为 多 处 理 器 上 寄 存 器 和 共 享 内 存 由 块 批 次 的 所 有 线 程 瓜 分 , 所 以 每 个 多 处 理 器 一 批 可 以 理 多 少 个 块 取 决 于 给 定 内 核 内 的 每 线 程 需 要 多 少 寄 存 器 以 及 每 块 需 要 多 少 共 享 内 存 。 如 果 某 多 处 理 器 没 有 足 够 的 可 用 寄 存 器 或 共 享 内 存 来 处 理 至 少 一 个 块 , 则 内 核 将 无 法 将 块 分 配 给 该 多 处<br />

1.1<br />

Version 南 指 程


程 指<br />

线<br />

开<br />

的<br />

的<br />

。2.2.1<br />

(issue)<br />

节<br />

(atomic)<br />

切<br />

的<br />

(non-atomic)<br />

包<br />

中<br />

块<br />

。 包 连 以<br />

与<br />

中<br />

是<br />

大<br />

从<br />

warp 由<br />

以 SIMD<br />

力 1.x<br />

(thread 的 : 线 程 调 度 器 便 最 大 化 地 利 用 多 处 理 器 的 计 算 资 源 。 半 时 分<br />

。 每 个 活 动 块 划 分 到 被 称<br />

比<br />

(active) 个 批 次 内 并 被 一 个 多 处 理 器 处 理 的 块 被 称 为 活 动 一 在<br />

的 SIMD<br />

warp 中 : 其 中 每 个 程 组<br />

了 线 发 射 绍 介<br />

warp 同 数 量 的 线 程 , 该 数 量 被 称 为 相 含<br />

warp<br />

小 , 并 为<br />

式 由 多 处 理 器 执 行 。 活 动 warp( 方<br />

所 有 活 动 块 中 的 所 有 warp) 如<br />

第 一 半 或 第 二 半<br />

scheduler) 定<br />

warp 一 个 从 期<br />

到 另 一 个 warp, 换<br />

warp(half-warp) 是<br />

warp 个 一<br />

始 递 增<br />

2.2.1 述 所<br />

warp 分 为 划 块<br />

warp 始 终 相 同 ; 每 个 式 方<br />

。<br />

程 ID<br />

warp 增 的 线 程 , 其 中 第 一 个 递 续<br />

程 ID<br />

0 程 线<br />

3.3 计 算 能 力<br />

同 一 网 格 的 两 个 不 同 块 中 的 线 程 无 法 通 过 全 局 内 存 安 全 地 互 相 通 信 自<br />

定 的 。 确<br />

warp 中 块<br />

( 参 见 4.4.6) 令<br />

取 、 修 改 并 写 入 全 局 内 存 中 的 相 同 位 置 ,<br />

warp 某 果 如<br />

行 了 非 原 子<br />

令 对 全 局 或 共 享 内 存 中 的 相 同 位 置 进 行 写 入 , 则 此<br />

capability) 由<br />

置 发 生 的 串 行 化 写 入 次 数 及 其 发 生 顺 序 是 不 确 定 的 , 但 会 保 证 其 中 一 个 写 入 成 功 。 如 果 指 读 位<br />

块 中 的 线 程 索 引 如 何 相 关 联 。 顺 序 但 其 执 行 可 以 以 协 调 全 局 或 共 享 内 存 访 问 如 含<br />

程 块 网 格 中 块 的 发 射 顺 序 也 是 不 确 定 的 , 且 块 之 间 没 有 同 步 机 制 , 所 以 在 网 格 执 行 期 间 , 来 。 执 指 线<br />

的 多 个 线 程 执 行 原 子 则 对 此 位 置 的 每 个 读 取 、 修 改 和 写 入 都 会 发 生 , 且 全 部 都 是 串 行 化 发 生 的 , 但 发 生 的 顺 序 是 不 里<br />

( 其 主 要 修 订 号 为 1)。 次 要 修 订 号 与 核 心 架 构 的 增 量 改 进 相 对 应 , 其 中 可 能 包 括 新 功 能 。 的<br />

(compute 的 计 算 能 力 备 设<br />

要 修 订 号 和 次 要 修 订 号 来 定 义 。 主<br />

A 计 算 能 力 的 技 术 规 格 在 附 录 种 各<br />

出 。 给<br />

A 相 同 主 要 修 订 号 的 设 备 具 有 相 同 的 核 心 架 构 。 附 录 有 具<br />

列 出 的 设 备 都 是 具 有 计 算 能<br />

CUDA 编<br />

1.1 15<br />

南 Version


作<br />

内<br />

中<br />

设<br />

都<br />

模<br />

可<br />

的<br />

设<br />

(primary 该 控<br />

surface),<br />

模<br />

(mode 时 位 位 应<br />

switch)<br />

计 算 机 。 应 用 程 序 的 崩 溃 。 定<br />

,CUDA 能 将 每 个 才<br />

中<br />

用 程 应<br />

3.4 多 个 设 备<br />

式<br />

型 相 同 时 , 应 用 程 序 才 能 保 证 工 备 , 因 为 在 驱 动 程 序 堆 类<br />

GPU 看<br />

3.5 显 示 模 式 切 换<br />

SLI 但 是 , 如 果 系 统 处 于 作 单 独 的 设 备 。 作<br />

GPU 多 个 用 使<br />

为 CUDA<br />

GPU 情 况 下 , 仅 当 这 些 的 备<br />

GPU 则 只 有 一 个 , 式<br />

CUDA 作 用 以<br />

GPU 最 低 层 , 所 有 的 栈<br />

SLI 在 一 起 。 需 要 在 控 制 面 板 中 关 闭 合 熔<br />

GPU 将<br />

。<br />

更 改<br />

存 分 配 给 所 谓 的 主 表 面<br />

7.68MB 内<br />

存 。)<br />

表 用 于 刷 新 用 户 当 前 查 制 面 板 的 显 , 主 表 面 所 需 的 内 存 量 将 随 之 变 化 。 例 如 , 如 , 系 统 必 须 为 主 表 面 分 配 主<br />

了 反 锯 齿 的 全 屏 图 形 应 用 程 序 需 要 为 主 表 面 分 配 更 多 的 显 示 内 用 程 序 、 按 下 用<br />

Alt+Tab 从<br />

应<br />

锁<br />

<strong>NVIDIA</strong> 显 示 设 备 。 当 用 户 通 过 更 改 显 示 分 辨 率 或 位 深 ( 使 用 的 看<br />

或 Windows<br />

DRAM<br />

示 控 制 面 板 ) 启 动 显 示 模 式 切 换 果 用 户 将 显 示 分 辨 率 一 些<br />

启 而 存<br />

非 5.24MB。(<br />

从 1280x1024x32-<br />

为 1600x1200x32-<br />

如 果 模 式 切 换 导 致 了 主 表 面 所 需 内 存 量 的 增 加 , 系 统 可 能 不 得 不 抽 调 本 已 指 定<br />

给 CUDA<br />

在 Windows<br />

DirectX 以 启 动 显 示 模 式 切 换 的 其 它 事 件 包 括 启 动 全 屏 可 ,<br />

DirectX 屏 全<br />

Ctrl+Alt+Del 序 切 出 或 按 下 程 用<br />

CUDA 内 存 分 配 给 主 表 面 使 用 , 从 而 导 致 的 序<br />

16<br />

CUDA 程 指 编<br />

1.1<br />

南 Version


程 指<br />

所<br />

所<br />

程 语 言 的 用 户 提 供 相 对 较 低 的 学 习 曲 线 , 以 便 更 容 易 编<br />

标<br />

;<br />

;<br />

库 中 的 函 数 才 是 共 用 组 件 提 供 的 函 数 。 准<br />

准 标<br />

第 4 章<br />

应 用 编 程 接 口<br />

4.1 C 编 程 语 言 扩 展<br />

CUDA 编<br />

C 语 括 包 它<br />

运<br />

<br />

C 口 的 设 计 目 标 是 为 熟 悉 接 程<br />

编 写 在 设 备 上 执 行 的 程 序 。 : 述 , 允 许 编 程 人 员 更 关 注 于 业 务 代 码 而 非 语 言 地<br />

时 库 划 分 为 : 述 , 在 宿 主 上 运 行 , 提 供 函 数 以 控 制 并 访 问 宿 主 中 的 一 个 或 多 个 计 行<br />

设<br />

所<br />

4.2 最 小 扩 展 集 合 , 如 的 言<br />

<br />

所<br />

4.5 组 件 , 如 主 宿<br />

4.2 语 言 扩 展<br />

设 备 ; 备 组 件 , 算<br />

的 一 个 子 集 库<br />

如 4.4<br />

4.3 组 件 , 如 用 共<br />

C 提 供 内 置 的 向 量 类 型 , 以 及 宿 主 和 设 备 代 码 中 都 支 持 的 , 述<br />

C 编<br />

, 在 设 备 上 运 行 , 并 提 供 专 用 于 设 备 的 函 数 。 述<br />

须 强 调 的 是 , 只 支 持 在 设 备 上 运 行 必<br />

语 言 的 扩 展 有 四 个 部 分 : 程<br />

的 C<br />

函<br />

变<br />

数 类 型 限 定 符 , 用 于 指 定 函 数 是 在 宿 主 上 还 是 在 设 备 上 执 行 , 以 及 可 以 从 宿 主 中 还 是 设<br />

CUDA 编<br />

1.1 17<br />

类 型 限 定 符 , 用 于 指 定 变 量 在 设 备 上 的 内 存 位 置 ( 参 见 4.2.2); 量<br />

中 调 用 ( 参 见 4.2.1); 备<br />

南 Version


编<br />

,nvcc 每 个 扩 展 都 有 一 些 限 定 条 件 , 这 些 限 定 条 件 会 在 下 文 各 节 中 描 述 。 违 反 这 些 限 制 时 上 以<br />

,__host__ 限<br />

和<br />

函<br />

限<br />

返<br />

限<br />

,__global__ 函<br />

编<br />

或<br />

程 指<br />

新<br />

四<br />

,4.2.5 中<br />

。nvcc 的<br />

4.2.1 函 数 类 型 限 定 符<br />

介 绍 可 以 参 见 单 独 的 文 档 。 将 给 出 错 误 或 警 告 , 但 一 些 违 规 无 法 被 检 测 到 。 细<br />

令 , 用 于 指 定 来 自 宿 主 的 内 核 如 何 在 设 备 上 执 行 ( 参 见 4.2.3); 指<br />

内 置 变 量 , 用 于 指 定 网 格 和 块 维 度 , 以 及 块 和 线 程 索 引 ( 参 见 4.2.4)。 个<br />

CUDA 这 些 扩 展 的 每 个 源 文 件 必 须 使 用 含 包<br />

nvcc 器 译<br />

译<br />

有 简 要 介 绍<br />

详<br />

4.2.1.1 __device__<br />

__device__ 限<br />

在<br />

只<br />

4.2.1.2 __global__<br />

__global__ 限<br />

<br />

只 在<br />

符 声 明 某 函 数 : 设 备 上 执 行 , 能 从 设 备 中 调 用 。 定<br />

符 将 某 函 数 声 明 为 内 核 。 这 种 函 数 : 设 备 上 执 行 , 定<br />

4.2.1.3 __host__<br />

__host__ 限<br />

在<br />

只<br />

从 宿 主 中 调 用 。 能<br />

限<br />

限<br />

译 。 编<br />

定 符 结 合 使 用 , 此 时 , 函 数 同 时 为 宿 主 和 设 备<br />

4.2.1.4 限 定 条 件<br />

__host__ 用 使 仅<br />

__host__、__device__ 声 明 某 函 数 , 等 价 于 不 使 用 符 定<br />

__global__<br />

符 声 明 某 函 数 : 宿 主 上 执 行 , 能 从 宿 主 中 调 用 。 定<br />

18<br />

CUDA 编<br />

1.1<br />

符 中 的 任 何 一 个 声 明 该 函 数 ; 在 这 两 种 情 况 下 , 该 函 数 仅 为 宿 主 编 译 。 定<br />

数 不 支 持 递 归 。 函<br />

__device__<br />

__device__<br />

函<br />

但 是<br />

__device__ 还 可 以 与 符 定<br />

__device__<br />

__device__ 函<br />

__global__<br />

__global__<br />

__global__ 函<br />

南 Version<br />

__global__<br />

不 能 在 函 数 体 内 声 明 静 态 变 量 。 数 不 能 取 其 地 址 ; 相 反 数 的 函 数 指 针 则 受 支 持 。 数<br />

__global__<br />

不 能 具 有 可 变 个 参 数 。 数<br />

__host__<br />

符 不 能 结 合 使 用 。 定<br />

void 须 具 有 必 数<br />

类 型 。 回


程 指<br />

函<br />

函<br />

内 存 的 读 写 。 参<br />

建<br />

所<br />

结<br />

指 执<br />

字<br />

__global__ 函<br />

述<br />

4.2.2 变 量 类 型 限 定 符<br />

内 存 传 递 给 设 备 , 并 限 制 享 共 过 通 前 当 数 参 数<br />

变 量 类 型 限 定 符<br />

对 __global__<br />

4.2.3 任 何 调 用 必 须 指 定 其 执 行 配 置 , 如 的 数<br />

对 __global__<br />

的 调 用 是 异 步 的 , 这 意 味 着 在 设 备 完 成 其 执 行 之 前 返 回 。 数<br />

4.2.2.1 __device__<br />

为 256<br />

节 。 。<br />

__device__ 限<br />

驻<br />

具<br />

可<br />

符 声 明 驻 留 在 设 备 上 的 变 量 。 属 于 哪 个 内 存 空 间 。 如 果 不 使 用 其 中 任 何 一 个 , 则 变 量 : 定<br />

在 全 局 内 存 空 间 中 , 留<br />

4.2.2.2 __constant__<br />

__constant__ 限<br />

应 用 程 序 的 生 命 期 , 通 过 运 行 时 库 被 网 格 的 所 有 线 程 访 问 , 也 可 以 被 宿 主 访 问 。 有<br />

结<br />

__device__ 三 节 定 义 的 其 它 类 型 限 定 符 中 , 至 多 一 个 可 以 与 面 下<br />

合 使 用 , 以 进 一 步 指 定 变 量<br />

驻<br />

具<br />

可<br />

4.2.2.3 __shared__<br />

__shared__ 限<br />

在 常 量 内 存 空 间 中 有 应 用 程 序 的 生 命 期 , 通 过 运 行 时 库 被 网 格 的 所 有 线 程 访 问 , 也 可 以 被 宿 主 访 问 。 留<br />

结<br />

__device__ 可 以 与 符 定<br />

使 用 , 声 明 变 量 : 合<br />

驻<br />

具<br />

仅<br />

__device__ 可 以 与 符 定<br />

使 用 , 声 明 变 量 : 合<br />

在 线 程 块 共 享 内 存 空 间 中 , 有 块 的 生 命 期 , 可 被 块 内 的 所 有 线 程 访 问 。 留<br />

程 内 对 共 享 变 量 的 调 用 具 有 完 全 的 顺 序 一 致 性 , 但 多 个 线 程 间 对 该 变 量 的 调 用 顺 序 不 严 格 一 非 变 量 被 声 明 为 不 稳 定 的 , 否 则 只 要 满 令 , 编 译 器 就 可 以 优 化 对 共 享 线<br />

CUDA 编<br />

1.1<br />

将 共 享 内 存 中 的 变 声 明 为 外 部 , 比 如 以 此 方 式 声 明 的 所 有 变 量 内 存 中 的 起 始 地 址 相 同 , 所 以 必 须 通 过 偏 移 量 显 式 地 管 理 数 组 中 变 量 的 布 局 。 例 如 , 如 果 想 要 在 动 态 分 配 的 共 享 内 存 中<br />

19<br />

立<br />

足 __syncthreads()<br />

。 仅 在 __syncthreads()( 致<br />

见 4.4.2)<br />

行 之 后 , 来 自 其 它 线 程 的 写 入 才 能 保 证 可 见 。 除<br />

南 Version<br />

组 大 小 在 初 始 化 时 被 确 定 ( 参 见 4.2.3)。 数


编<br />

和 和 变<br />

变<br />

和<br />

:<br />

成<br />

关<br />

。ptx 汇<br />

和 助 选 情 助<br />

要 编 译 器 能 够 解 析 在 设 备 上 执 行 的 代 码 中 的 指 针 是 指 向 共 享 内 存 空 间 还 是 全 局 内 存 空 间 , 就 只<br />

4.5.2.3 见<br />

-ptx 用<br />

支 持 这 些 指 针 , 否 则 , 就 限 制 这 些 针 只 能 在 全 局 空 间 中 分 配 或 声 明 。<br />

(lmem)<br />

宿 主 全 局 或 共 享 内 存 的 指 针 将 导 致 不 确 定 的 行 为 发 生 ; 同 样 , 在 设 备 上 执 行 的 代 码 中 , 试 图 析 取 指 向 宿 主 内 存 的 指 针 也 将 导 致 不 确 定 的 行 为 发 生 。 这 通 常 会 带 来 分 段 错 误 和 应 用 程 序 终 止 。<br />

4.2.2.4 限 定 条 件<br />

则 可 以 使 用 下 列 方 式 声 明 和 初 始 化 数 组<br />

__shared__<br />

量 含 有 默 认 的 静 态 存 储<br />

__device__、__shared__<br />

变<br />

员 、 形 参 以 及 在 宿 主 上 执 行 的 函 数 本 地 变 量<br />

__device__<br />

struct 限 定 符 不 允 许 被 用 于 些 这<br />

union<br />

__constant__ 变<br />

__shared__ 变<br />

__constant__<br />

__constant__<br />

extern 能 使 用 不 量<br />

__constant__<br />

不 能 在 声 明 时 进 行 初 始 化 。 在 设 备 代 码 中 声 明 的 、 不 带 有 其 中 任 何 一 个 限 定 符 的 自 动 变 量 一 般 驻 留 在 寄 存 器 中 。 但 是 , 在 一 些 情 况 下 , 编 译 器 可 能 选 择 将 其 放 置 在 本 地 内 存 中 。 这 通 常 发 生 在 将 耗 费 太 多 寄 存 器 空 间 的 量<br />

型 结 构 或 数 组 , 以 及 编 译 器 无 法 确 定 其 长 度 是 否 定 长 的 数 组 身 上 编 代 码 ( 通 过 使 大<br />

。<br />

。<br />

和 4.5.3.6)。<br />

段 , 某 变 量 没 被 放 置 在 本 地 内 存 中 , 则 后 续 编 译 阶 段 一 旦 发 现 该 变 量 在 目 标 架 构 中 耗 费 了 太 多<br />

字 定 义 为 外 部 变 量 。 量 仅 在 文 件 范 围 内 生 效 。 量 不 能 从 设 备 中 赋 值 , 只 能 在 宿 主 中 通 过 宿 主 运 行 时 函 数 赋 值 ( 参 键<br />

或 -keep<br />

译 获 得 ) 能 显 示 变 量 是 否 已 经 在 第 一 个 编 译 阶 段 被 放 置 在 本 地 内 存 中 , 此 时 此 变 量<br />

检 查 本 地 内 存 使 用<br />

。 况<br />

.local 用 使 将<br />

ld.local 声 明 并 使 用 符 记<br />

st.local<br />

记 符 访 问 。 如 果 在 第 一 个 编 译 阶<br />

20<br />

CUDA 编<br />

1.1<br />

--ptxas-options=-v 器 空 间 , 仍 可 能 将 其 放 置 到 本 地 内 存 中 。 编 译 时 可 以 通 过 存 寄<br />

项 来<br />

Version 南 指 程


程 指<br />

函<br />

;Dg.z 未<br />

的<br />

参<br />

或<br />

;S<br />

或<br />

configuration)。<br />

(execution<br />

Dg, Db, Ns, S >>><br />

等 形<br />

Dg.x*Dg.y*Db.z 此<br />

所<br />

__device__、__shared__ 得<br />

获<br />

量 的 地 址 。 也 仅 能 在 变<br />

__device__ 得<br />

变<br />

量 的 地 址 ,<br />

4.2.3 执 行 配 置<br />

能 用 在 设 备 代 码 中 获 参 见 4.5.2.3。<br />

仅<br />

__constant__<br />

执 行 配 置 用 于 定 义 在 设 备 上 执 行 函 数 的 网 格 和 块 的 维 度 , 以 及 相 关 联 的 流 ( 有 关 流 的 介 绍 , 参<br />

过 cudaGetSymbolAddress()<br />

__constant__<br />

宿 主 代 码 中 通<br />

Dg 的<br />

对 __global__<br />

Db<br />

通<br />

的<br />

数 的 任 何 调 用 必 须 为 此 调 用 指 定 执 行 配 置<br />

Ns 的<br />

;Ns 述<br />

见 4.5.1.5)。<br />


对<br />

工<br />

语<br />

的<br />

代<br />

所<br />

语<br />

子<br />

,__device__ 函<br />

参<br />

参<br />

参<br />

源<br />

代<br />

运<br />

返<br />

,__noinline__ 函<br />

的<br />

__noinline__ 限 视<br />

对<br />

cubin 的<br />

4.2.4.2 blockIdx<br />

4.2.4.3 blockDim<br />

4.2.4.4 threadIdx<br />

4.2.4.5 限 定 条 件<br />

不<br />

变 量 标 识 网 格 中 的 块 索 引 , 类 型 为 uint3( 此<br />

见 4.3.1.1)。<br />

不<br />

4.2.5 使 用<br />

何 内 置 变 量 赋 值 任 为 许 允<br />

使 用 NVCC 编 译<br />

变 量 标 识 块 的 维 度 , 类 型 为 dim3( 此<br />

见 4.3.1.2)。<br />

变 量 标 识 块 中 的 线 程 索 引 , 类 型 为 uint3( 此<br />

见 4.3.1.1)。<br />

nvcc 是<br />

许 提 取 任 何 内 置 变 量 的 地 址 。 。 允<br />

编 译 过 程 的 编 译 器 驱 动 程 序 : 它 提 供 简 单 熟 悉 的 命 令 行 选 项 , 并 通 码<br />

nvcc 的<br />

CUDA 简 化 于 用<br />

是 , 设 备 代 码<br />

cubin 工 作 流 包 括 将 设 备 代 码 与 宿 主 代 码 分 离 , 并 将 设 备 代 码 编 译 为 二 进 制 形 式 或 本 基<br />

编 译 参 数 的 对 象 代 码 。 参 加 上 象 , 要 么 链 接 到 生 成 的 宿 主 代 码 , 该 宿 主 代 码 包 括 作 为 全 局 初 始 化 数 据 数 组 近<br />

的 cubin<br />

C 生 成 的 宿 主 代 码 输 出 为 可 被 另 一 个 工 具 编 译 的 。 象<br />

码 , 或 者 输 出 为 直 接 调 用 宿 主 编 译 器 最<br />

CUDA 程 序 要 么 忽 略 生 成 的 宿 主 代 码 , 而 使 用 用 应<br />

程 序 API( 动<br />

见 4.5.3)<br />

载 并 执 行 设 备<br />

回 的 值 ) 不 经 过 类 型 强 制 转 换 , 不 但<br />

调 用 用 于 实 现 不 同 编 译 参 数 的 工 具 集 合 来 执 行 这 些 选 项 。 过<br />

驱<br />

4.2.3 , 且 包 含 从 象 对<br />

CUDA 执 行 配 置 语 法 到 必 要 的 述<br />

行 时 启 动 代 码 的 转 换 , 以 便 加 载 和 启<br />

只 完 全 支<br />

C++ 像 类 、 继 承 或 基 础 块 中 的 变 量 声 明 这 种 ; 集<br />

特 有 功 能 则 不 受 支 持 。<br />

每 个 已 编 译 的 内 核 ( 参 见 4.5.2)。 动<br />

赋 值 给 非 空 指 针 。 有 作 流 和 命 令 选 项 的 详 细 介 绍 , 可 参 见 单 独 的 文 档 。 能<br />

nvcc 引<br />

22<br />

CUDA 编<br />

1.1<br />

符 。 定<br />

C++ 器 的 前 端 按 照 译 编<br />

CUDA 则 处 理 规 法<br />

件 。 宿 主 代 码 完 全 支 持 C++。 文<br />

4.2.5.1 __noinline__<br />

不 内 联 函 数 。 函 数 体 与 调 用 此 函 数 的 指 令 必 须 位 于 同 一 文 件 中<br />

持 C++<br />

C<br />

了 两 个 编 译 器 指 令 , 见 下 文 所 述 。 入<br />

认 情 况 下 数 始 终 为 内 联 。 但 是 默<br />

C++ 使 用 于 由<br />

malloc() 则 的 原 因 , 空 指 针 ( 比 如 规 法<br />

对 于 带 有 指 针 参 数 的 函 数 和 含 有 长 参 数 列 表 的 函 数 , 编 译 器 将 无 。<br />

数 限 定 符 暗 示 编 译 器 尽 量<br />

关 nvcc<br />

Version 南 指 程


程 指<br />

的<br />

和<br />

来<br />

次<br />

类<br />

则 可 用 于 控 制 任 何 给 令<br />

小<br />

分 量 分 个<br />

4.2.5.2 #pragma unroll<br />

unroll<br />

定 循 环 的 展 开 。 它 必 须 放 置 在 循 环 前 , 并 只 应 用 于 此 循 环 。 它 后 面 可 以 跟 一 个 数 字 , 用 于 指 定 指<br />

编 译 器 会 默 认 展 开 带 有 已 知 循 环 计 数 的 小 循 环 。<br />

环 必 须 展 开 多 少 次 。<br />

#pragma unroll 1<br />

循<br />

将<br />

而 #pragma<br />

unroll 后<br />

4.3 共 用 运 行 时 组 件<br />

到 影 响 )。 如 果 受<br />

在 #pragma<br />

止 编 译 器 展 开 循 环 。 禁<br />

5 , 在 下 列 代 码 示 例 中 循 环 将 展 开 如 例<br />

:<br />

n , 编 程 人 员 应 该 确 保 展 开 将 不 影 响 程 序 的 正 确 性 ( 在 上 例 中 , 如 果 外 另<br />

于 5, 则 正 确 性 可 能<br />

4.3.1 内 置 向 量 类 型<br />

不 指 定 任 何 数 字 , 加 之 其 循 环 计 数 是 常 数 的 情 况 下 , 循 环 将 被 完 全 展 开 , 否 则 根 本 不 展 开 。 面<br />

4.3.1.1 char1、uchar1、char2、uchar2、char3、uchar3、char4、uchar4、<br />

short1、ushort1、short2、ushort2、short3、ushort3、short4、<br />

用 运 行 时 组 件 可 以 由 宿 主 和 设 备 函 数 使 用 。 共<br />

ushort4、int1、uint1、int2、uint2、int3、uint3、int4、uint4、<br />

long1、ulong1、long2、ulong2、long3、ulong3、long4、ulong4、<br />

float1、float2、float3、float4<br />

name> 式 的 构 造 函 数 ; 例 形<br />

y) 的<br />

4.3.1.2 dim3 类 型<br />

, 如<br />

CUDA 编<br />

1.1<br />

向 量 。<br />

23<br />

的 变 量 时 , 未 指 定 的 分 量 将 初 始 化 为 1。 型<br />

1、2、3、4 向 量 类 型 是 从 基 本 整 数 和 浮 点 数 类 型 派 生 而 来 的 。 作 为 结 构 体 , 其 第 些 这<br />

x、y、z 以 通 过 字 段 可 别<br />

此 类 型 是 基<br />

值<br />

w<br />

make_


包<br />

中 : 其<br />

(texel,<br />

标<br />

节<br />

然<br />

的 element”<br />

“texture<br />

类<br />

运<br />

。<br />

4.3.2 数 学 函 数<br />

4.3.3 时 间 函 数<br />

持 支 前 当 含<br />

时 间 函 数<br />

准 库 数 学 函 数 的 完 整 列 表 , 以 及 在 设 备 上 执 行 时 各 自 的 误 差 界<br />

表 B-1<br />

C/C++ 的<br />

回 在 每 个 时 钟 周 期 递 增 的 计 数 值 在 内 核 开 始 和 结 束 时 取 此 计 数 器 的 值 , 求 二 者 之 差 , 并 记 录 每 个 线 程 的 结 果 , 从 而 计 量 设 备 完 返<br />

4.3.4 纹 理 类 型<br />

为 线 程 是 分 时 执 行 的 因 , 者 后 于 大<br />

纹 理 类 型<br />

C 主 代 码 中 执 行 时 , 给 定 函 数 使 用 可 用 的 宿 在<br />

时 实 现 。 行<br />

CUDA 支<br />

上<br />

。<br />

全 执 行 每 个 线 程 所 用 的 时 钟 周 期 数 , 但 这 并 非 设 备 实 际 执 行 线 程 指 令 所 用 的 时 钟 周 期 数 。 前 者<br />

fetches)<br />

。<br />

的<br />

reference) 的<br />

所<br />

和<br />

持 GPU<br />

的 一 部 分 纹 理 硬 件 ( 它 们 原 本 是 为 图 形 处 理 而 设 计 的 )。 从 纹 理 内 存 而 非 全<br />

局 内 存 读 取 数 据 具 备 几 个 性 能 优 势 , 详<br />

。<br />

象 。 对<br />

述 。 纹 理 拾 取<br />

coordinate) 作<br />

绑<br />

见 5.4<br />

(texture 核 中 , 使 用 名 为 纹 理 拾 取 内 在<br />

4.4.5 函 数 读 取 纹 理 内 存 , 如 备 设<br />

(texture 一 个 参 数 是 一 个 名 为 纹 理 参 考 第 的<br />

一 维 数 组 进 行 寻 址 , 还 是 使 用 两 个 纹 理 坐 标 作 为 二 维 数 组 进 行 寻 址 。 数 组 的 元 素 是 其 它 属 性 除 了 定 义 纹 理 拾 取 的 输 入 和 输 出 数 据 类 型 以 外 , 还 包 括 如 何 解 释 输 入 坐 标 , 以 及 应 执 为<br />

4.5.2.6 参 考 定 义 要 拾 取 哪 部 分 纹 理 内 存 。 它 必 须 通 过 宿 主 运 行 时 函 数 ( 参 见 理 纹<br />

4.3.4.1 纹 理 参 考 声 明<br />

一 纹 理 或 在 内 存 中 有 所 交 叠 。 同<br />

什 么 处 理 。 行<br />

4.5.3.9)<br />

到 一 些 内 存 区 域 ( 称 为 纹 理 (texture)), 定<br />

后 才 能 供 内 核 使 用 。 几 个 不 同 的 纹 理 参 考 可 以 绑 定 到<br />

(texture 参 考 具 有 多 个 属 性 。 其 中 之 一 是 其 维 度 , 用 于 指 定 纹 理 是 使 用 一 个 纹 理 坐 标 理 纹<br />

称 为 纹 理 元 素<br />

简 写 )。<br />

纹 理 参 考 的 一 些 属 性 不 可 变 , 而 且 必 须 在 编 译 时 已 知 ; 它 们 在 声 明 纹 理 参 考 时 被 指 定 。 纹 理 参<br />

24<br />

CUDA 编<br />

1.1<br />

texture 文 件 范 围 内 被 声 明 为 在 考<br />

的 变 量 : 型<br />

Version 南 指 程


程 指<br />

见 下 文 。 参<br />

给<br />

寻<br />

和<br />

寻<br />

分<br />

数<br />

位<br />

的<br />

或<br />

;Type 限<br />

是<br />

或<br />

,1.25 当<br />

处<br />

的<br />

且 为<br />

;ReadMode<br />

或<br />

是<br />

是<br />

的<br />

,-1.25 当<br />

参<br />

和<br />

处<br />

位<br />

4.3.1.1 及<br />

位<br />

为<br />

N) 的<br />

Type 指<br />

量 的 向 量 类 型 之 一<br />

Dim 指<br />

ReadMode 等<br />

为<br />

定 拾 取 纹 理 时 返 回 的 数 据 类 型<br />

为 基 本 的 整 数 和 浮 点 数 类 型 , 以 。 可 选 参 数 , 缺 省 值 为 1; 制<br />

1-、2- 中 定 义 的 节 一<br />

1.0] 区<br />

1.0] 区<br />

4-<br />

1 理 参 考 的 维 度 , 等 于 纹 定<br />

2;Dim<br />

于 cudaReadModeNormalizedFloat<br />

整 数 类<br />

cudaReadModeElementType;<br />

选 参 数 , 默 认 为 可<br />

4.3.4.2 运 行 时 纹 理 参 考 属 性<br />

ReadMode 果 如<br />

cudaReadModeNormalizedFloat,<br />

Type<br />

型 , 则 其 值 实 际 返 回 值 为 浮 点 数 类 型 , 即 根 据 原 整 数 类 型 的 全 范 围 进 行 归 一 化 处 理 , 结 果<br />

16-<br />

或 8-<br />

被 映 射 到 [0.0,<br />

[-1.0, 对 于 无 符 号 整 数 ) 或 ( 间<br />

间 ( 对 于 有 符 号 整 数 ); 例 如 , 值<br />

为 0xff<br />

的 无 符<br />

号 8-<br />

纹 理 元 素 返 回 值<br />

为 1; 如<br />

N) 区 间 的 浮 点 坐 标 实 现 纹 理 参 考 , 其 进<br />

1) 中<br />

的<br />

N) 区<br />

1.0)<br />

度 上 使 用 区 区 维 和<br />

63]<br />

31] 中<br />

更 改 。 它 们 指 定 寻 址 模 式 、 纹 理 筛 选 以 及 纹 理 坐 标 是 否 归 一 化 , 详 与 坐 标 相 对 应 的 维 度 中 的 纹 理 行<br />

纹<br />

动 驱<br />

和<br />

y<br />

果 ReadMode<br />

cudaReadModeElementType, 则<br />

执 行 任 何 转 换<br />

cudaReadModeElementType。<br />

不<br />

API 参 考 的 其 它 属 性 是 可 变 的 , 可 以 在 执 行 时 通 过 宿 主 运 行 时 ( 运 行 时 理 纹<br />

见 4.5.2.6,<br />

API 序 程<br />

见 4.5.3.9)<br />

[0, 情 况 下 , 使 用 认 默<br />

中 N<br />

1.0) 中<br />

坐 标 进 行 的<br />

寻 使<br />

。wrap 址<br />

64×32 。 例 如 , 大 小 为 小 大<br />

x 将 分 别 在 理 纹<br />

y<br />

间 [0,<br />

[0,<br />

[0, 。 归 一 化 的 纹 理 坐 标 将 用 引<br />

[0.0, 射 为 映 间<br />

一 64×32<br />

x 在 将 理<br />

[0, 上 都 使 用 范 围 度 维<br />

, 因 此 , 同 的 归 一 化 坐 标 来 寻 址 。 如 果 纹 理 坐 标 独 立 于 纹 理 大 小 , 那 么 归 一 化 纹 理 坐 标 就 成 为 了 一 些 应 用 程 序 很 自 然 的 选 择 。 间<br />

小<br />

(clamp):<br />

仅 为 设 置 为 返 回 浮 点 数 数 据 的 纹 理 执 行 线 性 纹 理 过 滤 。 线 性 纹 理 过 滤 在 相 邻 纹 理 元 素 之 间 执 行<br />

[0, 模 式 定 义 纹 理 坐 标 超 出 范 围 时 要 执 行 的 操 作 。 使 用 非 归 一 化 纹 理 坐 标 时 , 超 出 范 围 址 寻<br />

纹 理 坐 标 将 被 夹 合<br />

于 0<br />

设 置 为 0, 大 于 等 值<br />

于 N<br />

设 置 为 N-1。 值<br />

用 归 一 化 纹<br />

4.3.4.3 线 性 内 存 中 的 纹 理 和 CUDA 数 组 中 的 纹 理<br />

精 度 插 值 。 启 用 线 性 纹 理 过 滤 时 , 将 读 取 纹 理 拾 取 位 置 周 围 的 纹 理 元 素 , 并 基 于 纹 理 坐 标 落 入 元 素 之 间 的 位 置 插 值 生 成 纹 理 拾 取 的 返 回 值 。 对 于 一 维 纹 理 执 行 简 单 线 性 插 值 , 对 于 二 维 纹 理 执 行 双 线 性 插 值 。 低<br />

有 关 纹 理 拾 取 的 更 多 详 细 信 息 。 出<br />

clamp 标 时 , 默 认 采 用 坐 理<br />

0.0 式 : 小 于 模 址<br />

1.0 于 大<br />

[0.0, 置 到 区 间 设 值<br />

。 对 于 归<br />

wrap 坐 标 , 也 可 以 指 定 化 一<br />

wrap 式 。 当 纹 理 包 含 周 期 性 信 息 时 , 通 常 使 用 模 址<br />

寻 址 仅 使 用 纹 理 坐 标 的 小 数 部 分 ; 例 如<br />

作 0.25<br />

理<br />

作 0.75<br />

。 理<br />

CUDA 编<br />

1.1 25<br />

F 录 附<br />

纹 理 可 以 是 线 性 内 存<br />

组 的 任 何 区 域 ( 参<br />

见 4.5.1.2)。<br />

或 CUDA<br />

南 Version


中<br />

(-use_fast_math)<br />

取<br />

值<br />

表<br />

中<br />

<br />

<br />

<br />

<br />

只 维 不 寻<br />

4.4 设 备 运 行 时 组 件<br />

0 式 单 一 : 越 界 的 纹 理 访 问 将 返 回 模 址<br />

。<br />

线 性 内 存 中 分 配 的 的 纹 理 : 度 只 能 等 于 1; 支 持 纹 理 过 滤 ; 在<br />

使 用 非 归 一 化 整 纹 理 坐 标 寻 址 ; 硬 件 在 纹 理 基 址 上 强 制 执 行 内 存 对 齐 。 为 内 存 对 齐 进 行 抽 象 以 便 程 序 员 更 易 使 用 , 负 责 将 纹 能<br />

参 考 绑 定 到 设 备 内 存 函 数 会 回 传 一 个 字 节 偏 移 量 , 该 偏 移 量 被 应 用 到 纹 理 拾 取 。 的 分 配 例 程 返 回 的 基 指 针 符 合 此 对 齐 约 束 , 因 此 将 已 分 配 的 指 针 传 递 到 理<br />

4.4.1 数 学 函 数<br />

CUDA<br />

cudaBindTexture()/cuTexRefSetAddress(), 应 用 程 序 可 以 完 全 避 免 再 设 置 偏 移 。 由<br />

备 运 行 时 组 件 只 能 在 设 备 函 数 中 使 用 。 设<br />

4.4.2 同 步 函 数<br />

界 。 差<br />

来 例<br />

__syncthreads() 用<br />

步 块 中 所 有 的 线 程 。 当 所 有 线 程 都 达 到 此 同 步 点 后 , 才 继 续 执 行 后 续 代 码 。 同<br />

B-1 表 于 对<br />

的 一 些 函 数 , 设 备 运 行 时 组 件 提 供 了 一 些 精 度 略 低 但 运 行 较 快 的 版 本 ; 这 些 函 数<br />

译 器 用 一 个 选 项 本 ( 如 果 存 在 的 话 )。 编<br />

强 制 将 每 个 函 数 编 译 为 其 精 度 略 低 但 运 行 较 快 的 版<br />

有 相 同 的 名 称 , 但 加 了 前 辍 __( 具<br />

如 __sin(x))。<br />

B-2<br />

列 出 这 些 内 部 函 数 及 其 各 自 的 误<br />

__syncthreads() 允<br />

4.4.3 类 型 转 换 函 数<br />

协 调 同 一 块 内 的 线 程 间 通 信 。 当 块 中 的 一 些 线 程 访 问 共 享 或 全 局 内 存 中 的 同 一 地 址 时 , 对 于 其 中 的 一 些 内 存 访 问 存 在 潜 在 的 读 后 写 、 写 后 读 或 写 后 写 的 危 害 。 这 些 危 害 可 以 通 过 同 步 这 些 访 问 之 间 的 线 程 来 避 免 。 于<br />

出 现 在 条 件 代 码 中 , 但 仅 当 条 件 在 整 个 线 程 块 中 求 值 相 同 时 才 适 用 , 否 则 代 码 执 行 可 能 暂 挂 或 产 生 非 预 期 的 结 果 。 许<br />

rn 整 为 最 近 的 偶 数 , 取<br />

rz 向<br />

ru 向<br />

26<br />

CUDA 编<br />

1.1<br />

rd 向<br />

, 上 正 ), 下 取 整 ( 到 负 无 穷 大 )。 零<br />

Version 南 指 程<br />

IEEE-754 函 数 后 缀 用 于 指 定 列 下<br />

模 式 : 整


程 指<br />

用 指 定 的 取 整 模 式 将 浮 点 参 数 转 换 为 整 数 。 使<br />

系<br />

__float_as_int(1.0f) 等 如<br />

4.4.4 类 型 强 制 函 数<br />

浮 点 无 符 号 整 数 。<br />

整 数 参 数 转 换 为 浮 点 数 。<br />

用 指 定 的 取 整 模 式 将 无 符 号 整 数 参 数 转 换 为 浮 点 数 。 使<br />

,__int_as_float(0xC0000000) 等<br />

4.4.5 纹 理 函 数<br />

4.4.5.1 从 设 备 内 存 取 纹 理<br />

对 整 数 参 数 执 行 浮 点 类 型 转 换 , 保 留 值 不 变 。 例 如<br />

于 -2。<br />

浮 点 参 数 执 行 整 数 类 型 转 换 , 保 留 值 不 变 。 例<br />

0x3f800000。<br />

对<br />

于<br />

tex1Dfetch() 备 内 存 取 纹 理 时 , 使 用 设 从<br />

函 数 访 问 纹 理 ; 例 如 : 列<br />

CUDA 编<br />

1.1 27<br />

南 Version


对<br />

元<br />

拾 和<br />

仅 Functions)<br />

(Atomic<br />

,<br />

位<br />

:<br />

位<br />

元<br />

的<br />

位<br />

。<br />

或<br />

的<br />

和<br />

以<br />

改<br />

写<br />

数<br />

列<br />

为 32<br />

,atomicAdd() 在<br />

4.4.5.2 从 CUDA 数 组 取 纹 理<br />

浮 点 数 。 位<br />

x 函 数 使 用 纹 理 坐 标 些 这<br />

性 内 存 区 域 进 行 纹 理 拾 取 操 作 , 然 后 绑 定 到 纹 理 参 考 texRef。 线<br />

这 些 方 法 不 支 持 任 何 纹 理 过 滤 和 寻 址 模 式 。 对 于 整 数 类 型 , 这 些 函 数 可 以 有 选 择 地 将 整 数 转 对<br />

2 述 函 数 之 外 , 还 支 持 上 除<br />

4 和 组<br />

; 例 如 : 组<br />

数<br />

tex1D() 用<br />

访<br />

组 取 纹 理 时 , 使<br />

x 纹 理 坐 标 用 使<br />

绑 定 到 纹 理 参<br />

性 内 存 进 行 纹 理 拾 取 操 作 。 线<br />

考 texRef<br />

纹 理 : 问<br />

从 CUDA<br />

4.4.6 原 子 函 数<br />

tex2D()<br />

原 子 函 数<br />

x 函 数 使 用 纹 理 坐 标 些 这<br />

y<br />

考 texRef<br />

CUDA<br />

取 绑 定 到 纹 理 参<br />

。 纹 理 参 考 的 不 变 属 组<br />

了 这 些 设 备 。 出<br />

4.3.4.1 纹 理 拾 取 传 递 的 返 回 值 ( 参 见 及 以<br />

4.3.4.2)。<br />

性 ( 编 译 时 ) 和 可 变 属 性 ( 运 行 时 ) 的 组 合 确 定 如 何 解 释 坐 标 、 在 纹 理 拾 取 期 间 执 行 何 种 处 理 、<br />

4.5 宿 主 运 行 时 组 件<br />

子 操 作 。 例 如 字 为 其 加 上 一 个 整 数 , 然 后 将 结 果 写 回 同 一 地 址 。 在 保 证 执 行 时 不 受 其 它 线 程 干 扰 这 种 意 义 上 , 此 操 作 是 原 子 的 。 换 句 话 说 , 只 有 此 操 作 完 成 之 后 , 其 它 线 程 才 可 以 访 问 此 地 址 。 原<br />

28<br />

设<br />

主 运 行 时 组 件 只 能 由 宿 主 函 数 使 用 它 提 供 函 数 来 处 理 备 管 理 宿<br />

CUDA 编<br />

1.1<br />

1.1 算 能 力 计 在<br />

C 设 备 中 可 用 。 附 录 的 上<br />

32 函 数 在 驻 留 于 全 局 内 存 中 的 一 个 子 原<br />

- 执 行 读 上 字<br />

-<br />

32 内 存 中 的 某 地 址 上 读 取 一 个 局 全<br />

32 操 作 仅 适 用 于 子 原<br />

符 号 和 无 符 号 整 数 。 有<br />

Version 南 指 程


程 指<br />

与<br />

组<br />

驱<br />

运<br />

,CUDA 驱<br />

配<br />

都<br />

中<br />

,<br />

的 和<br />

生<br />

对<br />

位<br />

的<br />

需<br />

的<br />

宿<br />

资<br />

。<br />

在<br />

驱<br />

(linear 或 memory)<br />

。<br />

数<br />

或<br />

或<br />

位<br />

、16- 位<br />

API 之 序<br />

上 实 现 )。<br />

(CUDA<br />

。CUDA<br />

arrays)。<br />

数<br />

支<br />

位<br />

驱<br />

驱<br />

<br />

<br />

<br />

<br />

代 上<br />

<br />

内<br />

纹 执<br />

<br />

下 文 管 理<br />

管 理 , 存<br />

名<br />

名<br />

模 块 管 理 , 码<br />

互 操 作 性<br />

动 程<br />

控 制 , 理 参 考 管 理 , 行<br />

行 成<br />

CUDA 运<br />

。CUDA<br />

OpenGL<br />

Direct3D<br />

CUDA 运<br />

API 两 套 由 它<br />

:<br />

为 CUDA<br />

API 序 程 动<br />

层 API, 低<br />

应<br />

为 CUDA<br />

时 API<br />

层 API( 高<br />

CUDA<br />

用 程 序 应 该 仅 选 择 其 中 之 一 使 用<br />

于 这 两 套 API, 对<br />

时 通 过 提 供 隐 式 初 始 化 、 上 下 文 管 理 和 模 块 管 理 使 得 设 备 代 码 管 理 变 得 容 易 因 行<br />

所<br />

ncvv 时 还 负 责 通 过 行 运<br />

成 C<br />

代 码 ( 参 见 4.2.5), 主<br />

此 链 接 到 此 代 码 的 应 用 程 序 必 须 使 用<br />

CUDA 驱<br />

通<br />

动<br />

CUDA 运<br />

通<br />

动<br />

时 API。 行<br />

相 反<br />

API 序 程 动<br />

要 更 多 的 代 码 , 更 难 于 编 程 和 调 试 , 但 是 它 提 供 较 高 级 的 控 制 ,<br />

4.5.1 常 用 概 念<br />

不<br />

cubin 因 为 它 仅 处 理 且 而<br />

( 参 见 4.2.5), 象<br />

CUDA 独 立 于 语 言 的 。 特 别 地 , 使 用 是 以<br />

动 程<br />

序 API<br />

置 和 启 动 内 核 比 较 困 难 , 因 为 执 行 配 置 和 内 核 参 数 必 须 使 用 显 式 函 数 调 用 来 指 定 , 而<br />

4.2.3 使 用 是 不<br />

述 的 执 行 配 置 语 法 来 指 定 。 另 外 , 设 备 仿 真 ( 参 见 4.5.2.7) 所<br />

CUDA 用 使<br />

程 序 API。 动<br />

4.5.1.1 设 备<br />

API 序 程 动<br />

过 cuda<br />

库 提 供 , 并 且 它 们 所 有 的 入 口 点 都 带 有 前 缀 cu。 态<br />

API 时 行<br />

过 cudart<br />

库 提 供 , 并 且 它 们 所 有 的 入 口 点 都 带 有 前 缀 cuda。 态<br />

API 参<br />

参<br />

4.5.1.2 内 存<br />

多 个 宿 主 线 程 可 以 在 同 一 设 备 上 执 行 设 备 代 码 , 但 在 设 计 层 面 , 一 个 宿 主 线 程 只 能 在 设 备 上 执 行 设 备 代 码 。 因 此 , 在 多 个 设 备 上 执 行 设 备 代 码 需 要 多 个 宿 主 线 程 。 另 外 , 通 过 一 个 宿 主 驱<br />

程 中 的 运 行 时 创 建 的 任 源 不 能 由 其 它 宿 主 线 程 中 的 运 行 时 使 用 。 线<br />

备 可 以 分 配 为 线 性 内 存 组 线 性 内 存 在 设 备 上 地 址 空 间 存 在 , 因 此 单 独 分 配 的 单 元 可 以 通 过 指 针 互 相 引 用 , 二 叉 树 设<br />

以 32<br />

API 种 两<br />

提 供 函 数 来 枚 举 系 统 上 可 用 的 设 备 、 查 询 其 属 性 并 选 择 其 中 之 一 执 行 内 核 ( 运 行 时<br />

见 4.5.2.2,<br />

CUDA 编<br />

1.1 29<br />

数 整<br />

API 序 程 动<br />

见 4.5.3.2)。<br />

CUDA 数<br />

个<br />

。CUDA<br />

组 织 成 一 由 组<br />

何 CUDA<br />

一 个 典 型 例 子 。 是<br />

CUDA<br />

南 Version<br />

号<br />

分 量 , 这 些 组 件 可 以 是 有 符 号 或 无 符 浮 点 数 ( 当 前 仅 通 过 驱 动 程 持 ) 浮 点 数 而<br />

1、2 二 维 数 组 的 若 干 元 素 组 成 , 每 个 元 素 具 有 或 维<br />

为 纹 理 拾 取 ( 参 见 4.3.4) 组<br />

优 化 , 其 内 存 布 局 是 非 透 明 的<br />

或 32-<br />

的 8、16<br />

4<br />

32-<br />

序 API


完<br />

完<br />

适<br />

还<br />

数<br />

(buffer<br />

参<br />

和<br />

除<br />

,CUDA 上<br />

使<br />

,4.5.3.10 一<br />

(vertex<br />

,4.5.2.8 一<br />

设<br />

使<br />

标<br />

。<br />

和<br />

完<br />

完<br />

创<br />

参 和<br />

。4.5.2.7<br />

。4.5.2.8<br />

所<br />

和 分<br />

设<br />

程 指<br />

终<br />

数 组 只 能 由 内 核 通 过 纹 理 拾 取 来 读 取 , 且 只 能 绑 定 到 分 量 数 一 致 的 纹 理 参 考<br />

。<br />

4.5.1.3 OpenGL 互 操 作 性<br />

页 定 内 存 的 一 个 优 点 是 如 果 宿 主 内 存 被 分 配 为 页 面 锁 定 , 则 宿 主 内 存 和 设 备 内 存 之 间 的 带 宽 较 高 驱<br />

CUDA 内 存 和 性 线<br />

4.5.2.3 可 由 宿 主 通 过 内 存 复 制 函 数 ( 如 都 组<br />

4.5.3.6<br />

) 读 取 和 写 入 。 述<br />

仅 用 于 由 分 配 该 宿 主 内 存 的 宿 主 线 程 执 行 的 数 据 传 送 )。 但 是 , 页 面 锁 定 内 存 是 稀 有 资 源 , 所 以 早 在 可 分 页 内 存 的 分 配 之 前 , 页 面 锁 定 内 存 的 分 配 可 能 失 败 。 此 外 , 分 配 太 多 的 页 面 锁 定 内 存 会 减 少 可 用 于 操 作 系 统 分 页 的 物 理 内 存 量 , 所 以 这 将 降 低 整 体 系 统 性 能 。 (<br />

读 的<br />

OpenGL 缓<br />

OpenGL 写<br />

可 写<br />

object)<br />

读<br />

一<br />

malloc() 运 行 时 还 提 供 了 函 数 用 于 分 配 和 释 放 页 面 锁 定 的 宿 主 内 存 , 这 与 通 过 主 宿<br />

配 的 可<br />

API 宿 主 内 存 相 反 ( 运 行 时 页 分<br />

见 D.5.6<br />

D.5.7,<br />

API 序 程 动<br />

见 E.8.5<br />

E.8.6)。<br />

面 锁<br />

4.5.1.4 Direct3D 互 操 作 性<br />

Direct3D 9.0 顶<br />

Direct3D 写<br />

可 写<br />

buffer)<br />

读<br />

的<br />

一<br />

读<br />

冲 对 象<br />

CUDA 射 到 映 以<br />

CUDA 空 间 中 , 从 而 允 许 址 地<br />

取 由<br />

CUDA 数 据 , 或 允 许 的 入<br />

OpenGL 供 入<br />

取 的 数 据<br />

节 描 述 如 何 使 用 运<br />

API 时 行<br />

成 此 操 作<br />

API 述 如 何 使 用 驱 动 程 序 描 节<br />

此 操 作 。 成<br />

和<br />

点 缓 冲<br />

CUDA 射 到 映 以<br />

CUDA 空 间 , 从 而 允 许 址 地<br />

取 由<br />

CUDA 上<br />

设<br />

上<br />

设<br />

CUDA 数 据 , 或 允 许 的 入<br />

Direct3D 供 入<br />

取 的 数 据<br />

节 描 述 如 何 使 用 运<br />

API 时 行<br />

成 此 操 作<br />

API 述 如 何 使 用 驱 动 程 序 描 节<br />

此 操 作 。 成<br />

参<br />

参<br />

在 同 一 时 刻<br />

Direct3D 仅 能 与 一 个 文 下<br />

/ 操 作 , 通 过 调 用 带 括 号 的 初 始 化 止 互 备<br />

<br />

目<br />

除<br />

9.0 之<br />

支 持 : , 顶 点 缓 冲 之 外 对 象 不<br />

之 和<br />

Direct3D 当<br />

还<br />

间 的 负 载 均 衡 优 先 于 互 操 作 性 时<br />

D.9.7),<br />

备 。<br />

,cuda3D9GetDevice()<br />

见<br />

。<br />

(begin/end) 函<br />

前 CUDA<br />

4.5.2.8 现 , 详 见 实 数<br />

4.5.3.11。<br />

Direct3D 和 文 下<br />

GPU 须 在 同 一 必 备<br />

CUDA 。 这 可 以 通 过 查 询 与 建 创<br />

的 Direct3D<br />

API 来 确 保 这 一 点 , 对 于 运 行 时 器 配<br />

用 cudaD3D9GetDevice()(<br />

备 相 对 应<br />

API 驱 动 程 序 于 对<br />

用 cuD3D9GetDevice()(<br />

见 E.11.7)。<br />

D3DCREATE_HARDWARE_VERTEXPROCESSING 使 用 须 必<br />

Direct3D 创 建 来 记<br />

顺 便 提 一 句 ,<br />

或 cuD3D9GetDevice()<br />

Direct3D<br />

外 的 版 本<br />

30<br />

CUDA 编<br />

1.1<br />

的 Direct3D<br />

CUDA<br />

Direct3D 用 于 确 保 以 可<br />

CUDA<br />

建 在 不 同 的 设 备 上<br />

南 Version


程 指<br />

设<br />

。4.5.2.4 描<br />

管 或<br />

限<br />

为<br />

。<br />

的<br />

完<br />

完<br />

,4.5.3.7 介 设<br />

的<br />

的<br />

和<br />

(events),<br />

。4.5.2.5 描<br />

数<br />

和<br />

数<br />

完<br />

完<br />

的<br />

4.5.1.5 异 步 并 发 执 行<br />

内<br />

执<br />

执<br />

设<br />

了 方 便 宿 主 和 设 备 之 间 的 并 发 执 行 , 一 些 运 行 时 函 数 是 异 步 的 : 在 设 备 完 成 请 求 的 任 务 之 前 , 控 制 就 会 返 回 到 应 用 程 序 。 这 些 函 数 包 括 : 为<br />

内 存 的 函 数 。 一 些 设 备 还 可 以 在 页 面 锁 定 宿 主 内 存 和 设 备 内 存 之 间 执 行 复 制 的 同 时 , 并 发 执 行 内 核 函 数 。 应 置<br />

cuDeviceGetAttribute() 来<br />

于 cudaMallocPitch()<br />

核 里 加<br />

了 __global__<br />

定 符 的 函 数<br />

或 cuGridLaunch()<br />

cuGridLaunchAsync();<br />

Async 存 复 制 并 以 内 行<br />

缀 的 函 数 ; 后<br />

参<br />

分 对<br />

操 作 。 此<br />

↔ 备 设 行<br />

内 存 复 制 的 函 数 ; 备<br />

的 流 之 间 可 以 不 按 顺 序 执 行 操 作 。 同<br />

用 程 序 可 以 通 过 使<br />

用 CU_DEVICE_ATTRIBUTE_GPU_OVERLAP<br />

用<br />

询 此 功 能 ( 请 分 别 参 见 E.2.6)。 查<br />

调<br />

复 制 还 不 能 实 现 与 内 核 函 数 的 并 发 执 行 。 存<br />

参 见 4.5.2.3) (<br />

cuMemAllocPitch()(<br />

见 4.5.3.6)<br />

CUDA 的 配<br />

2D 或 组<br />

组 , 其 内<br />

(streams) 程 序 通 过 流 用 应<br />

理 并 发 。 流 是 一 个 顺 序 执 行 的 操 作 序 列 。 另 一 方 面 , 在 同 一 时 刻 , 不<br />

都 不 能 开 始 。 运 行 的 和 也<br />

cudaStreamSynchronize() 和 和 可<br />

E.5.2<br />

提<br />

见 D.3.2<br />

于 任 何 内 核 启 动 、 内 存 设 置 或 内 存 复 制 , 如 果 其 流 参 数 被 指 定 为 零 , 则 仅 当 其 所 有 先 前 的 操 作 ( 包 括 属 于 流 部 分 的 操 作 ) 完 成 之 后 , 该 操 作 才 能 开 始 , 而 且 在 它 完 成 之 前 , 任 何 后 续 操 作 对<br />

↔ 创 建 流 对 象 , 并 将 一 个 序 列 的 内 核 启 动 和 宿 主 过 通<br />

备 内 存 复 制 的 流 参 数 设 给 此 对 象 , 可 以<br />

定 义 流<br />

API 何 使 用 运 行 时 如 述<br />

成 此 操 作<br />

API 何 使 用 驱 动 程 序 如 绍<br />

成<br />

分 别 参 以 检 测 流 中 所 有 先 前 的 操 作 是 否 已 经 完 成 。 运 行 请<br />

的<br />

和<br />

时 API<br />

驱 动 程<br />

cudaStreamQuery()<br />

API 程 序 动 驱<br />

cuStreamQuery()(<br />

供 了 一 种 方 法 , 来 显 式 地 强 制 运 行 时 在 流 中 所 有 先 前 的 操 作 完 成 之 前 等 待 。 驱 动 程 请<br />

和 E.5.2)<br />

时 API<br />

E.3.5),<br />

序 API<br />

cuStreamSynchronize()(<br />

分 别 参 见<br />

E.5.3)<br />

CUDA 编<br />

1.1 31<br />

用 程 序 可 以 强 制 运 行 时 在 所 有 先 前 的<br />

时 API<br />

cudaThreadSynchronize()<br />

败 的 启 动 或 内 存 复 制<br />

4.5.3.8<br />

失<br />

描<br />

序 API<br />

样 地 , 使 用 运 行<br />

cuCtxSynchronize()( 请 设 备 任 务 完 成 之 前 等 待 。 为 了 避 免 不 必 要 的 速 度 降 低 , 这 些 函 数 最 适 合 用 于 计 时 , 或 用 于 隔 离 同<br />

D.2.1 参 见 别 分<br />

应<br />

并<br />

API 何 使 用 驱 动 程 序 如 述<br />

此 操 作 。 成<br />

让 应 用 程 序 异 步 地 记 录 程 序 中 任 何 点 的 事 件 查 询 这 些 事 件 被 记 录 的 时 间 , 运 行 时 还 提 供 了 一 种 方 法 来 密 切 监 控 设 备 的 进 度 并 执 行 确 准 的 计 时 。 当 事 件 之 前 的 所 有 任 务 ( 或 者 为<br />

给 定 流 中 的 所 有 操 作 ) 都 已 完 成 时 , 记 录 此 事 件<br />

API 何 使 用 运 行 时 如 述<br />

成 此 操 作 ,<br />

南 Version


中<br />

设<br />

cudaSetDevice()<br />

。<br />

用<br />

。 存<br />

中<br />

环<br />

或<br />

和<br />

个<br />

的<br />

有 CUDA<br />

时 API<br />

用 cudaSetDevice()<br />

4.5.2 运 行 时 API<br />

4.5.2.1 初 始 化<br />

列 任 意 两 个 来 自 不 同 流 的 操 作 不 能 并 发 执 行 : 页 面 锁 定 宿 主 内 存 分 配 、 设 备 内 存 分 配 、 设 下 程 序 将 全 被 禁 止 异 步 执 行 。 此 功 能 只 提 供 用 于 调 试 目 的 , 为 让 软 件 产 品 可 靠 运 行 , 绝 不 要 使 用 此 功 能 。 应<br />

↔ 存 设 置 、 设 备 内 备<br />

内 存 复 制 或 它 们 之 间 的 事 件 记 录 。 备<br />

CUDA_LAUNCH_BLOCKING 程 人 员 将 编 在<br />

1 量 设 置 为 变 境<br />

情 况 下 , 系 统 上 运 行 的 所<br />

4.5.2.2 设 备 管 理<br />

运 行 时 函 数 计 时 时 , 以 及 将 第 一 次 调 用 的 错 误 代 码 解 释 到 运 行 时 中 时 , 有 必 要 紧 记 运 行 的 初 始 化 方 式 。 对<br />

cudaGetDeviceCount()<br />

索 其 属 性 的 方 法 检<br />

提<br />

API 时 行 运<br />

API 何 显 式 初 始 化 函 数 ; 第 一 次 调 用 运 行 时 函 数 时 , 运 行 时 任 有<br />

被 初 始 化 。 当<br />

没<br />

即<br />

D.1 节 章<br />

函 数 用 于 管 理 系 统 中 的 设 备 。 的<br />

cudaGetDeviceProperties()<br />

供 一 种 用 来 枚 举 这 些 设 备 并<br />

4.5.2.3 内 存 管 理<br />

选 择 与 宿 主 线 程 相 关 设 备 : 在 调 用 任 的 函 数 之 前 必 须 选 择 一 个 设 备 。 如 果 不 执 行 显 式 来<br />

序 将 自 动 选 择 设 备 0, 且 任 何 后 期 的 显 式 调 程<br />

的 函 数 用 于 分 配 和 释 放 设 备 内 存 、 访 问 在 全 局 内 存 空 间 中 声 明 的 变 量 被 分 配 的 内 存 、<br />

32<br />

CUDA 编<br />

1.1<br />

D 任 何 附 录 或 数<br />

用 cudaSetDevice(), 调<br />

分<br />

释<br />

__global__ 函 何<br />

中<br />

D.5 节 章<br />

不 起 作 用 。 将<br />

在 宿 主 和 设 备 内 存 之 间 传 送 数 据 。 和<br />

256 代 码 示 例 在 线 性 内 存 中 分 配 了 包 含 列 下<br />

点 数 元 素 的 数 组 : 浮<br />

Version 南 指 程<br />

cudaMalloc() 用 使<br />

cudaMallocPitch()<br />

cudaFree() 性 内 存 , 使 用 线 配<br />

放 线 性 内


程 指<br />

中<br />

进<br />

函<br />

中 循 环 遍 历 数 组 元 素 : 码<br />

、CUDA<br />

各 种 函 数 数<br />

数<br />

获 得 。 来<br />

数<br />

分<br />

数<br />

的<br />

即 数<br />

(pitch,<br />

组 : 数<br />

:。<br />

分<br />

行 释 放 。<br />

组 的 分 配 , 该 分 配 方 式 会 对 空 间 进 行 适 当 填 补 以 满<br />

cudaMallocPitch() 使 用 议 建<br />

组 和 其 它 设 备 内 存 区 域 执 行 复<br />

行 2D<br />

足 5.1.2.1<br />

描 述 的 对 齐 要 求 , 从 而 确 保 在 访 问 行 地 址 时 或<br />

在 2D<br />

制 ( 使 用 cudaMemcpy2D()<br />

数 ) 时 获 得 最 佳 性 能 。 返 回 的 节 距<br />

跨 度 ) 必 须 用 于 访<br />

width×height 组 元 素 。 下 列 代 码 示 例 分 配 浮 点 数 值 的 数 问<br />

2D<br />

组 , 并 显 示 如 何 在 设 备 代<br />

CUDA 数<br />

cudaMallocArray() 的<br />

32- 位 个<br />

行 分 配 , 使 进<br />

建 进<br />

组 创<br />

CUDA 数<br />

下 列 代 码 示 例 分 配 一<br />

cudaGetSymbolAddress() 用<br />

cudaMallocArray() 用 使 组<br />

用 cudaFreeArray()<br />

D.5<br />

线 性 内 存 一<br />

cudaCreateChannelDesc() 描 述 由 式 格<br />

提 取 指 向 为 全 局 内 存 空 间 中 声 明 的 变 量 分 配 的 地 址 。 已 分 配 配 的 于<br />

width×height 数 元 素 的 点 浮<br />

。<br />

cudaGetSymbolSize() 的 大 小 通 过 存 内<br />

组 和 为 全 局 或 常 量 内 存 空 间 中 声 明 的 变 量 分 配 的 内 存 之 间 复 制 内 存 的 所 有<br />

2D 代 码 示 例 将 列 下<br />

CUDA 编<br />

1.1<br />

下 列 代 码 示 例 将 一 些 宿 主 内 存 数 组 复 制 到 设 备 内 存 中 :<br />

33<br />

节 列 出 用 于 在 使<br />

用 cudaMalloc()<br />

cudaMallocPitch() 线 性 内 存 、 使 用 的 配<br />

CUDA 制 到 在 上 一 代 码 示 例 中 分 配 的 复 组<br />

南 Version


: 。<br />

列 代 码 示 例 定 义 了 对 这 两 个 流 的 一 系 列 操 作 : 一 个 从 宿 主 到 设 备 的 内 存 复 制 、 一 个 内 核 启 动 和 一 个 从 设 备 到 宿 主 的 内 存 复 制 : 下<br />

允<br />

cudaThreadSynchronize() 以 用<br />

些 事 件 可 以 对 上 一 节 的 代 码 示 例 进 行 计 时 : 这<br />

:<br />

列 代 码 示 例 将 一 些 宿 主 内 存 数 组 复 制 到 常 量 内 存 中<br />

4.5.2.4 流 管 理<br />

下<br />

流 管 理<br />

D.3 节 中 的 函 数 用 于 创 建 和 销 毁 流 , 并 确 定 流 的 所 有 操 作 是 否 已 经 完 成 下 列 代 码 示 例 创 建 两 个 流 一<br />

myKernel() 处<br />

重<br />

到 hostPtr<br />

hostPtr 必<br />

指 页 锁 的 主 存 , 才 能 证 时 间 上 的 重 叠 : 须<br />

4.5.2.5<br />

向<br />

事<br />

面<br />

件<br />

定<br />

管<br />

宿<br />

理<br />

内<br />

下 一 步 处 理 之 前 所 有 流 都 已 完 成 。 在 保 确 调 后 最<br />

事 件 管 理<br />

hostPtr 流 将 其 部 分 输 入 数 组 个 每<br />

inputDevPtr 设 备 内 存 中 的 数 组 到 制<br />

, 调 用<br />

并<br />

设 备 上 的 inputDevPtr, 理<br />

outputDevPtr 果 结 将<br />

新 复 制 回<br />

复<br />

中<br />

hostPtr 应 部 分 。 使 用 两 个 流 处 理 相 的<br />

许 一 个 流 的 内 存 复 制 与 另 一 个 流 的 内 核 执 行 同 时 发 生 。<br />

D.4 节 中 的 函 数 用 于 创 建 、 记 录 和 销 毁 事 件 , 并 查 询 两 个 事 件 之 间 用 去 的 时 间 。 下 列 代 码 示 例 创 建 两 个 事 件 : 一<br />

34<br />

CUDA 编<br />

1.1<br />

Version 南 指 程


程 指<br />

定<br />

是<br />

类<br />

的<br />

的<br />

或<br />

定<br />

中<br />

或<br />

;channelDesc 具<br />

类<br />

;cudaFilterModeLinear 仅<br />

;addressMode<br />

寻<br />

寻<br />

4.5.2.6 纹 理 参 考 管 理<br />

D.6 一<br />

节 的 函 数 用 于 管 理 纹 理 参 考<br />

。<br />

型 中 公<br />

派 生 出 来 的 结 构 , 如 下 所 示<br />

normalized<br />

共<br />

指<br />

而<br />

:<br />

中 width<br />

API 层 高 由<br />

texture 的 义<br />

API 一 种 从 由 低 层 是 型<br />

filterMode 指<br />

filterMode 等<br />

textureReference 的 义<br />

和 height<br />

纹 理 坐 标 是 否 是 归 一 化 的 ; 如 果 其 值 非 0, 则 纹 理 中 的 所 有 元 素 都 使 用 纹 理 大 小 ; 定<br />

纹 理 ) 或 四 个 ( 对 于 二 维 纹 理 ) 纹 理 元 素 的 线 性 插 值 返 回 浮 点 类 型 值 时 有 效 ; 维<br />

在<br />

[0,1] 间 区<br />

[0,width-1] 间 区 非<br />

[0,height-1]<br />

的 纹 理 坐 标 来 寻 址 , 其<br />

addressMode 指<br />

2 的<br />

过 滤 模 式 , 即 当 拾 取 纹 理 时 , 如 何 基 于 输 入 纹 理 坐 标 来 计 算 返 回 的 值 ; 如 则 定<br />

寻 址 模 式 , 即 如 何 处 理 超 出 范 围 的 纹 理 坐 标 是 大 小 为 定<br />

于 cudaFilterModePoint<br />

cudaFilterModeLinear;<br />

果 它 为<br />

数 组 , 其 第 一 个 和 第 二 个 元 素 分 别 指 定 第 一 个 和 第 二 个 纹 理 坐 标 的 寻 址 模 式 ; 在 寻 址 模<br />

则 返 回 值 是 纹 理 坐 标 最 接 近 输 入 纹 理 坐 标 的 纹 理 元 素 ; 如 果 它<br />

cudaFilterModePoint,<br />

为 cudaFilterModeLinear,<br />

返 回 值 是 纹 理 坐 标 最 接 近 输 入 纹 理 坐 标 的 两 个 ( 对 于 一<br />

cudaAddressModeWrap 支 持 归 一 化 的 纹 理 坐 标 ; 仅<br />

CUDA 编<br />

1.1<br />

述 拾 取 纹 理 时 返 回 值 的 格 式 有 下 列 类 型 :<br />

35<br />

channelDesc 描<br />

于 cudaAddressModeWrap<br />

wrap 下 , 超 出 范 围 的 纹 理 坐 标 将 使 用 况 情<br />

址 ;<br />

cudaAddressModeClamp 于 等 式<br />

clamp 下 , 超 出 范 围 的 纹 理 坐 标 将 使 用 况 情<br />

址 , 等<br />

南 Version


等<br />

cudaChannelFormatKindSigned, <br />

cudaChannelFormatKindUnsigned, <br />

cudaChannelFormatKindFloat, 如 如<br />

将 或 数<br />

cudaUnbindTexture() 用 。<br />

中<br />

指<br />

数<br />

取 : 可<br />

完<br />

,x、y、z 和<br />

normalized、addressMode 和<br />

可<br />

其 中<br />

w<br />

f 回 值 的 每 个 分 量 值 , 以 位 为 单 位 , 枚 举 值 返 于<br />

有 符 号 整 数 类 型 果 这 些 分 量 为 无 符 号 整 数 类 型 果 这 些 分 量 为 浮 点 数 类 型 的 纹 理 参 考 。 组<br />

, 。 ,<br />

直 接 在 宿 主 代 码 中 修 改 。 它 们 仅 适 用 于 绑 纹 理 参 考 绑 定 到 纹 理 之 以<br />

后 , 内 核 才 可 以 使 用 纹 理 参 考 从 纹 理 内 存 中 读 取 数 据 。<br />

使<br />

filterMode<br />

CUDA 到 定<br />

cudaBindTexture() 使 用 须 必<br />

使<br />

用 低<br />

cudaBindTextureToArray()<br />

层 API:<br />

devPtr 代 码 示 例 将 纹 理 参 考 绑 定 到 列 下<br />

的 线 性 内 存 : 向<br />

使<br />

CUDA 代 码 示 例 将 纹 理 参 考 绑 定 到 一 个 下 以<br />

组 cuArray:<br />

使<br />

高 层 API: 用<br />

低 层 API: 用<br />

4.5.2.7 OpenGL 互 操 作 性<br />

纹 理 绑 定 到 纹 理 参 考 时 指 定 的 格 式 必 须 与 声 明 纹 理 参 考 时 指 定 的 参 数 相 匹 配 ; 否 则 , 纹 理 拾 取 会 导 致 不 确 定 的 结 果 于 解 除 对 纹 理 参 考 的 绑 定 。 将<br />

D.8 一<br />

的<br />

36<br />

作 : 操<br />

CUDA 编<br />

1.1<br />

高 层 API: 用<br />

CUDA 射 的 缓 冲 对 象 必 须 先 在 映 被<br />

cudaGLRegisterBufferObject() 。 使 用 册 注<br />

成 此<br />

Version 南 指 程<br />

OpenGL 的 函 数 用 于 控 制 与 中 节<br />

操 作 性 。 互


程 指<br />

解<br />

的<br />

返<br />

cudaGLUnregisterBufferObject() 用<br />

终 。 初<br />

返<br />

解<br />

在<br />

选<br />

运<br />

的<br />

4.5.2.8 Direct3D 互 操 作 性<br />

对 象 : 冲<br />

解 除 注 册 。 使<br />

除 映 射 , 使<br />

cudaGLMapBufferObject() 之 后 , 内 核 可 以 使 用 由 册 注<br />

D.9 一<br />

的<br />

用 cudaGLUnmapBufferObject()<br />

回 的 设 备 内 存 地 址 读 取 或 写 入 缓<br />

止<br />

cudaD3D9RegisterVertexBuffer() 来<br />

。<br />

互 操 作 性<br />

CUDA 些 调 用 之 间 , 顶 点 对 象 必 须 注 册 到 这 在<br />

Direct3D 的 函 数 用 于 控 制 与 中 节<br />

用 cudaD3D9End()<br />

与 Direct3D<br />

cudaD3D9Begin() 作 性 必 须 使 用 操 互<br />

始 化 , 使<br />

成 : 完<br />

后 才 能 被 映 射 。 此 操 作 使 用 之<br />

的 设 备 内 存 地 址 读 取 或 写 入 回<br />

cudaD3D9UnregisterVertexBuffer() 解<br />

点 缓 冲 : 顶<br />

映 射 , 使 用 除 注 册 。 除<br />

cudaD3D9UnmapVertexBuffer()<br />

4.5.2.9 使 用 设 备 仿 真 模 式 调 试<br />

用 使 用 设 备 仿 真 模 式 调 试<br />

cudaD3D9MapVertexBuffer() 之 后 , 内 核 可 以 使 用 由 册 注<br />

式 下 编 译 应 用 程 序 ( 使<br />

用 -deviceemu<br />

程 环 境 不 包 括 对 设 备 代 码 的 任 何 原 生 调 试 支 持 但 提 供 了 用 于 调 试 的 设 备 仿 真 模 式 在 此 模 项 ) 时 , 设 备 代 码 在 宿 主 上 编 译 和 运 行 , 从 而 允 许 程 序 员 使 用 宿 主 的 原 生 调 试 支 持 来 调 试 应 用 程 序 , 就 像 此 应 用 程 序 是 宿 主 应 用 程 序 一 样 。 预 处 理 编<br />

宿<br />

有<br />

CUDA 编<br />

1.1 37<br />

过 使 用 宿 主 的 原 生 调 试 支 持 , 编 程 人 员 可 以 利 用 调 试 器 支 持 的 所 有 功 能 , 比 如 设 置 断 点 和 监 测 数 据 。 :<br />

于 设 备 仿 真 或 设 备 执 行 必 须 一 致 编 译 。 将 为 设 备 仿 真 编 译 的 代 码 与 为 设 备 执 行 编 译 的 代 码 链 在 设 备 仿 真 模 式 下 运 行 应 用 序 时 , 编 程 模 型 由 运 行 时 仿 真 。 对 于 线 程 块 中 的 每 个 线 程 , 运 行 对<br />

都 在 宿 主 上 创 建 一 个 线 程 。 编 程 人 员 必 须 确 保 : 主 能 够 运 行 的 最 少 线 程 数 是 每 个 线 程 块 的 最 大 线 程 数 加 上 一 个 主 线 程 。 时<br />

__DEVICE_EMULATION__ 宏 器<br />

此 模 式 下 被 定 义 。 应 用 程 序 的 所 有 代 码 , 包 括 使 用 的 任 何 库 ,<br />

<br />

仿 真 模 式 提 供 的 许 多 功 能 使 其 成 为 一 个 非 常 有 效 的 调 试 工 具 通 备 设<br />

cudaErrorMixedDeviceExecution 一 起 将 导 致 在 初 始 化 时 返 回 在 接<br />

时 错 误 。 行<br />

256KB 的 内 存 可 用 于 运 行 所 有 线 程 , 已 知 每 个 线 程 需 要 够 足<br />

栈 。 堆<br />

南 Version


(printf())。<br />

等<br />

读 取 ; 同 样 地 , 任 何 设 备 或 宿 主 函 数 可 以 从 设 备 或 宿 主 代 码 中 调 用 。 果 错 误 使 用 了 内 部 同 步 , 则 运 行 时 将 检 测 到 死 锁 情 况 。 上<br />

的<br />

在<br />

以 恢 复 原 始 控 制 字 。 或<br />

计 算 设 备 ( 参 见 附 与<br />

编<br />

和<br />

或<br />

位<br />

上<br />

因<br />

如 到 文 件 或 到 屏 幕 的 输 入 和 输 出 操 作 为 所 有 的 数 据 驻 留 在 宿 主 上 , 所 以 任 何 设 备 或 宿 主 上 专 有 的 数 据 可 以 从 设 备 或 宿 主 代 码 比<br />

因<br />

为 设 备 代 码 编 译 后 在 宿 主 上 运 行 , 所 以 也 可 以 使 用 那 些 原 来 不 能 在 设 备 上 运 行 的 代 码 ,<br />

如<br />

当<br />

当<br />

大<br />

程 人 员 必 须 切 记 , 设 备 仿 真 模 式 是 在 仿 真 设 备 而 非 模 拟 设 备 因 此 , 设 备 仿 真 模 式 在 查 找 算 法 错 误 时 十 分 有 用 , 但 某 些 错 误 难 以 查 找 : 网 格 中 的 多 个 线 程 可 能 同 访 问 某 个 内 存 位 置 时 , 则 在 设 备 仿 真 模 式 下 运 行 的 结 果 可 能 编 设 备 的 结 果 不 同 , 因 为 在 仿 真 模 式 下 , 线 程 顺 序 执 行 。 在 宿 主 上 废 弃 一 个 指 向 全 局 内 存 的 指 针 或 在 上 废 弃 一 个 指 向 宿 主 内 存 的 指 针 时 , 设 备 执 行 几 乎 肯 定 以 一 些 不 确 定 的 方 式 失 败 , 而 设 备 仿 真 则 可 以 生 成 正 确 的 结 果 。 与<br />

数 时 候 , 在 设 备 上 执 行 时 与 在 设 备 仿 真 模 式 下 的 宿 主 上 执 行 时 , 同 一 浮 点 计 算 将 不 会 多<br />

将<br />

成 完 全 相 同 的 结 果 。 这 是 预 期 结 果 , 因 为 一 般 说 来 , 只 需 使 用 略 有 不 同 的 编 译 器 选 项 就 能 让 同 一 浮 点 计 算 获 得 不 同 的 结 果 , 更 不 要 说 不 同 的 编 译 器 、 不 同 的 指 令 集 或 不 同 的 架 构 生<br />

使<br />

使<br />

<br />

C++ 编<br />

上<br />

或<br />

编<br />

。 特 别 地 , 一 些 宿 主 平 台 将 单 精 度 浮 点 计 算 的 中 间 结 果 存 储 在 更 高 精 度 的 寄 存 器 中 , 这 可 能 造 成 与 设 备 仿 真 模 式 下 的 精 度 有 显 著 差 异 。 当 这 种 情 况 发 生 时 , 编 程 人 员 可 以 尝 试 下 列 任 何 方 法 ( 但 不 能 保 证 可 行 ): 了<br />

以<br />

些 浮 点 变 量 声 明 为 volatile, 一<br />

制 单 精 度 存 储 ; 强<br />

用 gcc<br />

-ffloat-store<br />

器 选 项 , 译<br />

Linux<br />

_FPU_GETCW() 用 使<br />

_FPU_SETCW(),<br />

在 Windows<br />

使 用<br />

用 Visual<br />

/Op 的 器 译<br />

/fp<br />

器 选 项 , 译<br />

以 强 制 对 某 段 代 码 进 行 单 精 度 浮 点 计 算 , 方 法 是 在 其 前 后 使 用 指 令<br />

_controlfp(),<br />

在 该 代 码 前 面 添 加 或<br />

24- 储 控 制 字 的 当 前 值 , 并 对 其 进 行 更 改 以 强 制 尾 数 以 存 以<br />

储 , 并 在 结 尾 处 使 用 存<br />

38<br />

CUDA 编<br />

1.1<br />

A) 不 同 , 宿 主 平 台 通 常 还 支 持 非 归 一 化 的 数 值 。 这 可 能 导 致 设 备 仿 真 和 录<br />

Version 南 指 程


程 指<br />

是<br />

中<br />

支<br />

几<br />

几<br />

内<br />

指<br />

描<br />

和<br />

CUDA 上 离<br />

的<br />

进<br />

进<br />

,E.2<br />

4.5.3 驱 动 程 序 API<br />

备 执 行 模 式 之 间 的 结 果 显 著 不 同 , 因 为 一 些 计 算 可 能 在 一 种 情 况 下 生 成 有 限 值 的 结 果 , 而 在 另 一 种 情 况 下 生 成 无 限 值 的 结 果 。 设<br />

CUDA 中<br />

中<br />

相 应 函 数 以 处 理 对 象 。 大<br />

4-1. CUDA 驱 动 程 序 API 中 的 可 用 对 象 表<br />

对 象<br />

句 柄<br />

描 述<br />

API 程 序 动 驱<br />

于 句 柄 的 命 令 式 API: 基<br />

多 数 对 象 通 过 不 透 明 句 柄 来 引 用 , 这 些 句 柄 被 指 定 到<br />

4-1 用 对 象 汇 总 在 表 可 的<br />

。<br />

CUdevice 备 设<br />

持 CUDA<br />

备 设<br />

CUDA 数<br />

承<br />

CUcontext 文 下 上<br />

CPU 当 于 相 乎<br />

程<br />

CUmodule 块 模<br />

相 当 于 动 态 库 乎<br />

4.5.3.1 初 始 化<br />

CUfunction 数 函<br />

核<br />

CUdeviceptr 存 内 堆<br />

设 备 内 存 的 指 针 向<br />

组 CUarray<br />

设 备 上 一 维 或 二 维 数 据 的 不 透 明 容 器 , 通 过 纹 理 参 考 可 读 载<br />

CUtexref 参 考 理 纹<br />

如 何 解 释 纹 理 内 存 数 据 的 对 象 述<br />

4.5.3.2 设 备 管 理<br />

E.2 中<br />

之<br />

E 用 附 录 调 在<br />

任 何 函 数 ( 参 见 E.1) 的<br />

cuInit() 需 要 使 用 , 前<br />

初 始 化 。 行<br />

cuDeviceGetCount()<br />

提<br />

中<br />

获 取 其 属 性 : 以<br />

供 了 枚 举 这 些 设 备 的 方 法<br />

的 其 它 函 数 用<br />

函 数 用 于 管 理 系 统 中 现 有 的 设 备 。 的<br />

4.5.3.3 上 下 文 管 理<br />

CUDA 编<br />

1.1 39<br />

函 数 用 于 创 建 、 附 加 和 分 下 文 。 的<br />

cuDeviceGet()<br />

E.3 中<br />

南 Version


所<br />

位<br />

进<br />

创<br />

。<br />

中<br />

递<br />

上<br />

上<br />

上<br />

中<br />

。cuFuncSetBlockShape()<br />

或 设<br />

值<br />

函<br />

启<br />

下 文 中 , 上<br />

的<br />

的 CUDA<br />

CUDA 上<br />

的 内 存 位 置 。<br />

CPU 类 似 于 文 下<br />

API 在 计 算 。 程<br />

并 且 当 上 下 文 销 毁 时 , 系 统 将 自 动 清 除 这 些 资 源 。 除 模 块 和 纹 理 参 考 等 对 象 之 外 , 每 个 上 下 文<br />

CUDA 的 所 有 资 源 和 操 作 都 封 装 在 行 执<br />

32- 有 自 己 独 立 的 具 还<br />

CUDA 空 间 。 因 此 , 不 同 址 地<br />

CUdeviceptr 中 的 文 下<br />

引 用 不 同<br />

上 下 文 具 有 与 宿 主 线 程 一 对 一 的 对 应 关 系 。 在 同 一 时 间 , 宿 主 线 程 只 能 有 一 个 设 备 上 下 文 。 当<br />

cuCtxDetach() 递<br />

时<br />

cuCtxCreate() 线 程 使 用 主 宿<br />

上 下 文 时 , 此 上 下 文 就 成 为 该 线 程 的 当 前 上 下 文 。 建<br />

CUDA 有 效 上 下 文 不 是 某 线 程 的 当 前 上 下 文 , 则 在 上 下 文 中 操 作 的 果 如<br />

数 ( 不 涉 及 设 备 仿 真<br />

4.5.3.4 模 块 管 理<br />

数 , 该 计 数 根 据 给 定 上 下 文 的 每 个 独 立 客 户 机 递 增 。 例 如 , 如 果 加 载 了 三 个 库 使 用 相 同 计<br />

的 启 发 式 方 法 创 建 上 下 文 , 而 库 只 需 在 传 递 给 它 的 上 下 文 上 操 作 。 己<br />

上 下 文 管 理 的 大 多 数 函 数 ) 将 返 回 CUDA_ERROR_INVALID_CONTEXT。 或<br />

API 化 在 同 一 上 下 文 中 执 行 的 第 三 方 授 权 代 码 之 间 的 互 操 作 性 , 驱 动 程 序 简 要<br />

护 了 一 个 使 用<br />

维<br />

cuCtxAttach() 文 , 则 每 个 库 必 须 调 用 下 上<br />

增 使 用 计 数 , 并 在 库 完 成 使 用 上 下 文 时 , 调 用<br />

E.4 中<br />

0 用 计 数 。 当 使 用 计 数 等 于 使 减<br />

, 则 销 毁 上 下 文 。 对 于 大 多 数 库 , 应 用 程<br />

CUDA 般 会 在 加 载 或 初 始 化 库 之 前 就 已 经 创 建 好 了 一 序<br />

下 文 ; 这 样 , 应 用 程 序 可 以 使 用 其 自<br />

函 数 用 于 加 载 和 卸 载 模 块 , 并 获 取 模 块 中 定 义 的 变 量 或 函 数 的 句 柄 和 指 针 。 的<br />

是<br />

4.5.3.5 执 行 控 制<br />

列 代 码 示 例 加 载 模 块 并 检 索 指 向 某 个 内 核 的 句 柄 : 下<br />

Windows 是 可 动 态 加 载 的 、 包 含 设 备 代 码 和 数 据 的 包 , 类 似 于 块 模<br />

的 DLL,<br />

nvcc<br />

输 出 ( 参<br />

E.7 中<br />

设<br />

见 4.2.5)。<br />

有 符 号 ( 包 括 函 数 、 全 局 变 量 和 纹 理 参 考 ) 的 名 称 在 模 块 范 围 内 维 护 , 以 便 由 不 同<br />

CUDA 方 写 好 的 模 块 可 以 在 同 一 三 第<br />

文 中 互 操 作 。 下<br />

绍 的 函 数 管 理 设 备 上 内 核 的 执 行 程 数 , 以 及 如 何 分 配 其 线 介<br />

给 定 函 数 的 每 块 线 置 函 数 的 共 享 内 存 大 小 。 置<br />

cuParam*()<br />

提 供 给 内 核 的 参 数 系<br />

40<br />

CUDA 程 指 编<br />

1.1<br />

cuLaunchGrid() 数 用 于 指 定 下 一 次 调 用 函 列<br />

动 内 核 时 将<br />

cuLaunch()<br />

程 ID。cuFuncSetSharedSize()<br />

南 Version


程 指<br />

中<br />

分 个 或<br />

数 进<br />

创<br />

数<br />

的<br />

数<br />

数<br />

进<br />

行 释 放 。 进<br />

4.5.3.6 内 存 管 理<br />

E.8 中<br />

函 数 用 于 分 配 和 释 放 设 备 内 存 , 并 在 宿 主 和 设 备 内 存 之 间 传 送 数 据 。 的<br />

的 分 配 , 该 分 配 方 式 会 对 空 间 进 行 适 当 填 补 以 满 组<br />

cuMemAlloc() 用 使<br />

获 得 最 佳 性 能 。 返 回 的 节 距 必 须 用 于 访 问 数 组 元 素 。 下 列 代 码 示 时<br />

cuMemAllocPitch()<br />

cuMemFree() 性 内 存 , 使 用 线 配<br />

256 代 码 示 例 在 线 性 内 存 中 分 配 了 包 含 列 下<br />

点 数 元 素 的 数 组 : 浮<br />

和 其 它 设 备 内 存 区 域 执 行 复 组<br />

cuMemAllocPitch() 使 用 议 建<br />

行 2D<br />

足 5.1.2.1<br />

2D 的 对 齐 要 求 , 从 而 确 保 在 访 问 行 地 址 时 或 在 述 描<br />

( 使 用 cuMemcpy2D()) 制<br />

width×height 配 浮 点 数 值 的 分 例<br />

2D<br />

, 并 显 示 如 何 在 设 备 代 码 中 循 环 遍 历 数 组 元 素 : 组<br />

32- 位 个<br />

CUDA 数<br />

的<br />

销 毁 。 行<br />

下 列 代 码 示 例 分 配 了 一<br />

: 组<br />

CUDA 编<br />

1.1 41<br />

cuArrayCreate() 用 使<br />

建 CUDA<br />

cuArrayDestroy() 使 用 , 组<br />

南 Version<br />

width×height 数 元 素 的 点 浮


、CUDA 数<br />

数<br />

分<br />

:<br />

组 复 制 到 上 一 代 码 分<br />

。<br />

列 代 码 示 例 定 义 了 对 这 两 个 流 的 一 系 列 操 作 : 一 个 从 宿 主 到 设 备 的 内 存 复 制 、 一 个 内 核 启 动 和 一 个 从 设 备 到 宿 主 的 内 存 复 制 : 下<br />

复<br />

hostPtr 允 理<br />

数<br />

程 指<br />

E.8 一<br />

配 的<br />

列 出 用 于 在 使 线 性 内 存 示 例 中 分 配 组 节<br />

用 cuMemAlloc()<br />

cuMemAllocPitch() 线 性 内 存 、 使 用 的 配<br />

的 CUDA<br />

2D 间 复 制 内 存 的 所 有 各 种 函 数 。 下 列 示 例 代 码 将 之 组<br />

4.5.3.7 流 管 理<br />

列 代 码 示 例 将 一 些 宿 主 内 存 数 组 复 制 到 设 备 内 存 中 : 下<br />

函 数 用 于 创 建 和 销 毁 流 , 并 确 定 流 的 所 有 操 作 是 否 已 经 完 成 的<br />

E.5<br />

下 列 代 码 示 例 创 建 两 个 流 : 中<br />

每 个 流 将 其 部 分 输 入 数<br />

制 到 设 备 内 存 中 的 数<br />

, 通 过 调 用<br />

cuFunction 理 设 备 上 的 相 应 部 分 。 使 用 两 个 流 处 处<br />

将 结 重 新 复 制 回 许 一 个 流 的 内 存 复 制 与 另 一 个 流 的 内 核 执 行 同 时 发 生 。 并<br />

果 outputDevPtr<br />

到 hostPtr<br />

42<br />

CUDA 编<br />

1.1<br />

南 Version<br />

组 hostPtr<br />

组 inputDevPtr<br />

的 inputDevPtr,<br />


程 指<br />

cuCtxSynchronize() 以 用<br />

些 事 件 可 以 对 上 一 节 的 代 码 示 例 进 行 计 时 : 这<br />

包<br />

的<br />

或<br />

hostPtr 必<br />

指 页 锁 的 主 存 , 才 能 保 证 时 间 上 的 重 叠 : 须<br />

4.5.3.8<br />

向<br />

事<br />

面<br />

件<br />

定<br />

管<br />

宿<br />

理<br />

内<br />

下 一 步 处 理 之 前 所 有 流 都 已 完 成 。 在 保 确 调 后 最<br />

事 件 管 理<br />

E.6 的 函 数 用 于 创 建 、 记 录 和 销 毁 事 件 , 并 查 询 两 个 事 件 之 间 用 去 的 时 间 。 下 列 代 码 示 例 创 建 两 个 事 件 : 中<br />

4.5.3.9 纹 理 参 考 管 理<br />

E.9 中<br />

将<br />

函 数 用 于 管 理 纹 理 参 考 。 的<br />

核 才 可 以 使 用 纹 理 参 考 从 纹 理 内 存 中 读 取 数 据 。 内<br />

CUDA 编<br />

1.1<br />

纹 理 参 考 绑 定 到 纹 理 之 后 ,<br />

43<br />

cuModule 模 块 果 如<br />

含 某 个 定 义 如 下 的 纹 理 参<br />

cuTexRefSetArray()<br />

南 Version<br />

考 texRef:<br />

cuTexRefSetAddress() 使 用 须 必<br />

texRef 代 码 示 例 获 取 列 下<br />

柄 : 句


的<br />

绑<br />

绑<br />

的<br />

中<br />

devPtr 指 由<br />

数<br />

解<br />

的<br />

对 象 : 点<br />

进<br />

的 一 些 线 性 内 存 : 向<br />

返<br />

进<br />

返<br />

完<br />

解<br />

终<br />

程 指<br />

E.9 列<br />

4.5.3.10 OpenGL 互 操 作 性<br />

的 结 果 。 定<br />

定 到<br />

texRef 代 码 示 例 将 列 下<br />

texRef 代 码 示 例 将 列 下<br />

CUDA 到 定<br />

E.10 中<br />

组 cuArray:<br />

用 于 设 置 纹 理 参 考 的 地 址 模 式 、 过 滤 模 式 、 格 式 和 其 它 标 识 的 各 种 函 数 。 将 纹 理 绑 定 到 纹 理 参 考 时 指 定 的 格 式 必 须 与 声 明 纹 理 参 考 时 指 定 的 参 数 相 匹 配 ; 否 则 , 纹 理 拾 取 会 导 致 不 确 出<br />

与 OpenGL<br />

cuGLInit() 作 性 必 须 使 用 操 互<br />

初 始 化 。 行<br />

CUDA 射 的 缓 冲 对 象 必 须 先 在 映 被<br />

cuGLRegisterBufferObject() 。 使 用 册 注<br />

成 此 操<br />

OpenGL 数 用 于 控 制 与 函 的<br />

操 作 性 。 互<br />

: 作<br />

: 象<br />

4.5.3.11 Direct3D 互 操 作 性<br />

注 册 。 除<br />

cuGLMapBufferObject() 之 后 , 内 核 可 以 使 用 由 册 注<br />

回 的 设 备 内 存 地 址 读 取 或 写 入 缓 冲 对<br />

D.9 中<br />

的<br />

操 作 性 。 互<br />

cuGLUnmapBufferObject() 用 使<br />

cuGLUnregisterBufferObject() 射 , 使 用 映 除<br />

cuD3D9RegisterVertexBuffer()<br />

些 调 用 之 间 , 顶 点 对 象 必 须 注 册 完 这 在<br />

CUDA<br />

成 : 到<br />

之 后 才 能 被 映 射 。 此 操 作 使 用<br />

44<br />

CUDA 编<br />

回 的 设 备 内 存 地 址 读 取 或 写 入 顶<br />

1.1<br />

Direct3D 数 用 于 控 制 与 函 的<br />

与 Direct3D<br />

cuD3D9Begin() 作 性 必 须 使 用 操 互<br />

cuD3D9End() 始 化 , 使 用 初 行<br />

: 止<br />

南 Version<br />

cuD3D9MapVertexBuffer() 之 后 , 内 核 可 以 使 用 由 册 注


程 指<br />

解 除 注 册 。 解<br />

用 cuD3D9UnregisterVertexBuffer()<br />

除 映 射 , 使<br />

cuD3D9UnmapVertexBuffer() 用 使<br />

CUDA 编<br />

1.1 45<br />

南 Version


程 指<br />

46<br />

CUDA 编<br />

1.1<br />

南 Version


程 指<br />

的<br />

行 的 指 令 , 多 处 理 器 必 须 : , 执<br />

个<br />

位<br />

位<br />

、__log(x)(<br />

和<br />

,__[u]mul24 将 参<br />

个<br />

位<br />

第 5 章<br />

性 能 指 南<br />

5.1 指 令 性 能<br />

读<br />

的<br />

执<br />

写<br />

的<br />

尽<br />

最<br />

warp<br />

warp<br />

个 线 程 的 指 令 操 作 数 行 指 令 , 每 个 线 程 的 结 果 每 取<br />

warp 个 线 程 一 对<br />

允<br />

由<br />

每<br />

。<br />

此 , 有 效 的 指 令 吞 吐 量 取 决 于 额 定 指 令 吞 吐 量 以 及 内 存 延 迟 和 带 宽 。 它 通 过 下 列 方 式 最 大 化 : 因<br />

线 程 调 度 器 尽 可 能 地 将 内 存 事 务 与 数 学 计 算 同 时 执 行 , 这 需 要 : 线 程 执 行 的 程 序 具 有 高 算 术 密 度 , 即 每 个 内 存 操 作 对 应 更 多 算 术 操 作 ; 许<br />

5.1.1 指 令 吞 吐 量<br />

不 使 用 低 吞 吐 量 的 指 令 ( 参 见 5.1.1), 量<br />

5.1.1.1 算 术 指 令<br />

化 每 种 内 存 的 可 用 内 存 带 宽 ( 参 见 5.1.2), 大<br />

多 处 理 器 具 有 许 多 活 动 线 程 , 详 见 5.2。 个<br />

个 指 令 , 多 处 理 器 花 费 : 一<br />

4 个<br />

时 钟 周 期 , 用 于 : 浮 点 加 、 浮 点 乘 、 浮 点<br />

- 加 、 整 数 加 、 位 操 作 、 比 较 、 求 最 小 、 求 乘<br />

16 个<br />

参<br />

时 钟<br />

32- 位<br />

warp 射 发 要<br />

CUDA 编<br />

1.1 47<br />

大 、 类 型 转 换 指 令 ; 最<br />

时 钟 周 期 , 用 于 : 倒 数 、 平 方 根 倒 数<br />

表 B-2)。 见<br />

16 乘 法 使 用 数 整<br />

__mul24 周 期 , 而 钟 时<br />

__umul24(<br />

附 录 B) 提 供 见<br />

了 4<br />

24 的 有 符 号 和 无 符 号 期 周<br />

整 数 乘 法 。 但 是 , 在 将 来 的 架 构 中<br />

比 32-<br />

整 数<br />

法 慢 , 所 以 我 们 建 议 编 写 两 个 内 核 供 应 用 程 序 在 不 同 情 况 下 调 用 , 其 中 一 个 使 用<br />

__[u]mul24, 另 一 个 使 用 一 般 整 数 乘 法 。 乘<br />

的 32-<br />

南 Version


等<br />

决<br />

(converge)<br />

等<br />

个<br />

的<br />

个<br />

是<br />

个<br />

是<br />

或<br />

的<br />

会<br />

执<br />

,warp<br />

已<br />

(diverge),<br />

和<br />

幂 , 的<br />

无 穷 大<br />

warp<br />

warp 是 的<br />

个<br />

如<br />

个 花<br />

果 n<br />

2<br />

y) 提<br />

则 (i/n)<br />

于 (i>>log2(n)),(i%n)<br />

于 (i&(n-1));<br />

果 n<br />

数 除 法 和 模 操 作 特 别 昂 贵 应 该 尽 可 能 地 避 免 , 或 者 尽 量 替 换 为 位 操 作 : 如 文 本 型 的 , 则 编 译 器 将 执 行 这 些 转 换 。 整<br />

它 函 数 使 用 更 多 时 钟 周 期 , 因 为 它 们 实 现 为 多 个 指 令 的 组 合 。 时 钟 周 期 。 其<br />

钟 周 期 的 更 快 版 本 ( 参 见 时<br />

0 数 平 方 根 实 现 为 平 方 根 倒 数 再 求 倒 数 , 而 非 平 方 根 倒 数 再 做 乘 法 , 所 以 它 对 于 点 浮<br />

__sin(x)、__cos(x)、__exp(x) 花<br />

1 获 得 正 确 的 结 果 。 因 此 , 它 处 理 够 能<br />

对<br />

warp<br />

费 32<br />

36 除 法 花 费 点 浮<br />

__fdividef(x, 周 期 , 但 钟 时<br />

在<br />

20 了 供<br />

录 B)。 附<br />

中<br />

对<br />

费 32<br />

钟 周 期 。 有 时 候 , 编 译 器 不 得 不 额 外 插 入 转 换 指 令 , 从 而 引 入 额 外 的 执 行 周 期 。 这 种 情 况 包 括 : 时<br />

后<br />

对<br />

对<br />

后<br />

char 数 为 作 操<br />

short<br />

数 操 作 , 其 操 作 数 通 常 需 要 转 换 为 int, 函<br />

精 度 浮 点 数 计 算 中 , 将 双 精 度 浮 点 数 常 量 ( 不 使 用 任 何 类 型 后 缀 定 义 ) 作 为 输 入 值 , 后 两 种 情 况 可 以 通 过 下 列 方 式 避 免 : 单<br />

5.1.1.2 控 制 流 指 令<br />

于 代 码 , 我 们 强 烈 建 议 使 用 浮 点 类 型 和 单 精 度 数 学 。 当 在 不 支 持 原 生 双 精 度 的 设 为 其 单 精 度 对 应 函 数 。 但 是 对 于 将 来 支 持 双 精 度 的 设 备 , 这 些 函 数 将 映 射 为 双 精 度 实 现 。 对<br />

表 B-1<br />

义 的 数 学 函 数 的 双 精 度 版 本 , 将 单 精 度 浮 点 数 变 量 作 为 输 入 参 数 。 定<br />

f 度 浮 点 数 常 量 , 使 用 精 单<br />

定 义 , 比 如 3.141592653589793f、1.0f、0.5f, 缀<br />

switch, do, for, while) 都<br />

内<br />

f 函 数 的 单 精 度 版 本 , 也 使 用 学 数<br />

定 义 , 比 如 sinf()、logf()、expf()。 缀<br />

1.x 比 如 计 算 能 力 ( 备<br />

设 备 ) 上 编 译 时 , 双 精 度 类 型 默 认 降 级 为 单 精 度 , 双 精 度 数 学 函 数 映 射<br />

即<br />

(if, 流 控 制 指 令 何 任<br />

的 线 程 分 流<br />

按 照<br />

/ WSIZE) 时<br />

warp 致 导 会<br />

不 同 的 执 行 路 径 执 行 , 其 结 果 是 对 有 效 指 令 吞 吐 量 产 生 显 著 影 响 。 如 果 线 程 分 流 发 生 , 则 不 同<br />

warp 行 路 径 是 串 行 化 执 行 的 增 加 此 行 的 指 令 总 数 。 当 所 有 不 同 的 执 行 路 径 都 已 完 成 时 , 到 同 一 执 行 路 径 。 定 控 制 流 指 令 时 , 要 获 得 最 佳 性 能 , 就 应 该 写 入 控 制 条 件 , 以 便 让 尽 量 少 的 执 的<br />

48<br />

CUDA 编<br />

1.1<br />

线 程 才 合 流<br />

ID 程 线 当<br />

所<br />

在<br />

3.2 分 流 。 这 种 优 化 方 式 是 可 能 实 现 的 , 因 为 如 生 产<br />

述<br />

块 中 的 分 布 具 有 确 定 性 。 比<br />

warp 。 在 这 种 情 况 下 , 没 有 任 何 小 大<br />

warp , 因 为 控 制 条 件 与 流 分<br />

美 对 齐 。 完<br />

(threadIdx 当 控 制 条 件 仅 取 决 于 , 如<br />

WSIZE 种 优 化 方 式 就 成 立 , 其 中 这 ,<br />

Version 南 指 程


程 指<br />

,warp 绝<br />

假<br />

(predicate)<br />

个<br />

#pragma unroll 指 用<br />

到<br />

个<br />

个<br />

令 控 制 循 环 展 开 ( 参 见<br />

个<br />

switch 语<br />

或<br />

句 , 详 细 说 明 如 下 。 在 这<br />

if , 编 译 器 可 以 通 过 使 用 分 支 预 测 展 开 循 环 或 优 化 时 有<br />

情 况 下<br />

4.2.5.2)。<br />

些<br />

不 会 分 流 。 编 程 人 员 也 可 以 使<br />

5.1.1.3 内 存 指 令<br />

使 用 分 支 预 测 时 , 所 有 基 于 控 制 条 件 的 指 令 都 会 被 执 行 。 而 且 , 与 每 线 程 条 件 代 码 和 基 于 控 相 当<br />

将<br />

warp 的<br />

/ 件 的 真 关 每 条 指 令 都 会 被 调 度 执 行 , 但 只 有 具 有 真 谓 词 的 指 令 将 实 际 执 行 。 具 有 假 谓 词 的 指 令 不 写 入 结 果 , 而 且 不 取 地 址 或 读 取 操 作 数 。 条 制<br />

当 由 分 支 条 件 控 制 的 指 令 数 小 于 或 等 于 特 定 时 , 编 译 器 才 将 分 支 指 令 替 换 为 预 测 指 令 ; 如 果 编 译 器 确 定 许 会 产 生 分 流 , 则 此 临 界 值 是 7, 否 则 是 4。 仅<br />

多 warp<br />

到<br />

个<br />

4 指 令 包 括 从 共 享 或 全 局 内 存 中 读 取 或 写 入 的 任 何 指 令 。 多 处 理 器 使 用 例 如 , 下 列 示 例 代 码 中 的 赋 值 操 作 符 : 存 内<br />

时 钟 周 期 来 发 射<br />

400 内 存 指 令 。 此 外 , 当 访 问 全 局 内 存 时 , 还 有 个 一<br />

600<br />

钟 周 期 的 内 存 延 迟 。 时<br />

5.1.1.4 同 步 指 令<br />

4 一 个 读 取 指 令 花 费 射 发<br />

4 周 期 , 对 共 享 内 存 的 写 入 花 费 钟 时<br />

时 钟 周 期 , 但 最 关 键 的 是 ,<br />

400 局 内 存 中 读 取 浮 点 数 会 花 费 全 从<br />

600<br />

钟 周 期 。 时<br />

个<br />

发<br />

将<br />

个<br />

果 在 等 待 全 局 内 存 访 问 完 成 期 间 , 线 程 调 度 器 可 以 发 射 足 够 多 的 独 立 算 术 指 令 , 则 大 部 分 全 局 内 存 访 存 延 迟 可 以 被 隐 藏 掉 。 如<br />

5.1.2 内 存 带 宽<br />

期 。 周<br />

1 没 有 任 何 线 程 必 须 等 待 其 它 任 何 线 程 , 则 果 如<br />

warp<br />

射 __syncthreads<br />

4 费 花<br />

时 钟<br />

将<br />

个 内 存 空 间 的 有 效 带 宽 主 要 取 决 于 访 模 式 , 详 见 下 列 小 节 。 因 为 设 备 内 存 与 片 上 内 存 相 比 具 有 更 高 的 延 迟 和 更 低 的 带 宽 , 所 以 设 备 内 存 访 问 必 须 最 小 化 。 典 型 的 编 程 模 式 是 将 来 自 设 备 内 存 的 数 据 存 储 到 共 享 内 存 中 ; 换 句 话 说 , 就 是 让 块 中 的 每 个 线 每<br />

: 设 备 内 存 中 的 数 据 加 载 到 共 享 内 存 中 , 程<br />

与<br />

CUDA 编<br />

1.1<br />

块 的 所 有 其 它 线 程 同 步 , 以 便 每 个 线 程 可 以 安 全 读 取 由 不 同 线 程 写 入 的 某 块 共 享 内 存 ,<br />

49<br />

南 Version


个<br />

,<br />

,type<br />

个<br />

__align__(16) 定 用<br />

位<br />

、64- 位<br />

位<br />

中<br />

,<br />

的 或<br />

或<br />

的<br />

<br />

<br />

将 如 处<br />

5.1.2.1 全 局 内 存<br />

共 享 内 存 中 的 数 据 果 必 要 的 话 , 重 新 同 步 以 确 保 共 享 内 存 已 经 由 结 果 更 新 理<br />

果 写 回 到 设 备 内 存 中 。 结<br />

必<br />

等<br />

局 内 存 空 间 没 有 高 速 缓 存 , 所 以 最 重 要 的 是 按 照 正 确 的 访 问 模 式 获 得 最 大 的 内 存 带 宽 , 尤 其 是 已 知 对 设 备 内 存 的 访 问 有 多 昂 贵 时 。 全<br />

方 式 : 值<br />

32- , 设 备 能 够 在 单 个 指 令 中 将 先 首<br />

或 128-<br />

字 从 全 局 内 存 读 取 到 寄 存 器 。 用 如 下 赋<br />

一<br />

或<br />

对 于 结 构 体 , 大 小 和 对 齐 要 求 可 以 由 编 译 器 使 用 对 齐 指 定 强 制 执 行 , 比 如 对<br />

__align__(8) 符<br />

__align__(16)<br />

编 译 到 单 个 加 载 指 令 中<br />

sizeof(type) 得 使 须<br />

于 4、8<br />

16,<br />

type 为 型 类<br />

变<br />

sizeof(type) 须 对 齐 为 必 量<br />

sizeof(type) ( 也 就 是 说 , 让 其 地 址 是 节 字<br />

倍 数 )。<br />

且<br />

4.3.1.1 于 对<br />

float2 介 绍 的 内 置 类 型 , 比 如 中 节<br />

float4,<br />

将 自 动 完 成 。 齐<br />

或<br />

体 应 使 构<br />

节 的 结 构 体 , 编 译 器 生 成 多 个 加 载 指 令 。 要 确 保 它 生 成 最 少 的 指 令 , 则 这 种 结 义 , 比 如 字<br />

位<br />

个<br />

位<br />

50<br />

CUDA<br />

进 行 排 列 , 以 便 内 存 访 问 可 以 合 并 到 单 个 邻 近 的 、 对 齐 的 内 存 访 问 中 。<br />

编<br />

1.1<br />

16 大 于 于 对<br />

32-<br />

载 指 令 。 加<br />

128- 译 为 两 个 编 会<br />

Version 南 指 程<br />

5 指 令 , 而 非 载 加<br />

warp , 在 执 行 单 个 读 取 或 写 入 指 令 期 间 , 每 个 半 二 第<br />

同 时 访 问 全 局 内 存 地 址 的 每 个 线 程 应 该


程 指<br />

始<br />

显<br />

位<br />

满<br />

中<br />

和<br />

的<br />

的<br />

位<br />

位<br />

N 的 为<br />

和<br />

位<br />

个<br />

的<br />

的<br />

显<br />

倍<br />

的<br />

位<br />

位<br />

的<br />

32-<br />

倍 。 并<br />

HalfWarpBaseAddress<br />

确 地 说 , 在 每 个 更 准<br />

应<br />

程 应 访 问 地 满 线<br />

或 中 个<br />

16*sizeof(type)<br />

述 的 大 小 和 对 齐 要 求 。 此 外 , 是 的 内 存 分 配 例 程 之 一 返 回 的 变 量 , 其 任 何 地 上 足<br />

半 warp<br />

线 程 号 ,<br />

对 齐 为 至 终<br />

HalfWarpBaseAddress-BaseAddress 应<br />

type* , 类 型 为 中 其<br />

type<br />

址<br />

节 ( 比 如 , 字<br />

HalfWarpBaseAddress<br />

16*sizeof(type) 为 齐 对<br />

D.5 数 )。 对 于 驻 留 在 全 局 内 存 中 或 由 倍 的<br />

E.8<br />

址 BaseAddress<br />

少 256<br />

节 , 所 以 为 了 满 足 内 存 对 齐 约 束 , 倍 数 。 字<br />

了 未 合 并 访 存 的 示 例 示<br />

是 16*sizeof(type)<br />

半 warp<br />

warp 述 所 有 要 求 , 即 使 半 上 足<br />

些 线 程 不 实 际 访 问 内 存 , 每 线 程 内 存 访 一<br />

访 存 提 供 了 比 已 合 。<br />

意 , 如 果 访 问 也 将 合 并 。 注<br />

适 当 合 并 将 成 为 将 来 设 备 的 必 要 条 件 已 合 存<br />

warp 分 别 执 行 每 个 半 仅 与<br />

warp 相 对 , 我 们 建 议 执 行 整 个 。 合 并<br />

存 低 很 多 的 带 宽 。 然 而 , 当 访 存 时 , 尽 管 未 合 并 访 存 的 带 宽 比 已 合 并 访 存 的 带 宽 低 访 位<br />

warp , 因 为 对 整 个 并 合<br />

图 5-1<br />

5-2 已 合 并 访 存 的 示 例 , 而 图 了 示<br />

图 5-3<br />

并 64-<br />

32- 提 供 了 比 已 合 并 存 访<br />

128- 访 存 是 当 ,<br />

128- 稍 低 的 带 宽 , 已 合 并 存 访<br />

是 32<br />

64- 一 个 数 量 级 , 但 当 访 存 是 约 大<br />

2 仅 低 大 约 , 时<br />

4 仅 低 大 约 , 时<br />

CUDA 编<br />

1.1 51<br />

南 Version


内<br />

float 内 的<br />

5-1.<br />

已 合 并 全 局 内 存 访 问 模 式 的 示 例 图<br />

程 指<br />

52<br />

CUDA 编<br />

1.1<br />

float 访 问 已 合 并 的 : 左<br />

。 存<br />

南 Version<br />

右 : 访 问 已 合 并<br />

( 被 分 流 的 warp)。 存


程 指<br />

内<br />

。 存<br />

CUDA 编<br />

1.1<br />

右 : 未 对 齐 的 初 始 地 址 。 图 5-2.<br />

未 合 并 全 局 内 存 访 问 模 式 的 示 例<br />

53<br />

float 访 问 非 顺 序 的 : 左<br />

南 Version


内<br />

float3 内 的<br />

。 图 5-3. 未 合 并 全 局 内 存 访 问 模 式 的 示 例 存<br />

程 指<br />

右 : 访 问 未 合 并<br />

54<br />

CUDA 编<br />

1.1<br />

南 Version<br />

float 访 问 不 相 连 的 : 左<br />

。 存


程 指<br />

的<br />

,type 必<br />

是<br />

的<br />

大<br />

为<br />

的<br />

的<br />

的<br />

的<br />

数<br />

的<br />

的<br />

带<br />

空<br />

的<br />

和<br />

16<br />

BaseAddress<br />

是 于<br />

址<br />

的<br />

。cudaMallocPitch()<br />

允 和<br />

中<br />

类<br />

type*) 上<br />

ID 的 全 局 内 存 访 问 模 式 是 , 线 程 的 数 组 的 一 个 元 素 , 使 用 下 列 地 址 见 常<br />

type*<br />

并 访 存 个 字 节 的 结 构 体 则 应 分 割 满 足 这 些 要 求 的 多 个 结 构 体 , 而 且 数 据 应 在 内 存 中 排 列 为 这 些 结 构 体 的 多 个 数 组 , 而 非 类 型 为 合 为<br />

:<br />

tid<br />

个 线 程 访 问 位 于 地 址 BaseAddress( 每<br />

线<br />

width<br />

type 足 上 述 大 小 和 对 齐 要 求 。 特 别 地 , 这 意 味 着 , 如 果 满 须<br />

个 数 组 。 单<br />

为 型<br />

大<br />

宽<br />

上<br />

(tx,ty) 个 常 见 的 全 局 内 存 访 问 模 式 是 , 当 索 引 为 一 另<br />

每 个 线 程 访 问 位 于 地<br />

数 。 倍<br />

类 型 为 type*、 (<br />

为 width) 度<br />

的 2D<br />

的 一 个 元 素 时 , 使 用 下 列 地 址 组<br />

倍 数 进<br />

warp 种 情 况 下 , 仅 当 满 足 下 列 条 件 , 才 能 获 得 线 程 块 的 所 有 半 这 在<br />

存 合 并 : 访<br />

行 分 配 , 且 其 行 相 应 地 进 行 填 补 , 则 此 数 组 将 获 得 较 高 效 的 访 问<br />

许 编 程 人 员 编 写 不 依<br />

warp 的 宽 是 半 个 块 程<br />

的 倍 数 ; 小<br />

cuMemAllocPitch() 函<br />

16<br />

5.1.2.2 常 量 内 存<br />

16 地 , 这 意 味 着 , 如 果 宽 度 不 是 别 特<br />

16 的 数 组 实 际 使 用 向 上 取 整 为 最 接 近 的 数 倍<br />

于 硬 件 的 代 码 来 分 配 符 合 这 些 约 束 的 数 组 。 赖<br />

D.5 其 相 关 的 内 存 复 制 函 数 ( 参 见 及 数<br />

E.8)<br />

5.1.2.3 纹 理 内 存<br />

量 内 存 空 间 具 有 高 速 缓 存 , 所 以 仅 在 高 速 缓 存 未 命 中 时 , 才 从 设 备 内 存 中 读 取 数 据 , 否 则 仅 花 费 读 取 常 量 高 速 缓 存 的 时 间 常<br />

操 作 来 实 现 完 全 的 快 速 读 取 。 此<br />

warp 半 于 对<br />

所 有 线 程 , 只 要 所 有 线 程 读 取 同 一 地 址 , 则 从 常 量 内 存 中 读 取 与 从 寄 存 器 中 读 取<br />

纹 理 内 存 空 间 具 有 高 速 缓 存 , 所 以 纹 理 拾 取 仅 在 高 速 缓 存 未 命 中 时 , 才 从 设 备 内 存 中 读 取 数 据 ,<br />

warp 快 。 访 存 花 费 的 时 间 随 读 取 不 同 地 址 的 线 程 数 目 线 性 增 减 。 与 仅 让 每 个 半 样 一<br />

的 所 有 线<br />

warp 取 同 一 地 址 相 对 , 我 们 建 议 让 整 个 读 程<br />

所 有 线 程 读 取 同 一 地 址 , 因 为 将 来 的 设 备 将 需 要<br />

warp 相 邻 的 纹 理 地 址 的 同 一 密 紧<br />

线 程 将 达 到 最 佳 性 能 。 此 外 , 它 还 为 具 有 恒 定 延 迟 的 流 式 拾<br />

DRAM 设 计 , 比 方 说 , 高 速 缓 存 命 中 降 低 了 而 取<br />

需 求 , 但 没 有 降 低 拾 取 延 迟 。 宽<br />

CUDA 编<br />

1.1 55<br />

2D 仅 花 费 读 取 纹 理 高 速 缓 存 的 时 间 。 纹 理 高 速 缓 存 针 对 则 否<br />

间 局 部 性 进 行 了 优 化 , 所 以 读 取<br />

过 纹 理 拾 取 读 取 设 备 内 存 可 能 是 从 全 局 或 常 量 内 存 中 读 取 设 备 内 存 的 有 利 备 选 方 案 , 详 见 5.4。 通<br />

南 Version


(n-way)<br />

和<br />

类<br />

个<br />

的<br />

的<br />

显<br />

的<br />

个<br />

,warp 大<br />

和<br />

的<br />

位<br />

倍<br />

的<br />

conflict), 访<br />

显<br />

位<br />

是<br />

将<br />

的<br />

程 指<br />

的<br />

(d 是<br />

所 的<br />

n 为<br />

32- 为<br />

s 和<br />

5.1.2.4 共 享 内 存<br />

于 warp<br />

(bank<br />

位 于 芯 片 上 , 所 以 共 享 内 存 空 间 要 比 本 地 和 全 局 内 存 空 间 快 得 多 。 实 际 上 , 对 有 线 程 , 只 要 在 线 程 之 间 没 有 任 何 存 储 体 冲 突 问 共 享 内 存 就 与 访 问 寄 存 器 一 样 快 详 见 下 文 。<br />

n<br />

为<br />

得 高 内 存 带 宽 , 共 享 内 存 被 划 分 为 同 样 大 小 的 、 可 以 同 时 访 问 的 内 存 块 , 名 为 存 储 体 因 此 , 由 属 于 存 储 体 地 址 组 成 的 任 何 内 存 读 取 或 写 入 请 求 都 可 以 同 时 获 得 服 务 , 最 后 可 获 得 的 有 效 带 宽 是 单 个 模 块 的 带 宽 。 获 为<br />

(bank)。<br />

的 n<br />

的 n<br />

为 n, 则 把 此 种 情 况 称<br />

储 体 冲 突 。 要 获 得 最 高 性 能 , 很 有 必 要 理 解 内 存 地 址 映 射 到 存 储 体 的 方 式 , 进 而 调 度 内 存 请 求 , 最 小 化 存 储 体 冲 突 。 路<br />

每 两 个 时 钟 周 期 。 位<br />

存<br />

参<br />

tid 索<br />

来<br />

位<br />

m/d 时<br />

是<br />

的<br />

将<br />

是<br />

的<br />

等 是<br />

的<br />

时<br />

大<br />

32- 内 存 空 间 的 存 储 体 组 织 为 : 连 续 的 享 共<br />

字 分 配 到 连 续 的 存 储 体 中 , 每 个 存 储 体 的 带 宽<br />

是 如 果 某 个 内 请 求 的 两 块 地 址 落 在 同 一 存 储 体 内 , 则 会 导 致 存 储 体 冲 突 , 访 问 也 必 须 串 行 化 。 硬 件 将 带 有 存 储 体 冲 突 的 内 存 请 求 按 需 分 成 许 多 单 独 的 无 冲 突 的 请 求 , 有 效 带 宽 就 会 减 少 数 倍 , 该 倍 数 与 单 独 内 存 请 求 的 数 目 相 等 。 如 果 单 独 内 存 请 求 的 数 目 存 但<br />

1.x 计 算 能 力 于 对<br />

设 备<br />

为 32, 小<br />

体 数 为 16( 储<br />

见 5.1);<br />

warp<br />

共 享 内 存 请<br />

warp 分 为 第 一 半 划 求<br />

warp 请 求 和 第 二 半 个 一<br />

warp 请 求 。 因 此 , 属 于 第 一 半 个 一<br />

线 程 和<br />

warp 第 二 半 于 属<br />

程 间 不 会 发 生 任 何 存 储 体 冲 突 。 线<br />

ID 常 见 的 情 况 是 每 个 线 程 从 按 线 程 个 一<br />

s 数 据 中 使 用 某 个 跨 度 的 引<br />

32 一 个 问 访<br />

: 字<br />

s*n 情 况 下 , 只 要 种 这<br />

m 体 数 储 存<br />

n , 或 者 同 等 地 , 只 要 数 倍<br />

m/d<br />

倍 数<br />

m<br />

突 。 冲<br />

1.x 不 会 发 生 存 储 体 冲 突 。 对 于 计 算 能 力 才 ,<br />

d , 仅 当 备 设<br />

于 1<br />

才 不 会 发 生 任 何 存<br />

tid 公 约 数 ), 则 线 程 大 最<br />

tid+n<br />

warp 同 一 存 储 体 。 因 此 , 仅 当 半 问 访<br />

小 小 于 或 等 于<br />

32- 一 提 的 其 它 情 况 出 现 在 每 个 线 程 访 问 小 于 或 大 于 得 值<br />

的 元 素 时 。 例 如 , 如 果 按 下 列 方 式 访<br />

图 5-4<br />

5-6 一 些 无 冲 突 访 存 的 示 例 , 而 图 了 示<br />

了 一 些 导 致 存 储 体 冲 突 的 访 存 示 例 。 示<br />

m 冲 突 , 或 者 换 句 话 说 , 因 为 体 储<br />

2<br />

s , 所 以 仅 当 次 幂<br />

奇 数 时 , 才 不 会 发 生 任 何 存 储 体<br />

56<br />

CUDA 编<br />

1.1<br />

图 5-5<br />

问 char<br />

数 组 , 则 会 发 生 存 储 体 冲 突 。 型<br />

南 Version


程 指<br />

显<br />

定<br />

定<br />

个<br />

个<br />

的<br />

位<br />

的<br />

和<br />

位<br />

属 于 一 个 存 储 体 。 但 是 , : 同<br />

位<br />

:<br />

位<br />

如 果 按 下 列 方 式 访 问 同 一 数 组 , 则 不 会 发 生 任 何 存 储 体 冲 突<br />

如<br />

shared[3]<br />

对 结 构 体 而 言 , 其 编 译 后 的 内 存 请 求 与 结 构 体 成 员 数 一 样 多 , 所 以 , 下 列 代 码<br />

shared[0]、shared[1]、shared[2] 因 为 是 这<br />

如<br />

导 致 下 列 结 果 : 将<br />

果 type<br />

如 下 , 则 结 果 为 三 个 单 独 的 无 存 储 体 冲 突 的 内 存 读 取 义<br />

个<br />

位<br />

3 每 个 成 员 使 用 为 因<br />

32-<br />

的 跨 度 来 访 问 。 字<br />

如<br />

定<br />

果 type<br />

如 下 , 则 结 果 为 两 个 单 独 的 有 存 储 体 冲 突 的 内 存 读 取 义<br />

2 每 个 成 员 使 用 为 因<br />

32<br />

的 跨 度 来 访 问 。 字<br />

果 type<br />

如 下 , 则 结 果 为 两 个 单 独 的 有 存 储 体 冲 突 的 内 存 读 取 义<br />

选<br />

的 数 目 。 更 精 确 说 , 对 多 个 地 址 的 内 存 读 取 请 求 由 多 个 时 间 步 完 成 ( 每 两 个 时 钟 周 期 一 步 ) 每 步 处 理 一 个 这 些 地 址 的 无 冲 突 子 集 , 直 到 所 有 地 址 都 已 完 毕 ; 在 每 一 步 , 子 集 从 尚 未 进 行 的 剩 余 地 址 中 构 建 , 过 程 如 下 : 突<br />

5 每 个 成 员 使 用 为 因<br />

节 的 跨 度 来 访 问 。 字<br />

将<br />

32- , 共 享 内 存 还 具 有 广 播 机 制 , 当 处 理 一 个 内 存 读 取 请 求 时 , 可 以 读 取 一 个 后 最<br />

字 并 同 时 广<br />

位<br />

warp 多 个 线 程 。 当 半 到 播<br />

32- 线 程 从 含 有 同 一 个 个 多<br />

字 的 地 址 读 取 时 , 这 将 减 少 存 储 体 冲<br />

指<br />

CUDA 编<br />

1.1 57<br />

由 剩 余 地 址 指 向 其 中 一 个 字 作 为 广 播 字 , 下 列 内 容 包 括 在 子 集 中 : 于 广 播 字 内 的 所 有 地 址 , 择<br />

每 个 存 储 体 的 剩 余 地 址 中 的 一 个 地 址 。 选 择 哪 个 字 作 为 广 播 字 , 以 及 在 每 个 周 期 选 择 哪 个 存 储 体 地 址 都 不 是 特 定 的 。 向<br />

图 5-7<br />

了 一 些 涉 及 广 播 机 制 的 内 存 读 取 访 问 的 示 例 。 示<br />

32- 线 程 从 同 一 个 有 所<br />

地 址 中 读 取 时 。 字<br />

南 Version<br />

warp 的 无 冲 突 情 况 发 生 在 半 见 常


位<br />

: 随 机 排 列 图 5-4. 无 存 储 体 冲 突 的 共 享 内 存 访 问 模 式 示 例 右<br />

程 指<br />

的 线 性 寻 址 字<br />

58<br />

CUDA 编<br />

1.1<br />

32- 跨 度 为 一 个 : 左<br />

南 Version


程 指<br />

个<br />

位<br />

CUDA 编<br />

1.1<br />

跨 度 字 的 线 性 寻 址 。 图 5-5. 无 存 储 体 冲 突 的 共 享 内 存 访 问 模 式 示 例<br />

59<br />

为 3<br />

32-<br />

南 Version


个 位 路 存 储 体 冲 突 。 图 5-6. 有 存 储 体 冲 突 的 共 享 内 存 访 问 模 式 示 例<br />

程 指<br />

32-<br />

60<br />

CUDA 编<br />

1.1<br />

2 跨 度 为 : 左<br />

32-<br />

2 线 性 寻 址 将 导 致 的 字<br />

南 Version<br />

8 跨 度 为 : 右<br />

8 线 性 寻 址 将 导 致 的 字


程 指<br />

路<br />

位<br />

CUDA 编<br />

2<br />

右 : 如 果 在 第 一 步 期 间 选 择 “ 存 储 体 5” 中 的 字 作 为 广 播 字 , 则 此 访 问 模 式 不 会 导 致 任 何 冲 突 , 否 则 会 导 致 存 储 体 冲 突 。 图 5-7. 有 广 播 的 共 享 内 存 读 取 访 问 模 式 示 例<br />

1.1 61<br />

32- 因 为 所 有 线 程 从 同 一 个 : 左<br />

地 址 读 取 , 所 以 此 访 问 模 式 是 无 冲 突 的 。 字<br />

南 Version


的<br />

个<br />

个<br />

类 或<br />

定 每 网 格 的 线 程 总 数 , 设 计 每 块 的 线 程 数 或 网 格 的 块 数 时 应 该 最 大 化 可 用 计 算 资 源 的 利 用 率 。 给<br />

,R 是<br />

,ceil(T,<br />

的<br />

的<br />

是<br />

对<br />

的<br />

大<br />

程 指<br />

的 warp<br />

,T 是<br />

5.1.2.5 寄 存 器<br />

5.2 每 块 的 线 程 数<br />

器 储 体 冲 突 , 可 能 会 发 生 延 迟 。 略 掉 。 存<br />

64<br />

存<br />

是 数<br />

0 , 访 问 寄 存 器 对 于 每 条 指 令 需 要 常 通<br />

外 时 钟 周 期 , 但 是 由 于 寄 存 器 写 后 读 依 赖 关 系 和 寄 , 由 写 后 读 依 赖 关 系 导 致 的 延 迟 就 可 以 被 隐 藏 进 而 忽 额<br />

译 器 和 线 程 调 度 器 尽 可 能 用 方 式 调 度 指 令 , 以 避 免 寄 存 器 存 储 体 冲 突 。 当 每 块 中 的 线 程 倍 数 时 , 可 以 获 得 最 佳 效 果 。 除 了 遵 循 此 规 则 之 外 , 应 用 程 序 无 法 直 接 控 制 寄 存 器 存 编<br />

192 每 个 多 处 理 器 的 活 动 线 程 达 到 要 只<br />

float4 冲 突 。 特 别 地 , 无 需 将 数 据 打 包 为 体 储<br />

int4<br />

。 型<br />

一 步 看 , 当 运 行 一 线 程 块 时 , 如 果 每 块 没 有 足 够 多 线 程 来 掩 盖 加 载 延 迟 的 话 , 则 在 线 程 同 步 期 间 和 设 备 内 存 读 取 期 间 , 每 个 多 处 理 器 将 被 强 制 进 入 空 闲 状 态 。 因 此 , 最 好 的 方 法 是 每 个 多 处 理 器 上 存 在 两 个 或 多 个 活 动 块 , 以 允 许 等 待 的 块 和 可 以 运 行 的 块 同 时 执 行 。 要 让 这 种 情 况 发 生 , 不 仅 块 的 数 目 至 少 应 该 是 设 备 中 多 处 理 器 数 目 的 两 倍 , 而 且 每 块 分 配 进<br />

线 方 式 在 设 备 中 流 过 , 并 在 更 大 程 度 上 分 摊 开 销 。 更<br />

共 享 内 存 量 至 多 应 该 是 每 个 多 处 理 器 可 用 共 享 内 存 总 量 的 一 半 ( 参 见 3.2)。 的<br />

多 线 程 块 以 管<br />

--ptxas-options=-v 选<br />

有 效 的 时 间 分 片 , 但 是 每 块 的 线 程 越 多 , 每 线 程 可 用 的 寄 存 器 就 越 少 。 如 果 内 核 编 译 后 需 要 的 寄 存 器 数 目 大 于 执 行 配 置 所 允 许 的 上 限 , 就 可 能 会 阻 止 内 核 继 续 调 用 。 当 使 用 项 编 译 时 , 可 以 得 到 内 核 编 译 后 需 要 的 寄 存 器 数 目 ( 以 及 本 地 、 共 为<br />

A),B 每 个 多 处 理 器 的 寄 存 器 总 数 ( 参 见 附 录 是 每 个 多 处 理 器 的 活 动 块 数 块 的 线 程 数 最 近 倍 数 向 上 取 整 后 的 值 。 中 其<br />

每<br />

warp 足 够 大 数 目 的 块 , 每 块 线 程 的 数 目 应 选 择 为 了 有<br />

小 的 倍 数 , 以 避 免 使 用 未 充 满<br />

意 味 着 块 的 数 目 应 该 至 少 与 设 备 中 的 多 处 理 器 的 数 目 一 样 多 。 这<br />

64 费 计 算 资 源 , 为 浪 而<br />

数 是 较 好 的 选 择 , 其 原 因 参 见 5.1.2.5。 倍<br />

每 块 分 配 更 多 线 程 有 利 于<br />

32)<br />

1.x 计 算 能 力 于 对<br />

备 , 每 线 程 可 用 的 寄 存 器 数 等 于 : 设<br />

享 和 常 量 内 存 使 用 情 况 )。<br />

62<br />

CUDA 编<br />

1.1<br />

T<br />

32<br />

南 Version


程 指<br />

个<br />

软<br />

个<br />

数<br />

的<br />

256 或<br />

设 备 和 设 备 内 存 之 间 的 带 宽 比 设 备 内 存 和 宿 主 内 存 之 间 的 带 宽 高 得 多 。 因 此 , 用 户 应 该 争 取 最<br />

位<br />

其 是 图 像 处 理 : 数<br />

则<br />

或<br />

区<br />

位<br />

线 比 较 好 , 而 且 通 常 有 足 够 的 寄 存 器 进 行 编 译 。 想 有 效 利 用 未 来 数 代 的 新 块 。 个<br />

。CUDA<br />

程<br />

数 目 ( 参 见 附 录 A) 的 比 率 称 作 多 处 理 器 的 占 有 为 择 执 行 配 置 件 开 发 工 具 包 提 供 了 一 个 电 子 表 格 以 帮 助 编 程 人 员 基 于 共 享 内 存 和 寄 存 器 要 求 来 选 择 线 程 块 大 小 。 大 最<br />

5.3 宿 主 和 设 备 之 间 的 数 据 传 送<br />

64 最 少 含 有 块 每<br />

192 , 并 且 仅 当 每 个 多 处 理 器 有 多 个 活 动 块 时 才 有 意 义 。 每 块 有 程 线<br />

果 想 将 程 序 扩 展 到 将 来 的 设 备 , 则 每 个 网 格 的 块 数 应 该 至 少 是 100; 如<br />

1000 , 可 以 考 虑 每 网 格 备 设<br />

warp 多 处 理 器 的 活 动 个 每<br />

warp 动 活 与<br />

率 (occupancy)。<br />

了 最 大 化 占 有 率 , 编 译 器 尽 量 最 小 化 寄 存 器 使 用 , 而 且 编 程 人 员 需 要 小 心 选<br />

5.4 纹 理 拾 取 与 全 局 或 常 量 内 存 读 取<br />

化 宿 主 和 设 备 之 间 的 数 据 传 送 例 如 , 将 更 多 代 码 从 宿 主 迁 移 到 , 即 使 这 意 味 着 要 使 用 低 并 行 计 算 来 运 行 内 核 。 中 间 数 据 结 构 可 以 在 设 备 内 存 中 创 建 , 由 设 备 操 作 , 销 毁 , 而 且 永 远 不 要 被 宿 主 映 射 , 或 复 制 到 宿 主 内 存 。 小<br />

外 , 由 于 每 次 传 送 都 会 有 开 销 , 所 以 将 许 多 小 的 传 送 合 成 为 一 次 大 的 传 送 要 比 单 独 执 行 每 一 个 小 传 送 要 好 得 多 。 另<br />

后 , 使 用 页 面 锁 定 内 存 时 , 可 以 在 宿 主 和 设 备 之 间 获 得 较 高 带 宽 , 详 见 4.5.1.2。 最<br />

高<br />

不<br />

寻<br />

打<br />

从 全 局 或 常 量 内 存 中 读 取 相 比 , 通 过 纹 理 拾 取 进 行 设 备 内 存 读 取 具 有 下 列 几 个 优 点 : 速 缓 , 如 果 要 被 拾 取 的 纹 理 在 高 速 缓 存 中 , 则 可 以 潜 在 地 获 得 较 高 带 宽 ; 受 访 存 模 式 的 约 束 , 而 全 局 或 常 量 内 存 读 取 则 必 须 遵 循 相 应 访 存 模 式 才 能 获 得 好 的 性 能 与<br />

和<br />

8- 位<br />

计 算 的 延 迟 隐 藏 得 更 好 , 有 时 候 会 改 善 应 用 程 序 执 行 随 机 访 问 数 据 的 性 能 ; 包 的 数 据 可 以 在 单 个 操 作 中 广 播 到 多 个 独 立 变 量 中 。 间 内 浮 点 值 ( 参 址<br />

5.1.2.1 见 参 (<br />

5.1.2.2);<br />

见 4.3.4.1)。<br />

CUDA 编<br />

1.1 63<br />

和 16-<br />

[0.0,1.0] 输 入 数 据 可 以 有 选 择 地 转 化 为 数 整<br />

[-1.0,1.0]<br />

如 果 纹 理<br />

( 参 见 4.3.4.2), 组<br />

硬 件 提 供 了 可 能 适 用 于 不 同 应 用 程 序 的 其 它 功 能 , 尤<br />

的 32<br />

是 CUDA<br />

南 Version


功 能<br />

可 用 ……<br />

限 制 过 滤 纹 理 单 元 之 间 快 速 的 低 精 度 插 值 仅 当 纹 理 参 考 返 回 浮 点 数 据 时 有 效 归 一 化 纹 理 坐 标 独 立 于 分 辨 率 的 编 码<br />

址 模 式 边 界 情 况 的 自 动 处 标 寻<br />

数<br />

步 以 互 相 共 享 数 据 , 进 而 破 坏 了 并 行 性 , 有 两 种 情 况 : 这 些 线 程 属 于 同 一 块 , 这 种 情 况 下 使 并 同 块 , 这 种 情 况 下 , 必 须 使 用 两 个 单 独 的 内 核 调 用 通 过 全 局 内 存 来 共 享 数 据 , 一 个 内 核 调 用 写 入 全 局 内 存 , 另 一 个 从 全 局 内 存 读 取 。<br />

述 ), 就 象 最 大 化 宿 主 和 设 备 之 间 的 并 发 执 行 一 样 。 所<br />

优 化 内 存 使 用 首 先 应 尽 量 不 进 行 低 带 宽 的 传 送 。 这 意 味 着 最 小 化 宿 主 和 设 备 之 间 的 数 据 因 有 时 候 , 最 好 的 优 化 甚 至 可 能 是 通 过 简 单 地 重 新 计 算 数 据 来 避 免 数 据 传 送 , 该 方 法 十 分 有 效 。<br />

5.5 整 体 性 能 优 化 策 略<br />

而 , 在 同 一 内 核 调 用 中 , 纹 理 高 速 缓 存 与 全 局 内 存 写 不 保 持 一 致 , 从 而 对 已 经 在 同 一 内 核 中 通 过 全 局 写 而 写 入 的 某 个 地 址 的 纹 理 拾 取 将 返 回 不 确 定 的 数 据 。 换 句 话 说 , 仅 当 此 内 存 位 置 已 然<br />

理 只 能 用 于 归 一 化 的 纹 理 坐<br />

最<br />

先 前 的 内 核 调 用 或 内 存 复 制 更 新 过 后 , 线 程 才 可 以 通 过 纹 理 安 全 地 读 取 该 内 存 位 置 , 而 对 于 由 同 一 内 核 调 用 的 同 一 个 或 另 一 个 线 程 更 新 过 后 , 线 程 不 能 够 通 过 纹 理 安 全 地 读 取 该 位 置 。 经<br />

能 优 化 围 绕 三 个 基 本 策 略 : 大 化 并 行 执 行 ; 性<br />

CUDA 相 关 性 仅 在 对 线 性 内 存 拾 取 时 才 存 在 , 因 为 内 核 不 能 对 种 这<br />

实 施 写 入 。 组<br />

优<br />

内 存 使 用 以 获 得 最 大 内 存 带 宽 ; 化<br />

化 指 令 使 用 以 获 得 最 大 指 令 吞 吐 量 。 最 大 化 并 行 执 行 的 基 础 是 优 化 算 法 结 构 以 让 数 据 尽 可 能 地 并 行 。 在 算 法 中 , 因 为 一 些 线 程 需 要 优<br />

用 __syncthreads(),<br />

通 过 同 一 内 核 调 用 中 的 共 享 内 存 来 共 享 数 据 ; 或 者 这 些 线 程 属 于 不<br />

设 计 了 算 法 的 并 行 之 后 , 应 尽 可 能 有 效 地 将 其 映 射 到 硬 件 。 通 过 仔 细 选 择 每 个 内 核 调 用 的 执 行<br />

置 来 完 成 此 操 作 , 详 见 5.2。 配<br />

4.5.1.5 程 序 还 可 以 通 过 流 的 方 式 在 设 备 上 显 式 地 并 发 执 行 , 以 获 取 较 高 级 别 的 并 行 ( 如 用 应<br />

送 , 详 见 5.3, 传<br />

为 这 要 比 在 设 备 和 全 局 内 存 之 间 的 数 据 传 送 的 带 宽 低 得 多 。 这 也 意 味 着 通 过<br />

64<br />

CUDA 编<br />

1.1<br />

大 化 设 备 上 共 享 内 存 的 使 用 来 最 小 化 设 备 和 全 局 内 存 之 间 的 数 据 传 送 , 详 见 5.1.2。 最<br />

Version 南 指 程


程 指<br />

和<br />

述 , 对 于 每 种 内 存 类 型 的 不 同 访 存 模 式 , 有 效 带 宽 可 能 所<br />

(intrinsic 替 本<br />

function)<br />

如 5.1.2.1、5.1.2.2、5.1.2.3<br />

B-2 中<br />

5.1.2.4<br />

相 差 一 个 数 量 级 。 因 此 , 优 化 内 存 使 用 的 下 一 步 是 利 用 最 佳 的 访 存 模 式 , 尽 量 优 化 地 组 织 内 存 访 问 。 此 优 化 对 于 全 局 内 存 访 问 尤 其 重 要 , 因 为 全 局 内 存 访 问 的 带 宽 很 低 , 且 其 延 迟 是 数 百 个 时 钟 周 期 ( 参 见 5.1.1.3)。 另 一 方 面 , 共 享 内 存 访 问 也 常 常 值 得 优 化 , 尤 其 是 在 具 有 高 度 的 存 储 体 冲 突 。 会<br />

最 终 结 果 时 用 精 度 换 速 度 , 比 如 使 用 硬 件 函 数 代 常 规 函 数 ( 硬 件 函 数 在 表 这<br />

于 优 化 指 令 使 用 , 应 该 尽 量 不 使 用 具 有 低 吞 吐 量 的 算 术 指 令 ( 参 见 5.1.1.1)。 对<br />

包 括 在 不 影 响<br />

令 , 详 见 5.1.1.2。 指<br />

SIMD ), 或 使 用 单 精 度 而 不 使 用 双 精 度 。 由 于 设 备 的 出 列<br />

质 , 所 以 要 特 别 注 意 控 制 流<br />

CUDA 编<br />

1.1 65<br />

南 Version


程 指<br />

66<br />

CUDA 编<br />

1.1<br />

南 Version


程 指<br />

,C<br />

等<br />

,B 的<br />

C sub<br />

和<br />

的 的 算<br />

录 A)。 以<br />

sub;<br />

的<br />

:A<br />

与 wA))<br />

大<br />

C 的 积<br />

的<br />

仅 能 的 计 算 方 法 , 所 以 在 实 际 应 用 中 , 不 应 按 此 示 例 编 写 矩 阵 相 乘 算 法 。 和<br />

block_size))<br />

sub 具<br />

务 以 下 列 方 式 分 为 多 个 线 任<br />

于 与 低<br />

第 6 章<br />

矩 阵 乘 法 示 例<br />

6.1 概 述<br />

(wA, hA) 为<br />

wA) 的<br />

矩<br />

A 阵<br />

B 的<br />

和<br />

每<br />

个 元 素 。 一<br />

块 程<br />

一 个 子 方<br />

sub 的<br />

内 的 每 个 线 程 负 责 计<br />

乘<br />

示<br />

算 两 个 维 度 分 别 : 计<br />

每 块 的 最 大 线 程 数 ( 参 见 附 所 选<br />

sub 等<br />

(wB,<br />

C 程 块 负 责 计 算 线 个<br />

备 的 资 源 , 这 两 个 矩 形 矩 阵 可 根 据 需 要 划 分 为 许 多 维 度<br />

阵 C<br />

于 两 个 矩 形 矩 阵 的 乘 积<br />

sub 具<br />

sub<br />

且<br />

计<br />

择 C<br />

block_size 度 维<br />

于 16,<br />

warp 块 的 线 程 数 是 每 便<br />

的 倍 数 ( 参 见 5.2), 小<br />

C<br />

/ block_size) 次<br />

为 block_size<br />

6-1 图 如<br />

且 C<br />

(wA, 阵 ( 维 度 为 矩 子<br />

阵 , 并 算 为 这 些 方 阵 的 乘 积 之 和 。 其 中 每 个 乘 积 的 执 行 过 程 是 : 首 先 使 用 每 线 程 加 载 每 个 方 阵 的 一 个 元 素 , 将 两 个 相 应 的 方 阵 从 全 局 内 存 加 载 共 享 内 存 然 后 让 每 个 线 程 计 算 结 果 方 阵 的 一 个 元 素 。 每 一 线 程 将 其 中 每 个 乘 积 的 结 果 累 计 到 寄 存 器 中 , 执 行 完 毕 后 , 将 结 果 写 入 全 局 内 存 。 方<br />

过 以 这 种 方 式 分 块 计 算 , 我 们 可 以 有 效 利 用 快 速 的 共 享 内 存 , 并 节 省 许 多 全 局 内 存 带 宽 , 因 通<br />

有 相 同 的 行 索 引<br />

(block_size, 阵 ( 维 度 为 矩 子<br />

C<br />

有 相 同 的 列 索 引 。 为 了 适 应 设<br />

为 A<br />

B<br />

(wA 局 内 存 读 取 全 从<br />

。<br />

CUDA , 编 写 此 示 例 是 为 了 清 楚 地 说 明 各 种 而 然<br />

程 原 则 , 并 非 是 为 一 般 的 矩 阵 乘 法 提 供 高 性<br />

CUDA 编<br />

1.1 67<br />

南 Version


C 的 算<br />

6-1.<br />

矩 阵 乘 法 图<br />

sub。 块<br />

C sub 的 算<br />

。<br />

程 指<br />

内 的 每 一 线 程 计<br />

一 个 元 素<br />

每 一 线 程 块 计<br />

C 子 矩 阵 个 一<br />

68<br />

CUDA 编<br />

1.1<br />

南 Version


程 指<br />

6.2 源 码 清 单<br />

CUDA 编<br />

1.1 69<br />

南 Version


程 指<br />

70<br />

CUDA 编<br />

1.1<br />

南 Version


程 指<br />

Mul(), <br />

Muld(), 在 作<br />

的<br />

,B<br />

将 在<br />

的 和<br />

cudaFree() 释 用<br />

,Muld() 迭<br />

的<br />

将<br />

的<br />

C 的 中<br />

从<br />

和<br />

分<br />

。。<br />

,Muld()<br />

的 与<br />

和<br />

将<br />

的<br />

C; ; 和<br />

具<br />

的<br />

。<br />

6.3 源 码 攻 略<br />

:<br />

码 包 含 下 列 两 个 函 数<br />

6.3.1 Mul()<br />

源<br />

Mul() 接<br />

指<br />

A 的<br />

包 装 器 的 宿 主 函 数<br />

度 和 宽 度 向 应 该 写 入 宿 主 内 存 高<br />

为 Muld()<br />

设 备 上 执 行 矩 阵 乘 法 的 内 核<br />

指<br />

Mul() 执<br />

使<br />

使<br />

和<br />

从<br />

A 主 内 存 中 宿 向<br />

B<br />

个 指 针 , 两<br />

下 列 输 入 : 受<br />

度 , 宽<br />

调<br />

使<br />

设 备 上 计<br />

行 下 列 操 作<br />

使<br />

用 cudaMalloc()<br />

针 。 足 够 的 全 局 内 存 分 配 指<br />

主 内 存 复 制 到 全 局 内 存 算 C; 宿<br />

给 A、B<br />

6.3.2 Muld()<br />

用 cudaMemcpy()<br />

:<br />

A<br />

B<br />

除 了 指 针 指 向 设 备 内 存 而 非 宿 主 内 存 之 外<br />

有 相 同 的 输 入 参 数<br />

用 Muld()<br />

sub<br />

CUDA 编<br />

1.1<br />

: ; 步 以 确 保 两 个 子 矩 阵 都 由 块 内 的 所 有 线 程 完 全 加 载 ;<br />

71<br />

两 个 子 集 的 乘 积 并 将 其 加 到 上 一 次 迭 代 期 间 获 得 的 乘 积 中 ; 算<br />

用 cudaMemcpy()<br />

C<br />

局 内 存 复 制 回 宿 主 内 存 ; 全<br />

为 A、B<br />

C<br />

的 全 局 内 存 。 配<br />

<br />

同<br />

放<br />

计<br />

B 子 矩 阵 和 个 一<br />

一 个 子 矩 阵 从 全 局 内 存 加 载 到 共 享 内 存 中<br />

Mul()<br />

南 Version<br />

A<br />

对 于 每 个 块<br />

C 理 所 有 需 要 计 算 处 代<br />

A<br />

B<br />

子 矩 阵 。 在 每 次 迭 代 中 , 此 函 数


之<br />

和<br />

所 是 的 和<br />

也<br />

,BLOCK_SIZE<br />

,C<br />

,Muld() 的<br />

所<br />

的<br />

,Muld() 将<br />

和<br />

和<br />

都<br />

。<br />

,tx 在<br />

0<br />

都<br />

再<br />

sub 也<br />

a、b 为 。<br />

和<br />

倍 数 等 的<br />

。<br />

同 步 以 确 保 在 开 始 下 一 次 迭 代 之 前 两 个 子 集 的 乘 积 已 经 完 成 次<br />

一 个 不 同 的 存 储 体 , 而 对 访 存 , 每 个 线 程 都 访 问 同 一 个 存 储 体 问<br />

的<br />

一 旦 所 有 的 子 矩 阵 全 部 处 理 完 毕<br />

相 同 的 访 存 , 每 个 线 程 都 访 是<br />

倍 数 ( 述<br />

5.1.2.1 照 按<br />

5.1.2.4<br />

wA 设 假<br />

wB<br />

的 ty<br />

16<br />

如 5.1.2.1<br />

建 议 的 ), 可 以 确 保 全 局 内 存 合 并 , 因<br />

c<br />

到 15<br />

是 BLOCK_SIZE<br />

于 16。<br />

于 每 个 半 warp, 对<br />

没 有 任 何 共 享 内 存 存 储 体 冲 突 , 所 有 线 程<br />

间 变 化 , 因 此 对<br />

Bs[k][tx]<br />

k<br />

于 As[ty][k]<br />

于 As[ty][tx]、Bs[ty][tx]<br />

计 算 完 毕 其 写 到 全 局 内 存 中 编 写 原 则 是 为 了 最 大 化 内 存 性 能 。 就<br />

72<br />

CUDA 编<br />

1.1<br />

Version 南 指 程


程 指<br />

计<br />

的<br />

的<br />

附 录 A<br />

技 术 规 格<br />

的 多 处 理 器 数 目<br />

计 算 能 力<br />

GeForce 8800 Ultra, 8800 GTX 16 1.0<br />

1.x 有 具<br />

能 力 ( 参 见 3.3) 算<br />

有 设 备 都 遵 循 本 附 录 描 述 的 技 术 规 格 。 所<br />

GeForce 8800 GT 14 1.1<br />

1.1 函 数 仅 可 用 于 计 算 能 力 子 原<br />

备 ( 参 见 4.4.6)。 设<br />

GeForce 8800M GTX 12 1.1<br />

CUDA 给 出 支 持 表 下<br />

有 设 备 的 多 处 理 器 数 目 和 计 算 能 力 : 所<br />

GeForce 8800 GTS 12 1.0<br />

GeForce 8800M GTS 8 1.1<br />

GeForce 8600 GTS, 8600 GT, 8700M GT, 8600M GT, 8600M GS 4 1.1<br />

GeForce 8500 GT, 8400 GS, 8400M GT, 8400M GS 2 1.1<br />

GeForce 8400M G 1 1.1<br />

Tesla S870 4x16 1.0<br />

Tesla D870 2x16 1.0<br />

Tesla C870 16 1.0<br />

Quadro Plex 1000 Model S4 4x16 1.0<br />

Quadro Plex 1000 Model IV 2x16 1.0<br />

Quadro FX 5600 16 1.0<br />

Quadro FX 4600 12 1.0<br />

Quadro FX 1700, FX 570, NVS 320M, FX 1600M, FX 570M 4 1.1<br />

Quadro FX 370, NVS 290, NVS 140M, NVS 135M, FX 360M 2 1.1<br />

Quadro NVS 130M 1 1.1<br />

CUDA 编<br />

1.1 73<br />

南 Version


维<br />

、y 维<br />

线<br />

数<br />

数<br />

万<br />

维<br />

的<br />

;<br />

;<br />

存 在 动 态 可 配 置 的 取 整 模 式 ; 负<br />

个<br />

结 果 设 为 零 ; 是 符 合 标 准 的 ; 溢<br />

分<br />

8; 是<br />

个<br />

(FMAD)<br />

标<br />

个<br />

27;<br />

和<br />

和<br />

16, 最 13;<br />

15;<br />

的<br />

个<br />

A.1 通 用 规 范<br />

每<br />

线<br />

的 最 大 大 小 分 别<br />

4.5.2.2 内 存 的 时 钟 频 率 和 总 量 可 以 使 用 运 行 时 来 查 询 ( 参 见 备 设<br />

4.5.3.2)。<br />

程<br />

线<br />

warp 的<br />

每<br />

线 程 个<br />

512 块 最 多 包 含 程 线<br />

每<br />

常<br />

x 的 块 程<br />

和 z<br />

常<br />

是 512、512<br />

纹<br />

64;<br />

每<br />

块 网 格 的 每 个 维 的 最 大 大 小 是 65535; 程<br />

每<br />

32 是 小 大<br />

每<br />

多 处 理 器 的 活 动 块 的 最 大 数 目 最 大 数 目 个<br />

多 处 理 器 寄 存 器 的 数 目 是 8192; 个<br />

对<br />

多 处 理 器 可 用 的 共 享 内 存 量 是 16KB, 个<br />

成 16<br />

大 高 度 是 2<br />

储 体 ( 参 见 5.1.2.4)。 存<br />

内 存 的 总 量 是 64KB; 量<br />

对<br />

内 存 的 高 速 缓 存 工 作 集 是 每 个 多 处 理 器 8KB; 量<br />

内 存 的 高 速 缓 存 工 作 集 是 每 个 多 处 理 器 8KB; 理<br />

对<br />

一 于 绑 定 到 二 warp 处 理 器 的 活 动 多 个<br />

是 24;<br />

内<br />

多 处 理 器 的 活 动 线 程 的 最 大 数 目 是 768; 个<br />

每<br />

维 CUDA<br />

2 纹 理 参 考 , 最 大 宽 度 是 的 组<br />

维 CUDA<br />

2 纹 理 参 考 , 最 大 宽 度 是 的 组<br />

A.2 浮 点 标 准<br />

程 。 线<br />

2 定 到 线 性 内 存 的 纹 理 参 考 , 最 大 宽 度 是 绑 于<br />

200 小 的 限 制 为 大 核<br />

原 生 指 令 ; 条<br />

加<br />

;<br />

, 但 存 在 下 列 不 同 : 准<br />

8 处 理 器 由 多 个<br />

4 器 组 成 , 所 以 在 理 处<br />

warp 周 期 内 多 处 理 器 能 够 处 理 钟 时<br />

除<br />

法 是 通 过 非 标 准 的 方 式 求 倒 数 来 实 现 的 ; 中<br />

平<br />

根 是 通 过 非 标 准 的 方 式 求 平 方 根 倒 数 来 实 现 的 ; 于 加 法 和 乘 法 , 通 过 静 态 取 整 模 式 仅 支 持 取 整 到 最 接 近 的 偶 数 和 向 零 取 整 ; 不 支 持 直 接 方<br />

32<br />

对<br />

不<br />

不<br />

74<br />

CUDA<br />

支 持 非 规 格 化 数 ; 浮 点 算 术 和 比 较 指 令 在 浮 点 操 作 之 前 将 非 规 格 化 操 作 数 转 换 为 零<br />

编<br />

;<br />

1.1<br />

用 于 检 测 浮 点 异 常 的 机 制 , 而 且 始 终 隐 藏 掩 码 浮 点 异 常 , 但 当 异 常 发 生 时 , 掩 码 响 应 有<br />

IEEE-754 设 备 遵 循 单 精 度 二 进 制 浮 点 算 术 的 算 计<br />

下<br />

法 和 乘 法 一 般 被 合 并 到 单 个 乘 加 指 令<br />

没<br />

/ 无 穷 大 取 整 ; 正 向<br />

Version 南 指 程


程 指<br />

的 的 输<br />

x86<br />

或<br />

。 对 于 计 算 设 备 , 其 做 法 是 将 其 夹 合 到 支 持 范 围 的 终 点 。 这 和 体 系 结 构 的 做 法 是 不 同 的 。 的 标<br />

NaN。 注<br />

是 NaN,<br />

Signaling NaN 不<br />

包<br />

IEEE-754R 标<br />

的<br />

准 , 当 浮 点 值 超 出 整 数 格 式 的 范 围 时 , 从 浮 点 值 到 整 数 值 的 转 换 保 留 为 不 确 定 则<br />

0x7fffffff 操 作 的 结 果 是 位 模 式 为 的 入<br />

Quiet<br />

IEEE-754 据 根<br />

fminf()、fmin()、fmaxf() 如 果 , 准<br />

fmax()<br />

输 入 参 数 之 一<br />

支 持 。 受<br />

NaN 个 或 多 个 一 含<br />

意 , 按 照<br />

而 另 一 个 不 是 NaN,<br />

NaN 是 非 果 结<br />

个 参 数 。 那<br />

CUDA 编<br />

1.1 75<br />

南 Version


程 指<br />

76<br />

CUDA 编<br />

1.1<br />

南 Version


程 指<br />

列<br />

中<br />

运<br />

兼<br />

都 映 射 为 单 个 指 令 。<br />

B.2 中 而<br />

但 ulp。<br />

映<br />

函 数 仅 在 设 备 函 数 中 使 用 。 的<br />

和 误 差 )<br />

范 围 ) 全<br />

全 范 围 )<br />

。truncf()、ceilf() 和 原 而<br />

附 录 B<br />

数 学 函 数<br />

B.1 中<br />

B.1 共 用<br />

宿 主 和 设 备 函 数 使 用 , 由 数 函 的<br />

共 用 运 行 时 组 件<br />

floorf() 也<br />

B-1 表 下<br />

CUDA 了 出<br />

时 库 支 持 的 所 有 数 学 标 准 库 函 数 。 它 还 指 出 每 个 在 设 备 上 执 行 时 的 误 差 界 。 这 些 误 差 界 还 适 用 于 当 宿 主 不 支 持 此 函 数 时 , 在 宿 主 上 执 行 此 函 数 的 情 况 。 这 些 误 差 界 不 保 证 在 所 有 情 况 下 均 成 立 , 因 为 虽 进 行 了 广 泛 测 试 但 还 没 有 穷 尽 所 有 设 备 。 行<br />

从 而 截 断 了 乘 法 的 中 间 结 果 。 射 令 序 列 , 射 为 单 个 指 令 ,<br />

IEEE 和 乘 法 是 与 法 加<br />

是 , 加 法 和 乘 法 通 常 合 并 到 单 个 乘 加<br />

CUDA 运<br />

0.5 , 因 此 最 大 误 差 为 的 容<br />

(FMAD) 令 指<br />

荐 的 做 法 是 将 浮 点 操 作 数 取 整 为 整 数 , 结 果 为 浮 点 数 应 使 用 rintf(), 推<br />

非 roundf()。<br />

x/y 2(<br />

roundf() 是 因<br />

为 8<br />

1/x 1(<br />

而 rintf()<br />

1/sqrtf(x)<br />

B-1. 有 最 大 ULP 误 差 的 数 学 标 准 库 函 数 表<br />

rsqrtf(x)<br />

min() 库 还 支 持 映 射 为 单 个 指 令 的 整 数 时 行<br />

sqrtf(x) 3(<br />

cbrtf(x) 1(<br />

函 数<br />

2( 全 范 围 max()。<br />

hypotf(x) 3(<br />

大 最 大 ulp<br />

expf(x) 2(<br />

exp2f(x) 2(<br />

exp10f(x) 2(<br />

expm1f(x) 1(<br />

logf(x) 1(<br />

log2f(x) 3(<br />

log10f(x) 3(<br />

CUDA 编<br />

1.1 77<br />

全 范 围 )<br />

log1pf(x) 2(<br />

南 Version


16( powf(x,y)<br />

tgammaf(x)<br />

全<br />

全 11(<br />

范 围 ) 全<br />

全 范 围 )<br />

范 围 ) 全<br />

程 指<br />

sinf(x)<br />

cosf(x)<br />

tanf(x)<br />

sincosf(x,sptr,cptr)<br />

4( asinf(x)<br />

acosf(x)<br />

2(<br />

3( 4( 2(<br />

atanf(x) 2(<br />

atan2f(y,x) 3(<br />

sinhf(x) 3(<br />

coshf(x) 2(<br />

tanhf(x) 2(<br />

asinhf(x) 3(<br />

acoshf(x) 4(<br />

atanhf(x) 3(<br />

全 范 围 )<br />

erff(x) 4(<br />

全 范 围 )<br />

erfcf(x) 8(<br />

范 围 ) 全<br />

lgammaf(x) 6(<br />

... -2.264; 内<br />

全 范 围 )<br />

fmaf(x,y,z) 0(<br />

frexpf(x,exp) 0(<br />

范 围 ) 全<br />

ldexpf(x,exp) 0(<br />

范 围 ) 全<br />

-10.001 距 间 外<br />

距 更 大 ) 间<br />

scalbnf(x,n) 0(<br />

范 围 ) 全<br />

scalblnf(x,l) 0(<br />

范 围 ) 全<br />

logbf(x) 0(<br />

范 围 ) 全<br />

ilogbf(x) 0(<br />

范 围 ) 全<br />

fmodf(x,y) 0(<br />

范 围 ) 全<br />

remainderf(x,y) 0(<br />

范 围 ) 全<br />

78<br />

CUDA 编<br />

1.1<br />

remquof(x,y,iptr) 0(<br />

modff(x,iptr) 0(<br />

fdimf(x,y) 0(<br />

truncf(x) 0(<br />

南 Version


程 指<br />

范 围 ) 全<br />

全 范 围 )<br />

适 用 不<br />

不 适 用<br />

roundf(x)<br />

rintf(x)<br />

nearbyintf(x)<br />

ceilf(x) floorf(x) 0( lrintf(x) 0(<br />

lroundf(x) 0(<br />

llrintf(x) 0(<br />

llroundf(x) 0(<br />

signbit(x)<br />

isinf(x)<br />

isnan(x)<br />

isfinite(x)<br />

copysignf(x,y)<br />

fminf(x,y)<br />

fmaxf(x,y)<br />

fabsf(x)<br />

nanf(cptr)<br />

nextafterf(x,y)<br />

CUDA 编<br />

1.1 79<br />

南 Version


列<br />

小<br />

__ffsll() 返 则<br />

中<br />

有<br />

返<br />

函<br />

个 位 的<br />

返<br />

位<br />

和 的 到 的 到<br />

完 中 中<br />

函<br />

的 个<br />

完<br />

和<br />

的<br />

大<br />

与<br />

和 位<br />

的<br />

的<br />

的<br />

的<br />

位<br />

和<br />

之<br />

程 指<br />

的<br />

126 < y < 2 如<br />

个 个 。<br />

128, 。<br />

是<br />

位<br />

个<br />

位<br />

__ffs(x)<br />

是 则<br />

B.2 设 备 运 行 时 组 件<br />

__fadd_rz(x,y) 使<br />

__fmul_rz(x,y) 使<br />

。 和<br />

这 些 函 比 。<br />

126 < y < 2 128,__fdividef(x,y)<br />

为 零 乘 无 穷 大 的 结 果 ), 而 普 通 除 法 则 返 回 无<br />

表 B-2<br />

GPU 在 设 备 代 码 中 支 持 的 硬 件 函 数 。 这 些 硬 件 函 数 的 误 差 界 是 特 定 于 仅 出<br />

x 是<br />

。<br />

果<br />

数 不 太 精 确 , 但 却 是 表 B-1<br />

些 函 数 的 快 速 版 本 ; 它 们 具 有 相 同 名 称 , 但 加 上 了 前 缀 __( 一<br />

__[u]mul24(x,y)<br />

最 低 有 效 位 。 忽 和 计<br />

如 __sinf(x))。<br />

x 零 取 整 的 取 整 模 式 计 算 浮 点 参 数 向 用<br />

y<br />

最 低 有 效 位 数 据 的 乘 积 , 并 返 回 结 果<br />

y<br />

__fdividef(x,y) 浮 点 除 法 和 通 普<br />

2 的 精 度 , 但 对 于 同 相<br />

x 零 取 整 的 取 整 模 式 计 算 浮 点 参 数 乘 积 的 结 果 为 零 , 而 普 通 除 法 可 以 获 得 正 确 结 果 , 精 度 见 另 外 , 对 用 向<br />

大 。 穷 作<br />

表 B-1。<br />

__[u]mulhi(x,y) 计<br />

于 2<br />

__fdividef(x,y) 大 , 则 穷 无<br />

回 NaN(<br />

__[u]mul64hi(x,y) 计<br />

x 数 参 数 整 算<br />

y<br />

24<br />

的 32<br />

略 x<br />

y<br />

8<br />

高 位 。 最<br />

__clz(x) 返<br />

x 数 参 数 整 算<br />

y<br />

64- , 并 传 递 积 乘<br />

的 32<br />

最 高 位<br />

算 64<br />

x 参 数 数 整<br />

y<br />

果 于 1, 则 返 回 x。 结<br />

128- , 并 传 递 积 乘<br />

64 的 果 结<br />

__clzll(x) 返<br />

x 果 如<br />

__saturate(x) 则 0, 于<br />

x 如 果 0, 回<br />

最 高 位<br />

__[u]sad(x,y,z)( 绝<br />

__ffs(x) 返<br />

z 差 和 ) 返 回 整 数 参 数 误 对<br />

x 参 数 数 整<br />

y<br />

绝 对 值 的 和 。 ) 开 始 填 充 差<br />

开 始 )<br />

__ffsll(x) 返<br />

0 于 并 包 含 介 回<br />

32<br />

x , 并 且 从 整 数 参 数 字 数<br />

31 位 ( 例 如 高 最<br />

0 于 并 包 含 回 整 数 参 介 回<br />

64<br />

x , 并 且 在 整 数 参 数 数 字<br />

一 ( 最 低 ) 位 的 位 置 。 最 低 位 是 位 全 相 同 。 第 。<br />

63 位 ( 例 如 高 最<br />

续 零 。 填 充 连 续 零 。 连<br />

返<br />

全 相 同<br />

回 64-<br />

Linux 这 与 0。 回<br />

数 x<br />

一 ( 最 低 ) 位 的 位 置 。 最 低 位 是 位 置 1。 如 第<br />

果 x<br />

0,<br />

x 如 果 1。 置<br />

0,<br />

数 ffsll<br />

Linux 这 与 0。 回<br />

数 ffs<br />

x 参 数 数 整<br />

80<br />

CUDA 编<br />

1.1<br />

南 Version


程 指<br />

兼<br />

兼<br />

误<br />

与 在 误<br />

x<br />

x 误 在 大 果 如<br />

与 不 适 用<br />

适 用 不<br />

的<br />

误<br />

+ floor(abs(2.95 * x))。<br />

界<br />

-24, -21.41, 否 -22,<br />

-21.19, 否<br />

* (1 / __cosf(x))。<br />

一 和<br />

* __log2f(x))。<br />

CUDA 运<br />

__fadd_rz(x,y)<br />

__fmul_rz(x,y)<br />

__fdividef(x,y) 如<br />

__expf(x)<br />

误 在<br />

-126 , 2 126 ] 区<br />

+ floor(abs(1.16 * x))。<br />

函 数<br />

误 差 界<br />

容 。<br />

表 B-2.<br />

1.x 库 支 持 的 硬 件 函 数 以 及 对 于 计 算 能 力 时 行<br />

设 备 的 各 自 误 差<br />

IEEE<br />

__exp10f(x)<br />

__logf(x)<br />

2] 区<br />

-21.41, 否<br />

是 2。 差<br />

IEEE<br />

果 y<br />

[2<br />

ulp , 则 最 大 内 间<br />

则 , 最<br />

__log2f(x)<br />

2] 区<br />

2 是 差<br />

__log10f(x)<br />

2] 区<br />

2 是 差<br />

[0.5,<br />

2 , 则 最 大 绝 对 误 差 是 内 间<br />

ulp<br />

ulp 最 大 则 , 最<br />

如 果 x<br />

__sinf(x)<br />

[-π, π] 区<br />

大 ulp<br />

3。<br />

2。<br />

是 3。 差<br />

[0.5,<br />

2 , 则 最 大 绝 对 误 差 是 内 间<br />

则 , 最<br />

则 会 更<br />

如 果 x<br />

__cosf(x)<br />

[-π, π] 区<br />

大 ulp<br />

则 会 更<br />

[0.5,<br />

2 , 则 最 大 绝 对 误 差 是 内 间<br />

x 如 果<br />

。 大<br />

__sincosf(x,sptr,cptr)<br />

。<br />

大 ulp<br />

__tanf(x)<br />

。 样<br />

2 , 则 最 大 绝 对 误 差 是 内 间<br />

__powf(x, y)<br />

__mul24(x,y)<br />

__umul24(x,y)<br />

__mulhi(x,y)<br />

__umulhi(x,y)<br />

__int_as_float(x)<br />

2 , 则 最 大 绝 对 误 差 是 内 间<br />

exp2f(y 现 来 自 实 其<br />

sinf(x)<br />

cosf(x)<br />

__sinf(x) 现 来 自 实 其<br />

__float_as_int(x)<br />

__saturate(x)<br />

__sad(x,y,z)<br />

__usad(x,y,z)<br />

__clz(x)<br />

__ffs(x)<br />

CUDA 编<br />

1.1 不 适 用<br />

81<br />

南 Version


程 指<br />

82<br />

CUDA 编<br />

1.1<br />

南 Version


程 指<br />

。<br />

的<br />

的<br />

的<br />

位<br />

位<br />

位<br />

计<br />

计<br />

并<br />

+ val), 并<br />

- val), 并<br />

回 全 局 内 存 的 同 一 地 址 。 这 存<br />

附 录 C<br />

原 子 函 数<br />

C.1 算 术 函 数<br />

C.1.1<br />

子 函 数 仅 可 用 于 设 备 函 数 中<br />

atomicAdd()<br />

原<br />

将 结 果 存 回 全 局<br />

C.1.2<br />

atomicSub()<br />

位 于 全 局 内 存 中 的 地 取 读<br />

址 address<br />

32-<br />

将 结 果 存 回 全 局<br />

字 old,<br />

算 (old<br />

存 的 同 一 地 址 。 这 三 个 操 作 在 一 个 原 子 事 务 处 理 中 执 行 。 函 数 返 回 old。 内<br />

C.1.3<br />

atomicExch()<br />

位 于 全 局 内 存 中 的 地 取 读<br />

址 address<br />

32-<br />

字 old,<br />

算 (old<br />

存 的 同 一 地 址 。 这 三 个 操 作 在 一 个 原 子 事 务 处 理 中 执 行 。 函 数 返 回 old。 内<br />

字 old,<br />

CUDA 编<br />

1.1 83<br />

address 位 于 全 局 内 存 中 的 地 址 取 读<br />

32-<br />

个 操 作 在 一 个 原 子 事 务 处 理 中 执 行 。 函 数 返 回 old。 两<br />

将 val<br />

南 Version


val : (old-1)), 并<br />

较 并 交 换 )。<br />

的<br />

的<br />

的<br />

的<br />

的<br />

位<br />

位<br />

位<br />

位<br />

位<br />

计<br />

计<br />

计<br />

计<br />

计<br />

和<br />

和<br />

的<br />

的<br />

>= val) ? 0 : (old+1)),<br />

== compare ? val : old),<br />

指 程<br />

C.1.4<br />

atomicMin()<br />

C.1.5<br />

atomicMax()<br />

address 位 于 全 局 内 存 中 的 地 址 取 读<br />

32-<br />

字 old,<br />

算 old<br />

val<br />

小 值 , 并 将 结 果 存 回 全 局 内 存 的 同 一 地 址 。 这 三 个 操 作 在 一 个 原 子 事 务 处 理 中 执 行 。 函 数 返 回 old。<br />

最<br />

C.1.6<br />

atomicInc()<br />

address 位 于 全 局 内 存 中 的 地 址 取 读<br />

32-<br />

字 old,<br />

算 old<br />

C.1.7<br />

atomicDec()<br />

val<br />

大 值 , 并 将 结 果 存 回 全 局 内 存 的 同 一 地 址 。 这 三 个 操 作 在 一 个 原 子 事 务 处 理 中 执 行 。 函 数 返 最<br />

回 old。<br />

== 0) | (old > val)) ?<br />

address 位 于 全 局 内 存 中 的 地 址 取 读<br />

行 。 函 数 返<br />

将 结 果 存 回 全 局 内 存 的 同 一 地 址 。 这 三 个 操 作 在 一 个 原 子 事 务 处 理 中 执<br />

32-<br />

字 old,<br />

算 ((old<br />

C.1.8<br />

atomicCAS()<br />

将 结 果 存 回 全 局 内 存 的 同 一 地 址 。 这 三 个 操 作 在 一 个 原 子 事 务 处 理 中 执 行 。 函 数 返 回 old。 并<br />

回 old。<br />

84<br />

CUDA 编<br />

1.1<br />

比<br />

读 取 位 于 全 局 内 存 中 的 地<br />

并 将 结 果 存 回 全 局 内 存 的 同 一 地 址 。 这 三 个 操 作 在 一 个 原 子 事 务 处 理 中 执 行 。 函 数 返<br />

址 address<br />

32-<br />

字 old,<br />

算 (((old<br />

南 Version<br />

回 old(<br />

32-<br />

字 old,<br />

算 (old<br />

address 位 于 全 局 内 存 中 的 地 址 取 读


程 指<br />

的<br />

的<br />

的<br />

位<br />

位<br />

位<br />

计<br />

计<br />

计<br />

& val), 并<br />

| val), 并<br />

^ val), 并<br />

C.2 位 函 数<br />

C.2.1<br />

atomicAnd()<br />

将 结 果 存 回 全 局<br />

C.2.2<br />

atomicOr()<br />

位 于 全 局 内 存 中 的 地 取 读<br />

址 address<br />

32-<br />

将 结 果 存 回 全 局<br />

字 old,<br />

算 (old<br />

存 的 同 一 地 址 。 这 三 个 操 作 在 一 个 原 子 事 务 处 理 中 执 行 。 函 数 返 回 old。 内<br />

C.2.3<br />

atomicXor()<br />

位 于 全 局 内 存 中 的 地 取 读<br />

址 address<br />

32-<br />

将 结 果 存 回 全 局<br />

字 old,<br />

算 (old<br />

存 的 同 一 地 址 。 这 三 个 操 作 在 一 个 原 子 事 务 处 理 中 执 行 。 函 数 返 回 old。 内<br />

address 位 于 全 局 内 存 中 的 地 址 取 读<br />

32-<br />

字 old,<br />

算 (old<br />

存 的 同 一 地 址 。 这 三 个 操 作 在 一 个 原 子 事 务 处 理 中 执 行 。 函 数 返 回 old。 内<br />

CUDA 编<br />

1.1 85<br />

南 Version


程 指<br />

86<br />

CUDA 编<br />

1.1<br />

南 Version


程 指<br />

记<br />

有<br />

中<br />

还<br />

例 是<br />

风 是<br />

风<br />

的<br />

因<br />

。<br />

代<br />

之<br />

编<br />

编 。<br />

编 译 的 源 码 中 。 见<br />

附 录 D<br />

运 行 时 API 参 考<br />

时 API<br />

层 API(cuda_runtime_api.h) 低<br />

C<br />

nvcc 接 口 , 不 需 要 使 用 的 格<br />

D.1 设 备 管 理<br />

默 认 参 数 包 装 了 一 些 低 译 器 进 行 编 译 。 高 和<br />

层 API(cuda_runtime.h) 高<br />

C++<br />

运 行<br />

个 级 别 。 两<br />

API 接 口 , 构 建 于 低 层 的 格<br />

上 。 它 使 用 重 载 、 引 用 译<br />

装 器 , 其 中 包 装 了 处 理 符 号 、 纹 理 和 设 为 它 们 依 赖 于 要 由 编 译 器 生 成 的 代 码 ( 参 包<br />

层 API<br />

C++ 这 些 包 装 器 可 以 在 。 程<br />

C++ 使 用 , 并 可 以 使 用 中 码<br />

D.1.1<br />

述 的 调 用 内 核 的 执 行 配 置 语 法 , 它 仅 可 用 于 使<br />

cudaGetDeviceCount()<br />

描<br />

层 API<br />

CUDA 一 些 特 定 于 有 具<br />

函 数 的 低 级 功 能 。 这 些 包 装 器 需 要 使 用 nvcc, 备<br />

4.2.5)。 例<br />

如 4.2.3<br />

*count 中 在<br />

cudaGetDeviceCount()<br />

可 供 执 行 的 计 算 能 力 大 于 或 等 返 仅 支 持 设 备 仿 真 模 式 , 且 其 计 算 能 力 小 回 返<br />

的<br />

用 nvcc<br />

D.1.2<br />

cudaSetDevice()<br />

于 1.0。<br />

设 备 数 。 如 果 没 有 这 样 的 设 备 , 则<br />

D.1.3<br />

cudaGetDevice()<br />

活 动 宿 主 线 程 执 行 设 备 代 码 所 在 的 设 备 为 录<br />

于 1.0<br />

0 设 备 1, 回<br />

将 dev<br />

CUDA 编<br />

1.1 87<br />

南 Version


*dev 中 在<br />

*prop 中 在<br />

name 是 :<br />

的<br />

字<br />

个<br />

程 指<br />

D.1.4<br />

cudaGetDeviceProperties()<br />

活 动 宿 主 线 程 执 行 设 备 代 码 所 在 的 设 备 回 返<br />

。cudaDeviceProp<br />

。<br />

结<br />

dev 设 备 回 返<br />

属 性<br />

定 义 为 : 构<br />

totalGlobalMem 是 设 备 上 可 用 的 全 局 内 存 总 量 , 单 位 为 字 节 ; 其 中<br />

可 用 的 共 享 内 存 总 量 , 单 位 为 字 节 ; 块 每<br />

sharedMemPerBlock 是<br />

regsPerBlock<br />

warpSize 是 大 是<br />

块 可 用 的 寄 存 器 总 数 ; 每<br />

ASCII 标 识 设 备 的 于 用<br />

串 ; 符<br />

memPitch 是<br />

中<br />

maxThreadsPerBlock 是<br />

参<br />

maxThreadsDim[3] 是<br />

warp<br />

; 小<br />

maxGridSize[3] 是<br />

totalConstMem<br />

major 和 是 块 最 大 线 程 数 ; 每<br />

备 上 可 用 的 常 量 内 存 总 量 , 单 位 为 字 节 ; ; 设<br />

88<br />

理 基 址 不 再 需 要 那 种 应 用 于 纹 理 拾 取 的 偏 移 。 纹<br />

CUDA 编<br />

字 节 的<br />

1.1<br />

D.5<br />

内 存 复 制 函 数 允 许 的 最 大 节 距 , 包 括 cudaMallocPitch()( 的<br />

见<br />

分 配 的 内 存 区 域 ;<br />

D.5.2)<br />

clockRate 是<br />

textureAlignment 是<br />

中<br />

块 网 格 的 每 个 维 度 最 大 大 小 ; 每<br />

义 设 备 计 算 能 力 的 主 要 和 次 要 修 订 号 时 钟 频 率 , 单 位 为 千 赫 ; 定<br />

minor<br />

南 Version<br />

4.3.4.3<br />

textureAlign 的 对 齐 要 求 ; 已 经 对 齐 为 绍 介


*dev 中 在<br />

*prop 最 与<br />

cudaThreadSynchronize()<br />

, 直 到 设 备 完 成 所 有 先 前 请 求 的 任 务 为 止 。 如 果 先 前 任 务 之 一 失 败 , 则 返 塞 阻<br />

。cudaThreadExit() 在<br />

。<br />

调<br />

用 会 重 新 初 始<br />

D.1.5<br />

cudaChooseDevice()<br />

D.2 线 程 管 理<br />

D.2.1<br />

回 其 属 性 佳 匹 配 的 设 备<br />

cudaThreadSynchronize()<br />

返<br />

错 误 。 回<br />

D.2.2<br />

cudaThreadExit()<br />

D.3 流 管 理<br />

时 行 运 化<br />

流 管 理<br />

主 线 程 退 出 时 隐 式 调 用 。 宿<br />

API 地 清 除 与 调 用 宿 主 线 程 相 关 联 的 所 有 与 运 行 时 相 关 的 资 源 。 任 何 后 续 式 显<br />

D.3.1<br />

cudaStreamCreate()<br />

D.3.2<br />

D.3.3<br />

cudaStreamQuery()<br />

建 流 。 创<br />

cudaStreamSynchronize()<br />

否<br />

D.3.4<br />

cudaStreamDestroy()<br />

塞 , 直 到 设 备 完 成 流 中 的 所 有 操 作 为 止 。 阻<br />

则 , 返<br />

CUDA 程 指 编<br />

1.1 89<br />

果 流 中 的 所 有 操 作 都 已 完 成 , 返 回 cudaSuccess, 如<br />

回 cudaErrorNotReady。<br />

南 Version


非<br />

和<br />

或<br />

确<br />

尚<br />

微<br />

在 CUDA<br />

D.4 事 件 管 理<br />

毁 流 。 销<br />

D.4.1<br />

cudaEventCreate()<br />

D.4.2<br />

cudaEventRecord()<br />

建 事 件 。 创<br />

cudaEventQuery()<br />

stream 事 件 。 如 果 录 记<br />

D.4.3<br />

cudaEventQuery()<br />

/ cudaEventSynchronize()<br />

事 件 实 际 已 经 记 录 的 时 间 。 定<br />

则 在 流 中 的 所 有 先 前 操 作 都 已 完 成 之 后 记 录 事 件 ; 否 则 , 上 下 文 中 的 所 有 先 前 操 作 都 已 完 成 之 后 记 录 事 件 。 因 为 此 操 作 是 异 步 的 , 所 以 必 须 使 用<br />

0,<br />

已 经 调 用 , 但 事 件 尚 未 记 录 , 则 此 函 数 返 回 如<br />

cudaErrorInvalidValue。<br />

cudaEventRecord()<br />

事 件 实 际 已 经 记 录 , 返 尚 果 如<br />

否<br />

如<br />

D.4.4<br />

cudaEventSynchronize()<br />

果 cudaEventRecord()<br />

则 , 返<br />

果<br />

未 在 此 事 件 上 调 用 , 则 此 函<br />

D.4.5<br />

cudaEventDestroy()<br />

返 数<br />

回 cudaSuccess,<br />

回 cudaErrorNotReady。<br />

在 此 事 件 上 调 用 , 则 此 函 数 返 回 cudaErrorInvalidValue。 未<br />

回 cudaErrorInvalidValue。<br />

D.4.6<br />

cudaEventElapsedTime()<br />

毁 事 件 。 销<br />

90<br />

CUDA 编<br />

1.1<br />

)。 如 果 任 一 事 件 尚 未 记 录 , 则 秒<br />

cudaEventRecord() , 直 到 事 件 实 际 已 经 记 录 为 止 。 如 果 塞 阻<br />

Version 南 指 程<br />

0.5 两 个 事 件 之 间 用 去 的 时 间 ( 以 毫 秒 计 , 分 辨 率 约 为 算 计


程 指<br />

数<br />

内<br />

个<br />

指<br />

个<br />

的<br />

中<br />

0 流 非<br />

执<br />

,devPtr 必<br />

记 录 , 则 此 结 果 是 不 确<br />

返<br />

中<br />

在<br />

数<br />

数<br />

返 或<br />

果 任 一 事 件 已 经 使 用<br />

D.5 内 存 管 理<br />

的 。 定<br />

D.5.1<br />

cudaMalloc()<br />

如<br />

函 数 返 回 cudaErrorInvalidValue。 此<br />

返 回 指 向 已 分 配 内 存 的 指 针 。 已 分 配<br />

D.5.2<br />

设 备 上 分<br />

cudaMallocPitch()<br />

在<br />

cudaErrorMemoryAllocation。<br />

配 count<br />

*devPtr 的 线 性 内 存 , 并 在 节 字<br />

中<br />

cudaMalloc() 相 应 对 齐 为 任 何 种 类 的 变 量 。 分 配 的 内 存 是 未 清 除 的 。 如 果 失 败 , 则 存 内<br />

回<br />

由<br />

行 节 距 分 配 。 由 于 硬 件<br />

widthInBytes*height 备 上 分 配 至 少 设 在<br />

*devPtr 的 线 性 内 存 , 并 在 节 字<br />

返 回 指 向 已<br />

配 内 存 的 指 针 。 函 数 可 以 填 补 分 配 以 确 保 任 何 给 定 行 中 的 相 应 指 针 将 继 续 满 足 对 齐 要 求 , 以 组 中 分<br />

当 地 址 在 行 之 间 更 新 时 进 行 内 存 合 并 ( 参 见 5.1.2.1)。 便<br />

cudaMallocPitch()<br />

D.5.3<br />

cudaFree()<br />

*pitch<br />

组 元 素 的 行 和 列 , 地 址 计 算 为 : 数<br />

2D 的 节 距 是 分 配 的 字 节 数 宽 度 。 节 距 的 设 计 用 途 是 作 为 单 独 的 分 配 参 数 , 用 于 计 算 回 返<br />

T 址 。 给 定 类 型 地 的<br />

cudaMallocPitch() 的<br />

为<br />

以<br />

2D 于 对<br />

cudaMallocPitch() 分 配 , 建 议 编 程 人 员 考 虑 使 用 的 组<br />

CUDA 节 距 对 齐 限 制 , 如 果 应 用 程 序 将 在 设 备 内 存 的 不 同 区 域 ( 不 管 是 线 性 内 存 还 是 的 中<br />

组 )<br />

2D 执 行 间 之<br />

复 制 , 这 时 更 应 该 使 用 此 函 数 。 存<br />

cudaFree(devPtr) 返 回 。 否 则 , 如 果 用 调<br />

前 已 经 调 用 , 则 返 回<br />

CUDA 编<br />

1.1 91<br />

devPtr 由 放 释<br />

向 的 内 存 空 间<br />

cudaMalloc() 经 由 对 已 须<br />

cudaErrorInvalidDevicePointer。<br />

devPtr 。 如 果 误 错<br />

cudaFree() 不 执 行 任 何 操 作 。 如 果 失 败 , 则 则 0,<br />

回<br />

南 Version


结<br />

CUDA 数 放<br />

个<br />

等<br />

分<br />

指<br />

当 指<br />

填<br />

一<br />

数<br />

已<br />

等<br />

,hostPtr 必<br />

指<br />

指<br />

数<br />

(height 行<br />

传<br />

。<br />

*array 中 在<br />

的<br />

个<br />

个<br />

)。pitch 字 节 。 指 程<br />

新 CUDA<br />

是<br />

D.5.4<br />

cudaMallocArray()<br />

。cudaChannelFormatDesc 的<br />

D.5.5<br />

cudaFreeArray()<br />

数 组 的 句 柄 按<br />

array 果<br />

为<br />

照 desc(cudaChannelFormatDesc<br />

CUDA 分 配 ) 构<br />

D.5.6<br />

cudaMallocHost()<br />

如 释<br />

返 回<br />

绍 参 见 4.3.4。 介<br />

组 , 并<br />

0, 则 不 执 行 任 何 操 作<br />

组 array。<br />

D.5.7<br />

节 的 页 面 锁 定 的 、 可 供 设 备 访 问 的 宿 主 内 存 。 驱 动 程 序 跟 踪 使 用 此 函 数 分 配 的 虚<br />

cudaFreeHost()<br />

字<br />

size 配 分<br />

D.5.8<br />

cudaMemset()<br />

cudaMemcpy*() 存 范 围 , 并 自 动 加 速 对 内 拟<br />

函 数 的 调 用 。 因 为 此 内 存 可 由 设 备 直 接 访 问 ,<br />

的 内 存 量 。 因 此 , 最 好 节 约 使 用 此 函 数 分 配 中 转 区 进 行 宿 主 和 设 备 之 间 的 数 据 交 换 。 页<br />

用 返 回 。 调<br />

malloc() 与 使 用 以 所<br />

函 数 获 得 的 可 分 页 内 存 相 比 , 它 在 进 行 读 取 或 写 入 时 具 有 高 得 多 的 带<br />

cudaMallocHost() 使 用 。 宽<br />

配 过 量 的 内 存 可 能 降 低 系 统 性 能 , 因 为 它 降 低 了 系 统 可 用 于 分<br />

D.5.9<br />

cudaMemset2D()<br />

hostPtr 放 释<br />

向 的 内 存 空 间<br />

cudaMallocHost() 由 先 前 对 须 已<br />

内 存 区 域 的 的 向<br />

节 。 字<br />

92<br />

CUDA<br />

回 时 , 此 函 数 执 行 得 最 快 编<br />

1.1<br />

value 常 量 字 节 值 用 使<br />

充 devPtr<br />

前 count<br />

设 置 给 指 定<br />

矩 阵 组 在 内 存 中 所 占 的 字 节 数 宽 度 , 其 中 包 括 添 加 到 每 行 尾 的 任 何 填 补 ( 参 向<br />

向<br />

南 Version<br />

值 value<br />

个 dstPtr<br />

width 行 每 ,<br />

由 dstPtr<br />

的 2D<br />

见 D.5.2)。<br />

cudaMallocPitch() 由 经<br />

pitch


程 指<br />

cudaMemcpyHostToHost、cudaMemcpyHostToDevice、cudaMemcpyDeviceToHost<br />

指 是 或 指 个<br />

(height 行<br />

中<br />

个<br />

则<br />

指<br />

返<br />

指<br />

D.5.10<br />

cudaMemcpy()<br />

cudaMemcpyDeviceToDevice<br />

从 向 的 内 存 区 域 到 向 的 内 存 区 域 , 其 之 一 , 指 定 复 制 的 方 向 。 内 存 区 域 不 可 以 重 叠 。 使 用 与 复 制 方 向 不 匹 配 和 指 针 调 将 导 致 不 确 定 的 行 为 。 节 字<br />

cudaMemcpyAsync() 是<br />

参<br />

。<br />

D.5.11<br />

cudaMemcpy2D()<br />

定 的 宿 主 内 存 , 如 果 传 递 指 向 可 分 页 内 存 的 指 针 作 为 输 入 , 则 此 函 数 返 回 错 误 锁 面<br />

将 count<br />

由 src<br />

由 dst<br />

用 cudaMemcpy()<br />

中 kind<br />

stream 的 , 可 以 通 过 传 递 非 零 步 异<br />

数 与 流 相 关 联 。 它 仅 适 用 于 页<br />

的 dst<br />

src<br />

cudaMemcpyDeviceToHost 或 和 是 和 是<br />

dpitch<br />

cudaMemcpy2D() 将 用<br />

之<br />

指<br />

数<br />

和<br />

大<br />

src 和<br />

将 矩 阵<br />

width 行 每 ,<br />

src ) 从 由 节 字<br />

dst 内 存 区 域 复 制 到 由 的 向<br />

向 的 内 存<br />

cudaMemcpyHostToHost、cudaMemcpyHostToDevice、<br />

内<br />

区 域 , 其<br />

中 kind<br />

cudaMemcpyDeviceToDevice<br />

一 , 指 定 复 制 的 方 向 。<br />

cudaMemcpy2DAsync() 参 页 面 锁 定 的 宿 主 内 存 , 如 果 传 递 指 向 可 分 页 内 存 的 指 针 作 为 输 入 , 则 此 函 数 返 回 错 误 。 是<br />

spitch<br />

由 dst<br />

src<br />

2D 的 向<br />

组 在 内 存 中 的 字 节 数 宽 度 , 其 中 包 括 添 加 到<br />

CUDA 编<br />

1.1 93<br />

行 尾 的 任 何 填 补 ( 参 见 D.5.2)。 每<br />

dst 域 不 可 以 重 叠 。 使 用 与 复 制 方 向 不 匹 配 的 区 存<br />

指 针 调<br />

dpitch 不 确 定 的 行 为 。 如 果 致 导<br />

spitch<br />

于 允 许 的 最 大 值<br />

stream 的 , 可 以 通 过 传 递 非 零 步 异<br />

数 与 流 相 关 联 。 它 仅 适 用 于<br />

D.1.4 见 参 (<br />

的 memPitch),<br />

cudaMemcpy2D()<br />

错 误 。 回<br />

南 Version


(height 行<br />

中<br />

个<br />

则<br />

指<br />

。spitch<br />

返<br />

参<br />

指<br />

数<br />

数<br />

D.5.12<br />

cudaMemcpyToArray()<br />

指 始 的 位 置 , 其 个<br />

数<br />

中<br />

cudaMemcpyToArrayAsync()<br />

之 是 参 或 cudaMemcpyDeviceToHost<br />

(dstX,<br />

。<br />

异 步 的 , 可 以 通 过 传 递 非 数 与 流 相 关 联 。 它 仅<br />

cudaMemcpyHostToHost、cudaMemcpyHostToDevice、<br />

向 的 内 存 区 域 复 制<br />

从 左 上 角<br />

cudaMemcpyDeviceToDevice<br />

, 指 定 复 制 的 方 向 。 一<br />

将 count<br />

D.5.13<br />

cudaMemcpy2DToArray()<br />

于 页 面 锁 定 的 宿 主 内 存 , 如 果 传 递 指 向 可 分 页 内 存 的 指 针 作 为 输 入 , 则 此 函 数 返 回 错 误 用 适<br />

src 从 由 节 字<br />

到 CUDA<br />

组 dstArray<br />

dstY) 开<br />

零 stream<br />

中 kind<br />

dstArray<br />

阵 , 每 中 从 左 上 角 矩 将<br />

cudaMemcpyHostToDevice 、<br />

(dstX, 开 dstY)<br />

cudaMemcpyDeviceToDevice 之<br />

kind 中<br />

或 是<br />

是<br />

大<br />

一 , 指 定 复 制 的 方 向<br />

组 在<br />

cudaMemcpyHostToHost、<br />

94<br />

CUDA 编<br />

。<br />

1.1<br />

行 width<br />

src ) 从 由 始 的 位 置 , 其 节 字<br />

cudaMemcpy2DToArrayAsync()<br />

仅 适 用 于 页 面 锁 定 的 宿 主 内 存 , 如 果 传 递 指 向 可 分 页 内 存 的 指 针 作 为 输 入 , 则 此 函 数 返 回 错 误 是<br />

到 CUDA<br />

如<br />

向 的 内 存 区 域 复 制<br />

组<br />

cudaMemcpyDeviceToHost<br />

由 src<br />

2D 的 向<br />

存 中 的 字 节 数 宽 度 , 其 中 包 括 添 加 到 每 行 尾 的 任 何 填 补 ( 参 见 D.5.2)。 内<br />

果 spitch<br />

于 允<br />

stream 的 , 可 以 通 过 传 递 非 零 步 异<br />

数 与 流 相 关 联 。 它<br />

D.1.4 最 大 值 ( 参 见 的 许<br />

的 memPitch),<br />

cudaMemcpy2D()<br />

错 误 。 回<br />

Version 南 指 程


程 指<br />

误<br />

(height 行<br />

中<br />

个<br />

则<br />

数<br />

是 的<br />

。dpitch<br />

返<br />

指<br />

参<br />

指<br />

。<br />

(srcX,<br />

数<br />

srcY)<br />

D.5.14<br />

cudaMemcpyFromArray()<br />

个<br />

的 是 cudaMemcpyHostToHost、cudaMemcpyHostToDevice、<br />

数<br />

cudaMemcpyDeviceToHost 或<br />

cudaMemcpyFromArrayAsync() 是<br />

srcY) 开<br />

之<br />

参<br />

将 count<br />

CUDA 从 节 字<br />

D.5.15<br />

cudaMemcpy2DFromArray()<br />

用 于 页 面 锁 定 的 宿 主 内 存 , 如 果 传 递 指 向 可 分 页 内 存 的 指 针 作 为 输 入 , 则 此 函 数 返 回 错 误 适 仅<br />

组 srcArray<br />

(srcX, 角 上 左<br />

dst 制 到 复 始<br />

区 域 , 其<br />

中 kind<br />

向 的 内 存<br />

cudaMemcpyDeviceToDevice<br />

, 指 定 复 制 的 方 向 。 一<br />

stream 的 , 可 以 通 过 传 递 非 零 步 异<br />

数 与 流 相 关 联 。 它<br />

矩 阵 开 始 复 制 到 将<br />

每 向 的 内 存 区 域 , 其 ,<br />

指<br />

cudaMemcpyHostToDevice 、<br />

cudaMemcpyDeviceToDevice 之<br />

是 或<br />

大<br />

组 在<br />

cudaMemcpyHostToHost、<br />

CUDA 编<br />

1.1<br />

于 允 。 异 步 的 , 以 通 过 传 递 非 数 与 流 相 关 联 。 它 仅 适 用 于 页 面 锁 定 的 宿 主 内 存 , 如 果 传 递 指 向 可 分 页 内 存 的 指 针 作 为 输 入 , 则 此 函 数 返 回 错<br />

95<br />

。<br />

行 width<br />

CUDA ) 从 节 字<br />

cudaMemcpyDeviceToHost<br />

组 srcArray<br />

cudaMemcpy2DFromArrayAsync()<br />

最 大 值 ( 参 是 的 许<br />

一 , 指 定 复 制 的 方 向<br />

由 dst<br />

回 错 误 如<br />

中 kind<br />

左 上 角<br />

见 D.1.4<br />

的 memPitch),<br />

cudaMemcpy2D()<br />

由 dst<br />

2D 的 向<br />

存 中 的 字 节 数 宽 度 , 其 中 包 括 添 加 到 每 行 尾 的 任 何 填 补 ( 参 见 D.5.2)。 内<br />

果 dpitch<br />

南 Version<br />

零 stream


个<br />

数<br />

的<br />

(srcX, 开 数 是 cudaMemcpyHostToHost、<br />

srcY)<br />

(height (srcX, 的 srcY)<br />

数 中 dstY)<br />

cudaMemcpyHostToHost、cudaMemcpyHostToDevice、cudaMemcpyDeviceToHost<br />

开 是 或 个 行<br />

个<br />

个<br />

指<br />

或<br />

开<br />

。symbol 可<br />

(dstX,<br />

数<br />

字<br />

开<br />

字<br />

。kind 可<br />

以 是<br />

指<br />

D.5.16<br />

cudaMemcpyArrayToArray()<br />

dstArray (dstX, 从 左 上 角 dstY) 开 的 中<br />

cudaMemcpyHostToDevice 、<br />

cudaMemcpyDeviceToDevice 之<br />

。 或<br />

D.5.17<br />

cudaMemcpy2DArrayToArray()<br />

上 角 始 的 位 置 , 其 一 , 指 定 复 制 的 方 向 左<br />

将 count<br />

CUDA 从 节 字<br />

组<br />

组 srcArray<br />

中 kind<br />

CUDA 制 到 复 始<br />

cudaMemcpyDeviceToHost<br />

的 从 左 上 角<br />

始 的 位 置 , 其<br />

cudaMemcpyDeviceToDevice 一 , 指 定 复 制 的 方 向 。 之<br />

将 矩 阵<br />

width 行 每 ,<br />

字 节 )<br />

组 srcArray<br />

左 上 角<br />

D.5.18<br />

始 复 制<br />

cudaMemcpyToSymbol()<br />

开<br />

从 CUDA<br />

始 偏<br />

中 kind<br />

到 CUDA<br />

组 dstArray<br />

cudaMemcpyHostToDevice<br />

的 内 存 区 域 复 制 到 从 符 以 是 一 个 驻 留 在 全 局 或 常 量 内 存 空 间 中 的 变 量 , 向<br />

节 指 向<br />

号 symbol<br />

移 offset<br />

D.5.19<br />

cudaMemcpyFromSymbol()<br />

节 从 的 内 存 区 域 。 内 存 区 域 不 可 以 重 叠 字<br />

将 count<br />

96<br />

CUDA 编<br />

1.1<br />

由 src<br />

cudaMemcpyDeviceToDevice。<br />

也 可 以 是 一 个 字 符 串 , 用 于 命 名 驻 留 在 全 局 或 常 量 内 存 空 间 中 的 变 量<br />

Version 南 指 程<br />

将 count<br />

symbol 从 以 符 号 节 字<br />

offset 移 偏 始<br />

dst 向 的 内 存 区 域 复 制 到 从 由 指 节


程 指<br />

中<br />

中<br />

*desc 中 在<br />

或<br />

在<br />

。symbol 可<br />

返<br />

数<br />

的<br />

的<br />

。symbol 可<br />

则<br />

。symbol 可<br />

不<br />

则<br />

不<br />

。kind 可<br />

以 是<br />

到 symbol,<br />

cudaMemcpyDeviceToHost<br />

以 是 一 个 驻 留 在 全 局 或 常 量 内 存 空 间 中 的 变 量 ,<br />

D.5.20<br />

的 内 存 区 域 。 内 存 区 域 不 可 以 重 叠<br />

cudaGetSymbolAddress()<br />

向<br />

设 备 上 的 地 址<br />

以 是 一 个 驻 留 在 全 局 或 常 量 内 存<br />

cudaMemcpyDeviceToDevice。<br />

也 可 以 是 一 个 字 符 串 , 用 于 命 名 驻 留 在 全 局 或 常 量 内 存 空 间 中 的 变 量<br />

D.5.21<br />

cudaGetSymbolSize()<br />

或<br />

在 *devPtr<br />

symbol 符 号 回 返<br />

到 symbol, 不<br />

未 在 全 局 内 存 空 间 中 声 明 symbol, 者<br />

*devPtr<br />

发 生 更 改 , 并 返 回 错 误 。<br />

空 间 中 的 变 量 , 也 可 以 是 一 个 字 符 串 , 用 于 命 名 驻 留 在 全 局 或 常 量 内 存 空 间 中 的 变 量 。 如 果 找<br />

cudaGetSymbolAddress() 失 败 , 则 果 如<br />

cudaGetSymbolSize() 返<br />

D.6 纹 理 参 考 管 理<br />

D.6.1<br />

低 层 API<br />

回 cudaErrorInvalidSymbol。<br />

在 *size<br />

symbol 符 号 回 返<br />

小 以 是 一 个 驻 留 在 全 局 或 常 量 内 存 空 间 中 的 变 量 , 也 可 以 是 一 个 字 符 串 , 用 于 命 名 驻 留 在 全 局 或 常 量 内 存 空 间 中 的 变 量 。 如 果 找 不 大<br />

者 未 在 全 局 内 存 空 间 中 声 明 symbol, 或<br />

*size<br />

发 生 更 改 , 并 返 回 错 误 。 如 果 失 败 , 则<br />

D.6.1.1 cudaCreateChannelDesc()<br />

回 cudaErrorInvalidSymbol。<br />

的<br />

和<br />

分<br />

。cudaChannelFormatDesc 位 数 的 的 量<br />

D.6.1.2 cudaGetChannelDesc()<br />

介<br />

参 见 4.3.4。 绍<br />

CUDA 编<br />

1.1 97<br />

D.6.1.3 cudaGetTextureReference()<br />

描 述 符 。 道 通 返<br />

f 格 式 为 回 返<br />

x、y、z 描 述 符 以 及 道 通<br />

w<br />

组 array<br />

南 Version<br />

回 CUDA


*texRef 中 在<br />

指<br />

数<br />

的<br />

中<br />

分<br />

绑<br />

texRef 的 考<br />

义 的 纹 理 参 考 相 关 联 的 结 构 。 定<br />

个<br />

的<br />

也<br />

描<br />

函 在<br />

texRef 时 考<br />

述 在 纹 理 拾 取 描<br />

返 回 一 个 必 须 中<br />

程 指<br />

D.6.1.4 cudaBindTexture()<br />

symbol 与 由 符 号 回 返<br />

cudaMalloc() 中<br />

。<br />

D.6.1.5 cudaBindTextureToArray()<br />

何 内 存 将 解 除 绑 定 应 用 到 纹 理 拾 取 的 字 节 偏 移 , 以 便 从 所 需 内 存 中 读 取 数 据 。 此 偏 移 必 须 除 以 纹 理 元 素 大 小 并 传 任<br />

devPtr 由 将<br />

size 内 存 区 域 的 的 向<br />

texRef。desc 绑 定 到 纹 理 参 考 节 字<br />

texRef 何 解 释 内 存 。 先 前 绑 定 到 如 时<br />

cudaBindTexture() 硬 件 强 制 在 纹 理 基 址 上 执 行 对 齐 , 所 以 为 因<br />

*offset<br />

tex1Dfetch() 读 取 纹 理 的 内 核 , 以 便 这 些 内 核 可 以 应 用 于 给 递<br />

数 。 如 果 设 备 内 存 指 针 从<br />

D.6.1.6 cudaUnbindTexture()<br />

。<br />

0,NULL , 则 偏 移 一 定 为 回 返<br />

以 作 为 偏 移 参 数 传 递 。 可<br />

将 CUDA<br />

组 array<br />

texRef。desc 纹 理 参 考 到 定<br />

述 在 纹 理 拾 取 时 如 何 解 释 内 存 。 先 前<br />

D.6.1.7 cudaGetTextureAlignmentOffset()<br />

到 纹 理 参 纹 理 解 除 绑 定 。 定 绑 对<br />

texRef 到 定 绑<br />

任 何 内 存 将 解 除 绑 定<br />

D.6.2<br />

高 层 API<br />

, 该 偏 移 是 绑 定 纹 理 参 移 偏 回 返<br />

高 层<br />

D.6.2.1 cudaCreateChannelDesc()<br />

回 的 。 返<br />

回 格 式 与 类 匹 量 格 式 。 返<br />

以 可<br />

的 任 意 类 型 中<br />

。3- 分<br />

量 类 型 被 默 认<br />

98<br />

CUDA 编<br />

1.1<br />

在 *offset<br />

型 T<br />

南 Version<br />

是 4.3.1.1<br />

T 通 道 描 述 符 。 类 型 的 配<br />

为 4-


程 指<br />

指<br />

指<br />

数<br />

数<br />

的<br />

的<br />

的<br />

的<br />

绑<br />

绑<br />

CUDA 数 何<br />

CUDA 数 何<br />

texRef 的 的<br />

个<br />

个<br />

介<br />

介<br />

描<br />

texRef。desc 描 考<br />

cudaBindTexture() 函 级<br />

函 通<br />

组 中 继 承 。 先 前 绑 定 数<br />

D.6.2.2 cudaBindTexture()<br />

向 的 内 存 区 域<br />

绍 的 低<br />

在 纹 理 拾 取 数 一 样 。 述<br />

字 节 绑 定 到 纹 理 参<br />

devPtr 由 将<br />

的 size<br />

D.6.1.4 何 解 释 内 存 。 偏 移 参 数 是 可 选 的 , 这 和 如 时<br />

描 述 符 从 纹 理 参 考 数 一 样 。 先 道<br />

texRef 绑 定 到 前 先<br />

何 内 存 将 解 除 绑 定 。 任<br />

D.6.2.3 cudaBindTextureToArray()<br />

存 将 解 除 绑 定 。 内 何 任<br />

devPtr 由 将<br />

size 内 存 区 域 的 的 向<br />

节 绑 定 到 纹 理 参 考 texRef。 字<br />

D.6.1.4 中 继 承 。 偏 移 参 数 是 可 选 的 , 这 和 型 类<br />

cudaBindTexture() 低 级 的 绍<br />

texRef 定 到 绑 前<br />

将 CUDA<br />

组 array<br />

述 在 纹 理 拾 取 时 如 何 解 释 内 存 。 先 前<br />

texRef。desc 纹 理 参 考 到 定<br />

texRef 到 定 绑<br />

任<br />

将 解 除 绑 定 。 组<br />

D.6.2.4 cudaUnbindTexture()<br />

组 将 解 除 绑 定 。 通<br />

解 除 对 绑 定 到 纹 理 参 考<br />

定 。 绑<br />

CUDA 编<br />

1.1 99<br />

将 CUDA<br />

组 array<br />

定 到 纹 理 参<br />

考 texRef。<br />

CUDA 述 符 从 描 道<br />

到 texRef<br />

任<br />

南 Version


。 用<br />

指<br />

为<br />

的<br />

。entry 必 可<br />

个<br />

的<br />

。<br />

访<br />

函<br />

中<br />

绍 的 执 行 配 置 语 法 。 介<br />

必 前<br />

之<br />

可<br />

压 之<br />

字 节 ( 从 前 必 须 调 用 个<br />

程 指<br />

命<br />

D.7 执 行 控 制<br />

D.7.1<br />

cudaConfigureCall()<br />

cudaConfigureCall() 是<br />

D.7.2<br />

cudaLaunch()<br />

定 要 执 行 的 设 备 网 格 和 块 维 度 , 这 类 似 和 线 程 块 的 维 度 , 以 及 调 用 的 任 何 参 数 指<br />

基 于 堆 栈 的 。 每 个 调 用 在 执 行 堆 栈 顶 部 压 入 数 据 。 此 数 据 包 含 网 格<br />

于 命 名 在 设 备 上 执 行 的 函 数<br />

以 是 一 个 在 设 备 上 执 行 的 函 数 , 也 可 以 是 一 个 字 符 串 , 用<br />

于 4.2.3<br />

D.7.3<br />

cudaSetupArgument()<br />

入 的 数 据 。 因<br />

entry。entry 备 上 启 动 函 数 设 在<br />

__global__ 明 为 声 须<br />

0 开<br />

cudaLaunch() 在 。 数<br />

调 用 cudaConfigureCall(), 须<br />

cudaConfigureCall() 函 数 从 执 行 栈 中 弹 出 由 此 为<br />

D.8 OpenGL 互 操 作 性<br />

将<br />

互 操 作 性<br />

D.8.1<br />

cudaGLRegisterBufferObject()<br />

由 arg<br />

count 参 数 的 的 向<br />

offset 存 入 从 参 数 传 递 区 域 的 开 始 位 置 偏 移 节 字<br />

用 此 函 数 。 注 册 之 后 , 除 作<br />

在 cudaSetupArgument()<br />

) 处 。 参 数 存 储 在 执 行 栈 的 顶 部 。<br />

cudaConfigureCall()。<br />

始<br />

以 映 射 缓 冲 对 象 之 前 , 必 须 调<br />

CUDA 在 。 问<br />

100<br />

CUDA 编<br />

1.1<br />

ID 册 注<br />

bufferObj<br />

CUDA 对 象 供 冲 缓<br />

OpenGL 命 令 之 外 , 缓 冲 对 象 不 能 由 任 何 图 绘<br />

令 使<br />

为 OpenGL<br />

南 Version


为<br />

的<br />

访<br />

访<br />

设<br />

访<br />

为<br />

为<br />

的<br />

的<br />

缓 冲 对 象 。 的<br />

的<br />

开<br />

Direct3D 设 的<br />

可<br />

设<br />

*devPtr 中 在<br />

中<br />

返 回 结 果 映 射<br />

用 cuD3D9End()<br />

D.8.2<br />

cudaGLMapBufferObject()<br />

D.8.3<br />

cudaGLUnmapBufferObject()<br />

空 间 中 , 并 的 基 指 针 。 址 地<br />

将 ID<br />

bufferObj<br />

CUDA 对 象 映 射 到 冲 缓<br />

D.8.4<br />

cudaGLUnregisterBufferObject()<br />

冲 对 象 的 映 射 。 缓<br />

D.9 Direct3D 互 操 作 性<br />

销 注<br />

互 操 作 性<br />

CUDA 供 消 取<br />

ID 的 问<br />

bufferObj<br />

D.9.1<br />

cudaD3D9Begin()<br />

供 CUDA<br />

ID 的 问<br />

bufferObj<br />

D.9.2<br />

cudaD3D9End()<br />

止 。 为<br />

任 何 对 象 之 前 , 必 备 的 顶 点 缓 冲 , 直 到 调 的<br />

Direct3D 化 与 始 初<br />

D.9.3<br />

cudaD3D9RegisterVertexBuffer()<br />

的 互 操 作 。 备 始<br />

备 device<br />

CUDA 作 。 在 操 互<br />

device 射 映 以<br />

Direct3D 用 此 函 数 。 然 后 , 应 用 程 序 可 以 映 射 调 须<br />

D.9.4<br />

cudaD3D9MapVertexBuffer()<br />

问 的 顶 点 缓 册 注<br />

CUDA 程 指 编<br />

1.1 101<br />

cuD3D9Begin() 先 前 由 束 结<br />

南 Version<br />

供 CUDA<br />

冲 VB。


中<br />

VB 映 冲<br />

访<br />

上<br />

相<br />

回 错 误 代 码 中 的 消 息 字 符 串 。 返<br />

*devPtr 中 在<br />

返 回 结 果 映 射 的 基 指<br />

IDirect3D9::GetAdapterIdentifier()<br />

。 或<br />

程 指<br />

D.9.5<br />

D.9.6<br />

cudaD3D9UnmapVertexBuffer()<br />

顶 缓 下 文 的 地 址 空 间 中 , 并 针 。 将<br />

VB<br />

点<br />

的 顶 点 缓 冲 的 映 射 。 问 访<br />

cudaD3D9UnregisterVertexBuffer()<br />

CUDA 当 前 到 射<br />

D.9.7<br />

cudaD3D9GetDevice()<br />

CUDA 供 消 取<br />

应 的 设 备<br />

D.10 错 误 处 理<br />

CUDA 供 销 注<br />

的 顶 点 缓 冲 VB。 问<br />

在 *dev<br />

D.10.1<br />

cudaGetLastError()<br />

EnumDisplayDevices 与 从 回 返<br />

adapterName 得 的 适 配 器 名 称 获 中<br />

D.10.2<br />

cudaGetErrorString()<br />

从 同 一 宿 主 线 程 中 任 何 运 行 时 调 用 返 回 的 最 后 一 个 错 误 , 并 将 其 重 置 回 返<br />

为 cudaSuccess。<br />

102<br />

CUDA 编<br />

1.1<br />

南 Version


程 指<br />

*count 中 在<br />

*dev 中 在<br />

中<br />

仅<br />

驱 动 程<br />

的<br />

[0, cuDeviceGetCount()-1] 中 间<br />

当<br />

,Flags 数 必 参<br />

附 录 E<br />

驱 动 程 序 API 参 考<br />

E.1 初 始 化<br />

E.1.1<br />

cuInit()<br />

中 的 任 何 函 数 将 返 回 前<br />

E.2 设 备 管 理<br />

API 用 驱 动 程 序 调 在<br />

E.2.1<br />

cuDeviceGetCount()<br />

其 它 任 何 函 数 之 前 , 必 须 初 始 化 驱 动 程 则 的<br />

序 API。<br />

用 cuInit(),<br />

cuDeviceGetCount() 返<br />

序 API<br />

CUDA_ERROR_NOT_INITIALIZED。<br />

为 0。 如 果 未 调 须<br />

E.2.2<br />

cuDeviceGet()<br />

设 备 数 。 如 果 没 有 这 样 一 个 设 备 , 则<br />

E.2.3<br />

cuDeviceGetName()<br />

给 定 序 号 在 区 回 返<br />

1.0 可 供 执 行 的 计 算 能 力 大 于 或 等 于 回 返<br />

0 设 备 1, 回<br />

持 设 备 仿 真 模 式 , 且 其 计 算 能 力 小 于 1.0。 支<br />

设 备 句 柄 。 的<br />

CUDA 编<br />

1.1 103<br />

南 Version


指<br />

*bytes 中 在<br />

*value 中 在<br />

结<br />

dev 上 备<br />

dev 的 备<br />

的<br />

CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_BLOCK: <br />

ATTRIBUTE_MAX_BLOCK_DIM_X: CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Y:<br />

每<br />

<br />

块 网 CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X:<br />

CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Z:<br />

CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Y: <br />

CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Z: <br />

CU_DEVICE_ATTRIBUTE_SHARED_MEMORY_PER_BLOCK:<br />

<br />

每 网<br />

设 CU_DEVICE_ATTRIBUTE_TOTAL_CONSTANT_MEMORY:<br />

CU_DEVICE_ATTRIBUTE_REGISTERS_PER_BLOCK: <br />

CU_DEVICE_ATTRIBUTE_CLOCK_RATE: 时 每<br />

个<br />

维<br />

维<br />

维<br />

维<br />

维<br />

维<br />

。len 指 串 符<br />

;<br />

定 返 回 的<br />

dev 备<br />

ASCII 字<br />

的<br />

E.2.4<br />

cuDeviceTotalMem()<br />

字 符 串 中 返 回 标 识 设 字 符 串 的 最 大 长 度 。 的 尾<br />

name 由 在<br />

NULL 的 向<br />

E.2.5<br />

cuDeviceComputeCapability()<br />

的 内 存 总 量 , 单 位 为 字 节 用 可<br />

*major 在<br />

*minor 中<br />

和<br />

返 回 设<br />

E.2.6<br />

cuDeviceGetAttribute()<br />

。<br />

的 最 大 线 程 数 ; 块<br />

dev 定 义 设 备 回 返<br />

算 能 力 的 主 要 和 次 要 修 订 号 。 计<br />

这<br />

x 最 大 的 格<br />

; 度<br />

返 回 设<br />

性 attrib, 属<br />

属 性 为 整 数 值 。 支 持 的 属 性 包 括 : 些<br />

格 的 最<br />

; 度<br />

x 大 最 的<br />

; 度<br />

块 可 用 的 共 享 内 存 总 量 , 单<br />

y 大 最 的<br />

; 度<br />

为 字 节 ; 位<br />

z 大 最 的<br />

; 度<br />

为 字 节 ; 位<br />

备 上 可 用 的 常 量 内 存 总 量 , 单<br />

CU_DEVICE_ATTRIBUTE_WARP_SIZE:warp 小 ; 大<br />

y 最 大 的 格<br />

; 度<br />

CU_DEVICE_ATTRIBUTE_MAX_PITCH:E.8 中<br />

的 内 存 复 制 函 数 允 许 的 最 大 节 距 , 包 括 通<br />

可 用 的 寄 存 器 总 数 ; 钟 频 率 , 单 位 为 千 赫 ; 块<br />

104<br />

CUDA 编<br />

1.1<br />

及 的 对 齐 要 求 ; 已 经 对 齐 提<br />

大 z<br />

分 配 的 内 存 区 域 ;<br />

CU_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT:4.3.4.3<br />

参<br />

字 节 的 纹 理 基 址 不 再 需 要 那 种 应 用 于 纹 理 拾 取 的 偏 移 中<br />

Version 南 指 程<br />

过 cuMemAllocPitch()(<br />

见 E8.3)<br />

为 textureAlign


程 指<br />

CU_DEVICE_ATTRIBUTE_GPU_OVERLAP: 如<br />

定 义 为 : 构<br />

*prop 中 在<br />

的<br />

设 备 之 间 ) 的 并 发 , 则 为 1, 否 则 为 0。 和<br />

果 设 备 可 以 实 现 内 核 执 行 和 复 制 内 存 ( 宿 主<br />

E.2.7<br />

cuDeviceGetProperties()<br />

。CUdevprop 结<br />

dev 设 备 回 返<br />

属 性<br />

maxThreadsPerBlock 块 的 最 大 线 程 数 ; 块 的 每 个 维 度 的 最 大 大 小 ; 是<br />

maxThreadsDim[3]<br />

网 格 的 每 个 维 度 的 最 大 大 小 ; 是<br />

maxGridSize[3] 是<br />

sharedMemPerBlock 每 块 可 用 的 共 享 内 存 总 量 , 单 位 为 字 节 ; 是<br />

totalConstantMemory<br />

SIMDWidth 是 大 是<br />

中 : 其<br />

备 上 可 用 的 常 量 内 存 总 量 , 单 位 为 字 节 ; 设<br />

memPitch 是<br />

中<br />

regsPerBlock 是<br />

clockRate 是<br />

textureAlign 中 基 址 不 再 需 要 那 种 应 用 于 纹 理 拾 取 的 偏 移 。 是<br />

个<br />

warp<br />

; 小<br />

块 可 用 的 寄 存 器 总 数 ; 时 钟 频 率 , 单 位 为 千 赫 ; 提 及 的 对 齐 要 求 ; 已 经 对 齐 每<br />

参<br />

节 的 纹 理 字<br />

E.8<br />

内 存 复 制 函 数 允 许 的 最 大 节 距 , 包 括 cuMemAllocPitch()( 的<br />

见<br />

分 配 的 内 存 区 域 ;<br />

E.8.3)<br />

CUDA 编<br />

1.1 105<br />

为 textureAlign<br />

4.3.4.3<br />

南 Version


递<br />

,Flags 参<br />

中<br />

或<br />

中<br />

(usage 变 count)<br />

,Flags 数 必 须 为 0。 调 用 了 参<br />

用 失 败 。 调<br />

cuCtxSynchronize()<br />

, 直 到 设 备 已 经 完 成 所 有 先 前 请 求 的 任 务 为 止 。 如 果 先 前 任 务 之 一 失 败 , 则 返 塞 阻<br />

程 指<br />

。<br />

E.3 上 下 文 管 理<br />

E.3.1<br />

cuCtxCreate()<br />

为 1, 该 上 下 文 完 成 使 用 之 后 , 还 必<br />

cuCtxCreate() 之<br />

设 备 创 建 新 上 下 文 , 并 将 其 与 调 用 线 程 相 关 联 。 当 前 减 上 下 文 的 使 用 计 数 。 如 果 某 个 上 下 文 已 经 是 此 线 程 的 当 前 上 下 文 , 为<br />

E.3.2<br />

cuCtxAttach()<br />

, 上 下 文 使 用 计 数 则 此 函 数 调 用 失 败 。 后<br />

在 *pCtx<br />

传 回 上 下 文 句 柄 , 当 应 用 程 序 完 成 使 用 上 下 文 之 后 , 此<br />

cuCtxDetach() 用 调 须<br />

E.3.3<br />

cuCtxDetach()<br />

增 上 下 文 的 使 用 计 数 , 并 如 当 前 数 必 须 递<br />

cuCtxCreate()<br />

0。 为<br />

传<br />

柄 必 须 传 递 给 cuCtxDetach()。 句<br />

cuCtxAttach() 程 没 有 当 前 上 下 文 , 则 线 果<br />

0, 则 销 毁 上 下 文 。 上 下 文 句 柄 必 须 是 通 过 回 的 , 并 且 必 须 是 调 用 线 程 的 当 前 上 下 文 到<br />

E.3.4<br />

cuCtxGetDevice()<br />

上 下 文 的 使 用 计 数 , 如 果 使 用 计 数 达 减 递<br />

E.3.5<br />

cuCtxSynchronize()<br />

cuCtxAttach()<br />

E.4 模 块 管 理<br />

错 误 。 回<br />

在 *device<br />

回 当 前 上 下 文 的 设 备 的 序 号 。 返<br />

106<br />

CUDA 编<br />

1.1<br />

E.4.1<br />

cuModuleLoad()<br />

南 Version


程 指<br />

中<br />

加<br />

的<br />

文<br />

mod 中 块<br />

到<br />

到<br />

的<br />

cuModuleGetFunction() 返 则<br />

对<br />

到<br />

输<br />

funcname 的 为<br />

中<br />

文<br />

上<br />

。CUDA 驱<br />

文<br />

和<br />

是<br />

的<br />

档 。 文<br />

会 延 不<br />

(fat binary)<br />

返<br />

cuModuleLoad() 调<br />

当 前 上 下 文 中<br />

E.4.2<br />

cuModuleLoadData()<br />

filename 件 名 为 文 从<br />

cubin 文<br />

Windows 的<br />

中<br />

mod 加 载 相 应 模 块 件 文<br />

API 序 程 动<br />

nvcc 败 。 文 件 应 该 是 由 失 用<br />

cubin 的 出<br />

( 参 见 4.2.5)。 件<br />

象 合 并 到 可 执 行 资 源 并 使 用 操 作 系 统 调 用 ( 比 如<br />

迟 分 配 模 块 所 需 的 资 源 ; 如 果 无 法 分 配 模 块 所 需 的 函 数 和 数 据 的 内 存 ( 常 量 和 全 局 ), 则<br />

加 载 相 应 模<br />

当 前 上 下 文 中 。 可 以 通 过 映<br />

件 获 得 该 指 针 , 将<br />

E.4.3<br />

cuModuleLoadFatBinary()<br />

获 得 指 针 。 来<br />

image 针 指 从<br />

件 的 集 合 , 这 些 文 件 表 示 相 同 的 设 备 代 码 , 但 针 对 不 同 的 体 系 结 构<br />

块 mod<br />

射 cubin<br />

cubin 为 文 本 字 符 串 传 递 , 或 将 作 件<br />

FindResource())<br />

前 上 下 文 中 指 针 表 示 多 体 系 结 构 二 进 制 一 个 内 部 函 数 。 更 多 信 息 参 当<br />

E.4.4<br />

cuModuleUnload()<br />

, 因 此 此 函 数 是 此 版 象 对<br />

fatBin 针 指 从<br />

mod 应 模 块 相 载<br />

本 CUDA<br />

E.4.5<br />

cuModuleGetFunction()<br />

见 nvcc<br />

cubin , 此 对 象 是 不 同 象 对<br />

API 了 编 译 和 优 化 。 编 程 人 员 还 不 能 够 在 当 前 正 式 发 布 的 行 进<br />

构 造 和 使 用 多 体 系 结 构 二 进 制<br />

E.4.6<br />

cuModuleGetGlobal()<br />

位 于 模 的 名 称 函 数 , 回 返<br />

当 前 上 下 文 中 卸 载 模 块 mod。 从<br />

和<br />

中<br />

在 *func<br />

CUDA 编<br />

1.1 107<br />

回 CUDA_ERROR_NOT_FOUND。<br />

函 数 的 句 柄 。 如 果 不 存 在 具 有 此 名 称 的<br />

全 局 变 量 的 基 指 针 和<br />

bytes<br />

选 的 。 忽 略 其 中 的 空 值 参 数 。 可<br />

则 cuModuleGetGlobal()<br />

回<br />

数 devPtr<br />

南 Version<br />

在 *devPtr<br />

*bytes<br />

mod 位 于 模 块 回 返<br />

globalname 称 为 名 的<br />

小 。 如 果 不 存 在 具 有 此 名 称 的 变 量 ,<br />

CUDA_ERROR_NOT_FOUND。 两 个 参 大


中<br />

中<br />

。 返<br />

,flags 必<br />

纹 理 参 考 的 句 柄 。 如 果 不 存 在 具 有 此 名 要 销 毁 此 纹 理 的<br />

不<br />

程 指<br />

E.4.7<br />

cuModuleGetTexRef()<br />

E.5 流 管 理<br />

在 *texref<br />

E.5.1<br />

cuStreamCreate()<br />

cuModuleGetTexRef() 纹 理 参 考 , 则 参 考 句 柄 , 因 为 它 将 在 模 块 卸 载 时 自 动 销 毁 的 称<br />

mod 模 块 回 返<br />

texrefname 为 称 名<br />

创 建 流 。 当 前<br />

回 CUDA_ERROR_NOT_FOUND。<br />

E.5.2<br />

cuStreamQuery()<br />

须<br />

E.5.3<br />

E.5.4<br />

0。 为<br />

cuStreamSynchronize()<br />

否<br />

cuStreamDestroy()<br />

塞 , 直 到 设 备 完 成 流 中 的 所 有 操 作 为 止 。 阻<br />

E.6 事 件 管 理<br />

毁 流 。 销<br />

果 流 中 的 所 有 操 作 都 已 完 成 , 则 返 回 CUDA_SUCCESS, 如<br />

, 返 回 CUDA_ERROR_NOT_READY。 则<br />

E.6.1<br />

cuEventCreate()<br />

108<br />

CUDA 编<br />

1.1<br />

,flags 必<br />

E.6.2<br />

cuEventRecord()<br />

事 件 。 当 前 须 为 0。 建 创<br />

南 Version


非<br />

func 给 由<br />

和<br />

或<br />

来<br />

在 CUDA<br />

CUDA_ERROR_NOT_READY。<br />

则 回<br />

微<br />

则<br />

cuEventQuery()<br />

零 , 则 在 流 中 的 所 有 先 前 操 作 都 已 完 成 之 后 记 录 事 件 ; 否 则 ,<br />

E.6.3<br />

cuEventQuery()<br />

下 文 中 的 所 有 先 前 操 作 都 已 完 成 之 后 记 录 事 件 。 因 为 此 操 作 是 异 步 的 , 所 以 必 须 使 用 但 上<br />

stream 事 件 。 如 果 录 记<br />

果 已 经 调<br />

CUDA_ERROR_INVALID_VALUE。<br />

如<br />

事 件 尚 未 记 录 , 则 此 函 数 返 回<br />

/<br />

定 事 件 实 际 被 记 录 的 时 间 。 确<br />

E.6.4<br />

cuEventSynchronize()<br />

否<br />

cuEventSynchronize()<br />

用 cuEventRecord(),<br />

CUDA_ERROR_INVALID_VALUE。<br />

E.6.5<br />

cuEventDestroy()<br />

果 事 件 实 际 已 经 被 记 录 , 则 返 回 CUDA_SUCCESS, 如<br />

则 , 返<br />

如 果 尚 未 在 此 事 件 上 调<br />

用 cuEventRecord(),<br />

此 函 数 返 回<br />

返 回 CUDA_ERROR_INVALID_VALUE。 数<br />

此 函<br />

E.6.6<br />

cuEventElapsedTime()<br />

毁 事 件 。 销<br />

塞 , 直 到 事 件 实 际 已 经 被 记 录 为 止 。 如 果 尚 未 在 此 事 件 上 调 用 cuEventRecord(), 阻<br />

E.7 执 行 控 制<br />

的 定 确 不 是 果<br />

执 行 控 制<br />

E.7.1<br />

)。 如 果 其 中 一 个 尚 未 被 如 果 使 用 非 零 流 记 录 了 任 一 事 件 , 则 结 。<br />

cuFuncSetBlockShape()<br />

秒<br />

CUDA 程 指 编<br />

1.1 109<br />

定 在 启 动 指<br />

0.5 两 个 事 件 之 间 用 去 的 时 间 ( 单 位 为 毫 秒 , 分 辨 率 约 为 算 计<br />

录 , 则 此 函 数 返 回 CUDA_ERROR_INVALID_VALUE。 记<br />

定 的 内 核 时 创 建 的 线 程 块<br />

X、Y 的<br />

和<br />

Z 维<br />

。 度<br />

南 Version


ytes 设 过<br />

numbytes 设 过<br />

的<br />

对<br />

对<br />

定 的 内 核 时 将 可 用 于 每 个 线 程 块 的 共 享 内 存 量 。 给<br />

func 的 数<br />

func 对 与<br />

的<br />

数<br />

获<br />

块<br />

。offset 是<br />

,texunit 参<br />

程 指<br />

。<br />

cuFuncSetBlockShape() 的 用<br />

E.7.2<br />

cuFuncSetSharedSize()<br />

E.7.3<br />

cuParamSetSize()<br />

E.7.4<br />

cuParamSeti()<br />

函 置 通<br />

通<br />

func 启 动 由 在 置<br />

应 的 内 核 时 将 指 定 的 整 数 参 数<br />

节 偏 移 。 字<br />

函 数 参 数 所 需 的 总 大 小 ( 单 位 为 字 节 )。<br />

E.7.5<br />

cuParamSetf()<br />

应 的 内 核 时 将 指 定 的 浮 点 参 数<br />

。offset 是<br />

字 节 偏 移<br />

func 下 次 调 用 与 置 设<br />

E.7.6<br />

cuParamSetv()<br />

。offset 是<br />

。<br />

节 偏 移 字<br />

E.7.7<br />

cuParamSetTexRef()<br />

何 数 量 的 数 据 复 制 到 任 将<br />

func 下 次 调 用 与 置 设<br />

CUDA 中<br />

应 的 内 核 的 参 数 空 间 中<br />

组 或 线 性 内 存 可 供 设 备 程 序 用 作 纹 理 。 在 此 版 本 的<br />

E.7.8<br />

cuLaunch()<br />

110<br />

CUDA 编<br />

1.1<br />

包 含 上 一 次 调<br />

得<br />

必 须 设 置 为 数<br />

指<br />

texRef 绑 定 到 纹 理 参 考 得 使<br />

CUDA<br />

纹 理 参 考 必 须 通<br />

CU_PARAM_TR_DEFAULT。<br />

,<br />

在 块 维 度<br />

网 格 上 调 用 内<br />

过 cuModuleGetTexRef()<br />

是 1×1<br />

核 func。<br />

南 Version


程 指<br />

个<br />

参<br />

个<br />

关<br />

中<br />

中<br />

指<br />

为<br />

E.7.9<br />

cuLaunchGrid()<br />

的 线 程 数 。 定<br />

× grid_height 的<br />

cuFuncSetBlockShape() 的<br />

E.8 内 存 管 理<br />

定 线 程 数 。 联 到 流 。 此 函 数 仅 适 用 于 页 面 锁 定 的 宿 主 内 存 , 如 果 将 可 分 页 内 存 的 指 针 作 为 输 入 , 则 此 函 数 将 返 回 错 误 。 指<br />

grid_width 维 度 为 块 在<br />

网 格 上 调 用 内 核 。 每 块 包 含 上 一 次 调 用<br />

E.8.1<br />

cuMemGetInfo()<br />

stream 通 过 传 递 非 零 以 可<br />

cuLaunchGridAsync() 将 数<br />

*free 在<br />

和<br />

*total 中<br />

上<br />

E.8.2<br />

cuMemAlloc()<br />

别 分<br />

cuMemAlloc() 返<br />

返 回 指 向 已 分 配 内 存 的 指 针 。 已 分 配<br />

CUDA 可 供 回 返<br />

文 分 配 的 空 闲 内 存 量 和 总 内 存 量 , 单 位 为 字 节 。 下<br />

E.8.3<br />

cuMemAllocPitch()<br />

count 备 上 分 配 设 在<br />

*devPtr 的 线 性 内 存 , 并 在 节 字<br />

count 已 经 针 对 任 何 种 类 的 变 量 进 行 了 适 当 的 对 齐 。 内 存 是 未 清 空 的 。 如 果 存 内<br />

0, 则<br />

在 设 备 上 分 配 至<br />

返 回 指 向 已<br />

配 内 存 的 指 针 。 此 函 数 必 须 填 补 内 存 以 确 保 任 何 给 定 行 中 的 相 应 指 针 都 将 继 续 满 足 对 齐 要 求 , 以 便 当 地 址 在 行 之 间 更 新 时 进 行 内 存 合 并 ( 参 定 将 在 内 存 分<br />

回 CUDA_ERROR_INVALID_VALUE。<br />

CUDA 编<br />

1.1<br />

范 围 上 执 行 的 最 大 的 读 和 写 的 大 小 。<br />

111<br />

见 5.1.2.1)。elementSizeBytes<br />

少 widthInBytes*height<br />

*devPtr 的 线 性 内 存 , 并 在 节 字<br />

南 Version


因 小 在 中 或<br />

返<br />

个<br />

等<br />

分<br />

数<br />

返<br />

或<br />

和<br />

中<br />

写<br />

执<br />

等<br />

和<br />

是 由<br />

的<br />

数<br />

程 指<br />

2D 行 数<br />

放 其 指 向 的 内 存 释<br />

或<br />

elementSizeBytes<br />

如 可<br />

以<br />

是 4、8<br />

为 已 合 并 的 内 存 事 务 处 理 不 能 用 于 其 它 数 据 大 小 )。<br />

16(<br />

:<br />

果 elementSizeBytes<br />

/ 核 的 实 际 读 内 于<br />

由 cuMemAllocPitch()<br />

大 小 , 则 内 核 将 正 确 运 行 , 但 速 度 可 能 会 下 降 。<br />

*pitch<br />

回 的 节 距 是 分 配 的 宽 度 ( 单 位 为 字 节 )。 作 为 与 分 配 相 数 组 元 素 的 行 和 列 , 则 地 址 计 算 返<br />

行 节 距 分 配 。 由 于 硬 件 中 的 对 齐 限 对<br />

2D 的 参 数 , 节 距 用 于 计 算 立 独<br />

E.8.4<br />

cuMemFree()<br />

为<br />

T 的 地 址 。 给 定 类 型 为 中 组<br />

由 cuMemAllocPitch()<br />

返<br />

的 节 距 保 证 可 以 在 所 有 情 况 下 处 理 cuMemcpy2D()。 回<br />

于 2D<br />

存 复 制 , 则 更 应 该 使 用 此 函 数 。 内<br />

cuMemAllocPitch() 分 配 , 建 议 编 程 人 员 考 虑 使 用 的 组<br />

CUDA 如 果 应 用 程 序 将 在 设 备 内 存 的 不 同 区 域 ( 不 管 是 线 性 内 存 还 是 , 制<br />

组 ) 之 间 执<br />

E.8.5<br />

cuMemAllocHost()<br />

间 。 空<br />

字 节 的 页 面 锁 定 的 可 由 设 备 访 问 的 宿 主 内 存 。 驱 动 程 序 跟 踪 使 用 此 函 数 分 配 的 虚<br />

cuMemMalloc() 调 用 于 对<br />

cuMemMallocPitch()<br />

函 数 获 得 的 可 分 页 内 存 相 比 , 它 在 进 行 读 取 或 写 入 时 具 有 高 得 多 的 带 宽 。<br />

的 指 针 devPtr, 回<br />

E.8.6<br />

cuMemFreeHost()<br />

count 配 分<br />

存 量 。 因 此 , 最 好 节 约 使 用 此 函 数 分 配 中 转 区 进 行 宿 主 和 设 备 之 间 的 数 据 交 换 。 内<br />

其 指 向 的 内 存 空 间 。 放<br />

cuMemcpy() 存 范 围 , 并 自 动 加 速 对 内 拟<br />

函 数 的 调 用 。 因 为 此 内 存 可 由 设 备 直 接 访 问 , 所 以<br />

E.8.7<br />

cuMemGetAddressRange()<br />

释<br />

malloc() 用 使 与<br />

cuMemAllocHost() 用 使<br />

配 过 量 的 内 存 可 能 降 低 系 统 性 能 , 因 为 它 降 低 了 系 统 可 用 于 分 页 的<br />

分 配 ) 的 基 址 和 大 小 。 两 个 参<br />

返 回 输 入 指<br />

cuMemAllocPitch()<br />

选 的 。 忽 略 其 中 的 空 值 参 数 可<br />

112<br />

CUDA 编<br />

。<br />

1.1<br />

cuMemAllocHost() 调 用 于 对<br />

的 指 针 hostPtr, 回<br />

cuMemAlloc()<br />

数 basePtr<br />

在 *basePtr<br />

*size<br />

南 Version<br />

size<br />

针 devPtr(


程 指<br />

结<br />

个<br />

是<br />

CUDA 数 的<br />

64×64 CUDA 数 的<br />

创<br />

的 描 述 ; 组<br />

的 描 述 : 组<br />

: 数<br />

如 下 : 义<br />

*array 中 在<br />

或<br />

新 CUDA<br />

0, 则 为<br />

E.8.8<br />

cuArrayCreate()<br />

数 组 的 句 柄<br />

。CUDA_ARRAY_DESCRIPTOR 结<br />

组 , 并<br />

Width<br />

组 为 一 维 , 否 则 为 二 维 和<br />

中 : 其<br />

CUDA 数<br />

NumChannels 定 每 定 元 素 的 格 式 指<br />

Format 指<br />

数<br />

数 ;<br />

构 定 义 如 下<br />

;CUarray_format 定<br />

4;<br />

CUDA_ARRAY_DESCRIPTOR 照 按<br />

构 desc<br />

建 CUDA<br />

返 回<br />

Height<br />

CUDA<br />

Height 宽 度 和 高 度 ( 单 位 为 元 素 数 ); 如 果 的 组<br />

CUDA 数<br />

个 CUDA<br />

1、2 素 的 分 量 个 数 ; 可 以 是 元 组<br />

具<br />

浮<br />

描 述 的 示 例 如 下 : 浮 点 数 组<br />

数 类 型<br />

64-<br />

点<br />

位<br />

(4x16- 位<br />

CUDA 数<br />

有 2048<br />

CUDA 编<br />

1.1<br />

元 素 组 的 描 述 :<br />

113<br />

width×height 度 浮 点 数 类 型 ) 的 精 半<br />

南 Version


中<br />

位<br />

数<br />

8- 位 个<br />

位<br />

位<br />

内<br />

数<br />

的 组 参 数 以 用 于 验 证 或 其 它 目 的 )。<br />

count 设 围<br />

设<br />

当<br />

的 描 述 : 组<br />

组 的 数<br />

16- 位<br />

CUDA 数<br />

E.8.9<br />

素 ( 两<br />

cuArrayGetDescriptor()<br />

元<br />

width×height 号 字 符 ) 的 符 无<br />

E.8.10<br />

cuArrayDestroy()<br />

用 于 创 回 返<br />

在 *arrayDesc<br />

建 CUDA<br />

组 array<br />

E.8.11<br />

cuMemset()<br />

CUDA 符 。 这 对 已 经 传 递 了 述 描<br />

CUDA 程 很 有 用 ( 但 需 要 确 定 例 子<br />

、16- 位<br />

CUDA 毁 销<br />

E.8.12<br />

cuMemset2D()<br />

存 范 内 的<br />

组 array。<br />

为 指 定 的 值 value。 置<br />

将 8-<br />

或 32-<br />

行 数 位<br />

、16- 位<br />

,dstPitch 指<br />

cuMemAllocPitch()<br />

指 定 要 设 置 的 由 指 程<br />

114<br />

CUDA<br />

该 节 距 已 经 编<br />

1.1<br />

value。height 指 定 的 值 为 置<br />

南 Version<br />

将 8-<br />

或 32-<br />

的 2D<br />

width 围 范 存<br />

每 行 之 间 的 字 节 数 ( 参 见 E.8.3)。 定


程 指<br />

。<br />

分<br />

分<br />

。count 定 目 标 和 来 源 的 基 址 指 别<br />

参 数 将 其 关 联 到 流 。 它 仅 适 用 。 流<br />

。count 定 来 源 和 目 标 的 基 址 指 别<br />

。count 定 目 标 和 来 源 的 基 址 指 别<br />

E.8.13<br />

cuMemcpyHtoD()<br />

时 , 这 些 函 数 的 执 行 效 率 很 高 回 传<br />

。dstDevPtr 和<br />

cuMemcpyHtoDAsync() 是<br />

E.8.14<br />

cuMemcpyDtoH()<br />

宿 主 内 存 复 制 到 设 备 内 存 指 定 要 复 制 字 节 数 。 从<br />

页 面 锁 定 的 宿 主 内 存 , 如 果 传 递 指 向 可 分 页 内 存 的 指 针 作 为 输 入 , 则 此 函 数 返 回 错 误 于<br />

srcHostPtr<br />

。dstHostPtr 和<br />

srcDevPtr 分<br />

stream 的 , 可 以 通 过 传 递 非 零 步 异<br />

cuMemcpyDtoHAsync() 是<br />

参 数 将 其 关 联 到 流 。 它 仅 适 。 流<br />

E.8.15<br />

cuMemcpyDtoD()<br />

设 备 内 存 复 制 到 宿 主 内 存 指 定 要 复 制 的 字 节 数 。 从<br />

于 页 面 锁 定 的 宿 主 内 存 , 如 果 传 递 指 向 可 分 页 内 存 的 指 针 作 为 输 入 , 则 此 函 数 返 回 错 误 用<br />

定 要 复 制 的 字 节 数 。 指<br />

。dstDevPtr 和<br />

stream 的 , 可 以 通 过 传 递 非 零 步 异<br />

从 设 备 内 存 复 制 到 设 备 内 存<br />

srcDevPtr<br />

CUDA 编<br />

1.1 115<br />

南 Version


数<br />

。srcArray<br />

CUDA 数 的<br />

数<br />

。dstArray 和<br />

指<br />

数<br />

。dstHostPtr<br />

。count 指 指<br />

数 组 句 定 要 复 制 的 字 节 数 。 指<br />

组 组 句 柄 和 复 制 开 始 时 数 组 元 素 的 索 引 。 数<br />

。<br />

。srcArray srcIndex 和<br />

E.8.16<br />

cuMemcpyDtoA()<br />

组<br />

。srcDevPtr 指<br />

定 来 源 的 基 指 针<br />

。count 指<br />

E.8.17 cuMemcpyAtoD()<br />

CUDA 备 内 存 复 制 到 一 维 柄 和 开 始 索 引 设 从<br />

。dstDevPtr 指<br />

数<br />

和<br />

dstIndex<br />

CUDA 标 数 据 的 目 定<br />

count 指<br />

E.8.18<br />

cuMemcpyAtoH()<br />

复 制 到 设 备 内 存 元 素 自 然 对 齐 定 要 复 制 的 字 节 数 , 并 且 必 须 可 由 数 组 元 素 大 小 整 除 组<br />

CUDA 维 一 从<br />

srcIndex<br />

CUDA 标 的 基 指 针 , 并 且 必 须 与 目 定<br />

定 CUDA<br />

组 句 柄 和 开 始 索 引<br />

组 复 制 到 宿 主 内 存<br />

定 目 标 的 基 址<br />

要 复 制 的 字 节 数 。 定<br />

cuMemcpyAtoHAsync() 是<br />

流<br />

。<br />

E.8.19<br />

cuMemcpyHtoA()<br />

定 来 源 数 据 用 于 页 面 锁 定 的 宿 主 内 存 , 如 果 传 递 指 向 可 分 页 内 存 的 指 针 作 为 输 入 , 则 此 函 数 返 回 错 误 指<br />

116<br />

CUDA 编<br />

1.1<br />

CUDA 维 一 从<br />

stream 的 , 可 以 通 过 传 递 非 零 步 异<br />

参 数 将 其 关 联 到 流 。 它 仅 适<br />

Version 南 指 程


程 指<br />

数<br />

指<br />

数<br />

。CUDA 数<br />

copyParam 中 照<br />

数<br />

。dstArray<br />

。count 指 指 和<br />

数<br />

。dstIndex 和<br />

数<br />

组 句 数<br />

流 参 数 将 其 关 联 到 流 。 它 仅 适 。 。<br />

指<br />

分<br />

。count 是 数<br />

;count 元 素 的 大 小 不 需 要 具 有 相 同 的 格 式 , 但 必 须 具 有 相 同 的 大 小 中 组<br />

2D 内 行<br />

。CUDA_MEMCPY2D 制 结 复 存<br />

定 义 如 下 : 构<br />

组<br />

定 来 源 的 基 址<br />

cuMemcpyHtoAAsync() 是<br />

目 标 据 定 要 复 制 的 字 节 数 定<br />

E.8.20<br />

cuMemcpyAtoA()<br />

。srcHostPtr<br />

主 内 存 复 制 到 一 柄 和 开 始 索 引 从 宿<br />

页 面 锁 定 的 宿 主 内 存 , 如 果 传 递 指 向 可 分 页 内 存 的 指 针 作 为 输 入 , 则 此 函 数 返 回 错 误 于 用<br />

的 CUDA<br />

。dstArray 和<br />

维 CUDA<br />

dstIndex<br />

Width-1] 区<br />

stream 的 , 可 以 通 过 传 递 非 零 步 异<br />

的 字 节 数<br />

组<br />

间 内<br />

要 复 制<br />

须 可 由 此 大 小 整 除 。 必<br />

CUDA 个 一 维 一 从<br />

CUDA 制 到 另 一 个 一 维 复 组<br />

组<br />

srcArray<br />

别 指 定 要<br />

组 的 句 柄<br />

定 CUDA<br />

组 的 目 标 和 来<br />

E.8.21<br />

cuMemcpy2D()<br />

CUDA 的 目 标 和 来 源 制 复<br />

srcIndex<br />

按<br />

指 定 的 参 数 执<br />

CUDA 引 而 非 字 节 偏 移 , 这 些 索 引 值 位 于 索 源<br />

的 [0,<br />

CUDA 编<br />

1.1 117<br />

南 Version


数<br />

和<br />

和<br />

是 是 指<br />

义 如 下 : 分<br />

,srcXInBytes 必<br />

指<br />

于 设 备 指 针 , 开 始 地 址 为 对<br />

和<br />

和 则<br />

指 则<br />

指<br />

和 指 和 指 定 则<br />

指 定 目 标 数 据 的 句 柄 。 则<br />

。<br />

程 指<br />

srcMemoryType 和 : 中 其<br />

Cumemorytype_enum 定<br />

别 指 定 来 源 和 目 标 的 内 存 类 型 ;<br />

srcPitch 指<br />

和<br />

dstMemoryType<br />

定 来 源<br />

是<br />

和<br />

srcMemoryType 果 如<br />

CU_MEMORYTYPE_HOST,<br />

srcHost<br />

srcPitch<br />

据 的 ( 宿 主 ) 基 址 和 每 行 字 节 数 。 忽 略 srcArray。 数<br />

srcMemoryType 果 如<br />

CU_MEMORYTYPE_DEVICE,<br />

来 源 数 据 的 ( 设 备 ) 基 址 和 每 行 字 节 数 。 忽<br />

srcDevice<br />

略 srcArray。<br />

srcMemoryType 果 如<br />

CU_MEMORYTYPE_ARRAY,<br />

srcArray<br />

定 来 源 数 据 的 句 柄 。 定<br />

目 标 定<br />

srcHost、srcDevice 略 忽<br />

srcPitch。<br />

是<br />

dstMemoryType 果 如<br />

CU_MEMORYTYPE_HOST,<br />

dstHost<br />

dstPitch<br />

据 的 ( 宿 主 ) 基 址 和 每 行 字 节 数 。 忽 略 dstArray。 数<br />

srcXInBytes<br />

dstMemoryType 果 如<br />

CU_MEMORYTYPE_DEVICE,<br />

dstDevice<br />

dstPitch<br />

标 数 据 的 ( 设 备 ) 基 址 和 每 行 字 节 数 。 忽 略 dstArray。 目<br />

dstMemoryType 果 如<br />

CU_MEMORYTYPE_ARRAY,<br />

dstArray<br />

dstHost、dstDevice 略 忽<br />

dstXInBytes<br />

于 宿 主 指 针 , 开 始 地 址 对<br />

dstPitch。<br />

宿 主 于 设 备 指 针 , 开 始 地 址 为 对<br />

须 可 由 数 组 元 素 大 小 整 除<br />

srcY<br />

要 复 制 的 来 源 数 据 的 基 址 。 定<br />

要 复 制 的 目 标 数 据 的 基 址 。 定<br />

118<br />

CUDA 编<br />

1.1<br />

dstY<br />

CUDA 于 对<br />

组<br />

南 Version


程 指<br />

数<br />

CUDA 数 于<br />

、CUDA<br />

,dstXInBytes<br />

和 指 必<br />

中<br />

cuMemcpy2D() 配 与<br />

、CUDA 数<br />

,cuMemcpy2D() 会<br />

绑<br />

数<br />

或 中<br />

。flags 必<br />

数<br />

复<br />

没<br />

参<br />

。<br />

前 绑 定 到<br />

WidthInBytes<br />

cuMemcpy2D() 返<br />

组<br />

cuMemAllocPitch()<br />

对<br />

误 传 错 回<br />

↔ 设<br />

数<br />

设<br />

制 的 宽 度 ( 单 位 为 字 节 ) 和 高 度 。 任 何 节 。<br />

则<br />

是 cuMemAllocPitch()<br />

Height<br />

须 可 由 数 组 元 素 大 小 整 除<br />

2D 执 行 的 要 定<br />

必 须 大 于 或 等 于 WidthInBytes。 距<br />

计 算 出 来 的<br />

败 。 返 回 错 误 代 码 时 , 运 行 速 度 可 能 会 显 著 降 低 失<br />

E.2.6 任 何 节 距 大 于 允 许 的 最 大 值 ( 参 见 果 如<br />

的 CU_DEVICE_ATTRIBUTE_MAX_PITCH),<br />

cuMemcpy2D() 将<br />

回 备 。<br />

cuMemcpy2DAsync() 是<br />

使 用 的 节 距 对 于 设 备 内 的 内 存 复 ( 设 备 组 ), 如 果 节 距 不 有 此 限 制 , 但 当 。 合<br />

E.9 纹 理 参 考 管 理<br />

备<br />

组 ↔<br />

组 ↔CUDA<br />

而 cuMemcpy2DUnaligned()<br />

E.9.1<br />

锁 定 的 宿 主 内 存 , 如 果 传 递 指 向 可 分 页 内 存 的 指 针 作 为 输 入 , 则 此 函 数 返 回 错 误<br />

cuTexRefCreate()<br />

面<br />

cuTexRefSetArray()<br />

将<br />

stream 的 , 可 以 通 过 传 递 非 零 步 异<br />

数 与 流 相 关 联 。 它 仅 适 用 于 页<br />

此 参 考 与 已 分 配 内 存 相 关 联 。 当 通 过<br />

E.9.2<br />

cuTexRefDestroy()<br />

*texRef 纹 理 参 考 并 在 建 创<br />

返 回 其 句 柄 。 创 建 之 后 , 应 用 程 序 必 须 调 用<br />

将 纹 理 参 考 与 给 定 函 数 的 纹 理 序 号 相 关 联 , 应 用 程 序 应 该 调 用 cuParamSetTexRef()。 要<br />

此 纹 理 参 考 读 取 内 存 时 , 其 它 纹 理 参 考 函 数 用 于 指 定 要 使 用 的 格 式 和 解 释 方 法 ( 寻 址 、 过 滤 等 )。<br />

E.9.3<br />

cuTexRefSetArray()<br />

毁 纹 理 参 考 。 销<br />

cuTexRefSetAddress()<br />

函 数 也 将 取 代 与 该 纹 理 参 考 相 关 联 的 任 何 先<br />

texRef 的<br />

数<br />

先<br />

CUDA 地 址 或 的 前<br />

组 状 态<br />

须 设 置<br />

任<br />

组 都 将 解 除 绑 定 。 此<br />

CUDA 编<br />

1.1 119<br />

为 CU_TRSA_OVERRIDE_FORMAT。<br />

将 CUDA<br />

组 array<br />

到 纹 理 参 考 texRef。 定<br />

何 CUDA<br />

南 Version


数<br />

绑<br />

中<br />

的<br />

和<br />

如<br />

如<br />

函 在<br />

可<br />

ByteOffset<br />

中<br />

为<br />

与<br />

0, 则 将 该 寻 址 模 式 应 用 于 纹 理 为<br />

。<br />

程 指<br />

E.9.4<br />

cuTexRefSetAddress()<br />

*byteOffset<br />

此<br />

回 必 须 应 用 于 纹 理 拾 取 的 字 节 偏 移 , 以 便 从 所 需 内 存 中 读 取 数 据 。 此 偏 移 必 须 除 以 纹 理 元 素 传<br />

线 性 地 址 范 围 绑 定 到 纹 理 参 考 texRef。 将<br />

函 数 也 将 取 代 与 该 纹 理 参 考 相 关 联 的 任 何 先 前 的 地<br />

CUDA 或 址<br />

何 内 存 都 将 解 除 绑 定 。 任<br />

E.9.5<br />

cuTexRefSetFormat()<br />

数 传 递 。 参<br />

texRef 态 。 先 前 绑 定 到 状 组<br />

cuTexRefSetAddress() 硬 件 强 制 对 纹 理 基 址 执 行 对 齐 要 求 , 所 以 为 因<br />

读<br />

CUDA_ARRAY_DESCRIPTOR<br />

要 由 纹 理 参 结 定 指<br />

。format 和<br />

成<br />

tex1Dfetch() 并 传 递 给 读 取 该 纹 理 数 据 的 内 核 , 以 便 其 可 以 应 用 于 小 大<br />

。 数<br />

cuMemAlloc() 设 备 内 存 指 针 从 果 如<br />

回 , 则 偏 移 保 证 为 0, 返<br />

且 NULL<br />

以 作<br />

员 完 全 类 似 : 它 们 指 定 每 个<br />

E.9.6<br />

cuTexRefSetAddressMode()<br />

的 数 据 的 格 式 分 量 的 格 式 和 每 个 数 组 元 素 的 分 量 数 。 取<br />

的<br />

CUaddress_mode 定<br />

1, 则 应 用 于 第 二 个 , 以 此 类 推 。 为<br />

考 texRef<br />

numPackedComponents<br />

Format 的 构<br />

NumChannels<br />

果 dim<br />

120<br />

CUDA 编<br />

1.1<br />

texRef 理 参 考 纹 为<br />

维 度 指 定 寻 址 模 式 mode。 某<br />

E.9.7<br />

如 : 义<br />

cuTexRefSetFilterMode()<br />

下<br />

, 如 定 到 线 性 内 存 , 则 此 调 用 不 产 生 任 何 效 果 意 注<br />

果 dim<br />

取 所 使 用 的 函 数 的 第 一 个 参 数 ( 参 见 4.4.5); 拾<br />

果 texRef<br />

南 Version


程 指<br />

texRef 读 考<br />

绑<br />

CU_TRSF_READ_AS_INTEGER, 禁<br />

中<br />

中<br />

*mode 中 在<br />

绑<br />

的<br />

CUDA 数 的<br />

义 定<br />

[0, 1] 区 为<br />

(Dim CUDA 是<br />

何 CUDA<br />

和<br />

指 定 通 过 纹 理 参<br />

E.9.8<br />

cuTexRefSetFlags()<br />

下 : 如<br />

mode。CUfilter_mode_enum 存 时 要 使 用 的 过 滤 模 式 内 取<br />

默 认 设 置 ; 种<br />

止 把 纹 理 从 整 数 数 据 转 化<br />

。<br />

texRef , 如 果 意 注<br />

定 到 线 性 内 存 , 则 此 调 用 不 产 生 任 何 效 果<br />

CU_TRSF_NORMALIZED_COORDINATES, 禁<br />

Dim) 区<br />

1.0) 区<br />

定 可 选 标 识 以 控 制 通 过 纹 理 参 考 返 回 数 据 的 操 作 方 式 。 有 效 的 标 识 包 括 : 指<br />

引 用 数 组 维 度 的 整 间<br />

间<br />

E.9.9<br />

cuTexRefGetAddress()<br />

宽 度 。 个<br />

[0, 理 坐 标 落 在 纹 止<br />

E.9.10<br />

cuTexRefGetArray()<br />

间 的 浮 点 数 据 这<br />

[0, 的 宽 度 或 高 度 ) 这 种 默 认 设 置 。 相 反 , 纹 理 坐 标 使 用 组 数<br />

在 *devPtr<br />

texRef 要 绑 定 到 纹 理 参 考 回 返<br />

E.9.11<br />

cuTexRefGetAddressMode()<br />

围 , 则 返 回 CUDA_ERROR_INVALID_VALUE。 范<br />

基 址 , 如 果 此 纹 理 参 考 未 绑 定 到 任 何 设 备 内 存<br />

texRef 考<br />

的<br />

维<br />

,dim 的<br />

在 *array<br />

texRef 由 纹 理 参 考 回 返<br />

组 , 如 果 此 纹 理 参 考 未 绑 定 到 任<br />

CUDA 编<br />

1.1<br />

度 的 寻 址 模 式 。 当 前 有 效 值 只 1。<br />

121<br />

组 , 则 返 回 CUDA_ERROR_INVALID_VALUE。 数<br />

定<br />

E.9.12<br />

cuTexRefGetFilterMode()<br />

纹 理 参 回 返<br />

南 Version<br />

dim<br />

有 0


*mode 中 在<br />

texRef 的 考<br />

。<br />

format 量 格 式 和 分 量 数 。 如 果 或 为 中 和<br />

中<br />

互<br />

访<br />

的<br />

标 识 。 的<br />

的<br />

为<br />

的<br />

绘<br />

OpenGL 互 它<br />

组 的 分 。 数<br />

OpenGL 的<br />

以 映 射 此 缓 冲 对 象 之 前 , 必 图 命 令 的 数 据 来 源 之 外 , 此 缓 冲 对 象 不 能 由 任 何 可<br />

上<br />

和<br />

E.9.13<br />

cuTexRefGetFormat()<br />

纹 理 参 过 滤 模 式 回 返<br />

空 , 则 将 其 忽 略<br />

E.9.14<br />

cuTexRefGetFlags()<br />

在 *format<br />

*numPackedComponents<br />

E.10 OpenGL 互 操 作 性<br />

texRef 绑 定 到 纹 理 参 考 回 返<br />

CUDA<br />

numPackedComponents<br />

E.10.1<br />

cuGLInit()<br />

在 *flags<br />

texRef 纹 理 参 考 回 返<br />

E.10.2<br />

cuGLRegisterBufferObject()<br />

作 。 必 须 在 任 何 其 驱 动 程 序 工 具 不 可 用 , 则 此 函 数 可 能 失 败 。 操<br />

操 作 之 前 调 用 。 如 果 所 需<br />

OpenGL 化 始 初<br />

OpenGL 命<br />

E.10.3<br />

cuGLMapBufferObject()<br />

CUDA 供 册 注<br />

使 用 。 令<br />

*size 中 为<br />

ID 的 问<br />

bufferObj<br />

CUDA 对 象 。 在 冲 缓<br />

OpenGL 用 此 函 数 。 注 册 之 后 , 除 作 为 调 须<br />

122<br />

CUDA 编<br />

1.1<br />

E.10.4<br />

cuGLUnmapBufferObject()<br />

回 结 果 映 射 的 基 指 针 和 大 小 。 返<br />

将 ID<br />

bufferObj<br />

CUDA 对 象 映 射 到 当 前 冲 缓<br />

Version<br />

下 文 的 地 址 空 间 中 , 并<br />

南 指 程<br />

在 *devPtr


程 指<br />

访<br />

访<br />

设<br />

访<br />

顶<br />

访<br />

为<br />

为<br />

的<br />

缓 冲 对 象 。 的<br />

的<br />

初<br />

Direct3D 顶 的<br />

映<br />

VB 的 冲<br />

Direct3D 设 射<br />

设<br />

上<br />

可<br />

。<br />

中<br />

用 cuD3D9End()<br />

返<br />

E.10.5<br />

cuGLUnregisterBufferObject()<br />

对 象 的 映 射 冲 缓<br />

CUDA 供 消 取<br />

ID 的 问<br />

bufferObj<br />

E.11 Direct3D 互 操 作 性<br />

销 注<br />

互 操 作 性<br />

E.11.1<br />

cuD3D9Begin()<br />

供 CUDA<br />

ID 的 问<br />

bufferObj<br />

E.11.2<br />

cuD3D9End()<br />

调 用 此 函 数 。 然 后 , 此 函 数 可 以 映 为 止 。 须<br />

的 任 何 对 象 之 前 , 必<br />

Direct3D 化 与 始 初<br />

E.11.3<br />

cuD3D9RegisterVertexBuffer()<br />

备 device<br />

CUDA 作 。 在 操 互<br />

device 射 映 以<br />

拥 有 的 顶 点 缓 冲 , 直 到 调 备<br />

的 互 操 作 。 备<br />

E.11.4<br />

cuD3D9MapVertexBuffer()<br />

问<br />

cuD3D9Begin() 与 先 前 束 结<br />

Direct3D 的 化 始<br />

*devPtr 在<br />

*size 中<br />

和<br />

CUDA 供 册 注<br />

缓 冲 VB。 点<br />

E.11.5<br />

cuD3D9UnmapVertexBuffer()<br />

的 地 址 空 间 中 , 并 回 结 果 映 射 的 基 指 针 和 大 小 。 文 下<br />

CUDA 编<br />

1.1 123<br />

消 问 的 顶 点 缓 映 射 。 取<br />

将 Direct3D<br />

VB 冲 缓 点<br />

CUDA 当 前 到 射<br />

供 CUDA<br />

南 Version


中<br />

访<br />

相<br />

IDirect3D9::GetAdapterIdentifier()<br />

。 或<br />

程 指<br />

E.11.6<br />

cuD3D9UnregisterVertexBuffer()<br />

E.11.7<br />

cuD3D9GetDevice()<br />

应 的 设 备<br />

CUDA 供 销 注<br />

的 顶 点 缓 冲 VB。 问<br />

在 *dev<br />

EnumDisplayDevices 与 从 回 返<br />

adapterName 得 的 适 配 器 名 称 获 中<br />

124<br />

CUDA 编<br />

1.1<br />

南 Version


程 指<br />

重<br />

在 寻 一 化 纹 理 坐 标 xˆ 归<br />

的<br />

,x 和<br />

和<br />

为<br />

是<br />

未<br />

来<br />

已<br />

个<br />

为<br />

寻<br />

为<br />

为<br />

的<br />

的<br />

:x=Nxˆ,y=Myˆ。<br />

。<br />

中<br />

。x 和<br />

N×M<br />

x<br />

为<br />

换<br />

由<br />

附 录 F<br />

纹 理 拾 取<br />

<br />

数 的 返 回 值 。 绑 定 到 纹 理 参 考 的 纹 理 对 于 一 维 纹 理 表 示 函<br />

附 录 给 出 一 系 列 公 式 , 这 些 公 式 用 于 根 据 各 种 纹 理 参 考 属 性 ( 参 见 4.3.4) 本<br />

算 4.4.5<br />

为 N<br />

计<br />

的 纹 理<br />

x 理 元 素 。 它 使 用 纹 理 坐 标 纹 个<br />

y<br />

<br />

为 0, 如<br />

T 坐 标 必 须 落 在 理 纹<br />

理 元 素 的 数 组 T, 对 于 二 维 纹 理 表 示 拾 取 。 寻 址 范 围 之 内 , 才 能 用 于 寻 址 T。 寻 址 模 式 指 定 如 何 将 超 出 范 围 的 纹 理 坐 纹<br />

模 式 , 如 果 x


显<br />

,i=floor(x),j=floor(y)。<br />

,tex(x,y)=T[i,j],<br />

,tex(x)=T[i],<br />

的<br />

F-1.<br />

四 个 纹 理 元 素 的 一 维 纹 理 的 最 近 点 采 样 图<br />

1.0]( 参<br />

程 指<br />

F.1 最 近 点 采 样<br />

对<br />

对<br />

此 过 滤 模 式 中 , 纹 理 拾 取 返 回 值 为 : 在<br />

于 二 维 纹 理<br />

于 一 维 纹 理<br />

[0.0, 整 数 纹 理 , 纹 理 拾 取 的 返 回 值 可 以 重 映 射 到 于 对<br />

其 中<br />

图 F-1<br />

维 纹 理 的 最 近 点 采 样 。 一<br />

4.3.4.1)。 见<br />

N=4 了 示<br />

126<br />

CUDA 编<br />

1.1<br />

南 Version


程 指<br />

,tex(x,y)=(1-α)(1-β)T[i,j]+α(1-β)T[i+1,j]+(1-α)βT[i,j+1]+αβT[i+1,j+1],<br />

i=floor(x B ),α=frac(x B ),x B<br />

,tex(x)=(1-α)T[i]+αT[i+1],<br />

j=floor(y<br />

=x-0.5,<br />

B ),α=frac(y B ),y B =y-0.5。<br />

显<br />

位<br />

的<br />

位<br />

F-2. clamp 寻 址 模 式 中 四 个 纹 理 元 素 的 一 维 纹 理 的 线 性 过 滤 图<br />

F.2 线 性 过 滤<br />

对<br />

过 滤 模 式 ( 仅 可 用 于 浮 点 纹 理 ) 中 , 纹 理 拾 取 的 返 回 值 为 : 在<br />

对<br />

中 : 其<br />

于 一 维 纹 理<br />

于 二 维 纹 理<br />

8 β 使 用 包 括 和 α<br />

9- 值 的 数 小<br />

点 格 式 存 储 。 定<br />

图 F-2<br />

N=4 了 示<br />

维 纹 理 的 最 近 点 采 样 。 一<br />

CUDA 编<br />

1.1 127<br />

南 Version


显<br />

N=4 的 从<br />

F-3.<br />

使 用 线 性 过 滤 的 一 维 查 找 表 图<br />

谢 致<br />

找 表 。 查<br />

程 指<br />

F.3 查 找 表<br />

[0,R] 区 间 内 于 对<br />

TL ( R)<br />

= T[<br />

N −1]<br />

。<br />

实<br />

N −1<br />

TL ( x)<br />

= tex(<br />

x + 0.5<br />

R<br />

,<br />

现 为 )<br />

[0]<br />

保 确 而 从<br />

TL ( 0) = T 且<br />

一 维 纹 理 中 使 用 纹 理 过 滤 来 实<br />

R=4 现<br />

R=1 的<br />

或<br />

示 了<br />

的 x, 查 找<br />

图 F-3<br />

表 TL(x)<br />

128<br />

CUDA<br />

刘 伟 峰 先 生 对 本 指 南 中 文 版 译 稿 全 文 进 行 了 审 校 , 在 此 表 示 衷 心 的 感 谢<br />

编<br />

1.1<br />

南 Version

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!