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