30.04.2014 Views

NVIDIA CUDA 计算统一设备架构

NVIDIA CUDA 计算统一设备架构

NVIDIA CUDA 计算统一设备架构

SHOW MORE
SHOW LESS

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

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

块<br />

器 延 迟 。<br />

的<br />

(if、switch、do、for、while)<br />

的<br />

为<br />

块<br />

块<br />

谓<br />

了<br />

、4<br />

块<br />

是<br />

节<br />

块<br />

块<br />

果 x<br />

对 值 大 于 48039( 绝<br />

见 math_functions.h<br />

5.1.2.2 低 性 能 , 因 为 本 地 存 储 器 的 延 迟 较 高 , 也 存 在 带 宽 问 题 ( 请 参 见 第 降 步<br />

)。<br />

<br />

<br />

单 节 可 通 过 以 下 方 法 避 免 上 述 的 后 两 种 情 况 : 双<br />

成 本 更 高 , 如 参 解 更 多 细 节 ), 则 成 本 还 要 更 高 ( 也 就 是 说 , 速 度 降 低 约 一 个 数 量 级 )。 此 外 , 在 这 种 情 况 下 , 参 数 约 减 代 码 使 用 本 地 存 储 器 , 这 可 能 会 进 一 有 些 时 候 , 编 译 器 必 须 插 入 转 换 指 令 , 这 又 带 来 了 额 外 的 执 行 周 期 。 可 能 导 致 此 类 情 况 的 条 件 包 括 : 的<br />

类 精 度 浮 点 常 量 ( 定 义 时 不 带 任 何 类 型 后 缀 ) 用 作 单 精 度 浮 点 计 算 的 输 入 ; 或<br />

<br />

<br />

5.1.1.2 控 制 流 指 令<br />

力 能 算 计 如<br />

后 类 或 更 低 的 设 备 , 应 将 双 精 度 算 法 替 换 为 单 精 度 算 法 。 后<br />

控 制 流 指 令<br />

对 char<br />

short<br />

进 行 操 作 的 函 数 , 其 操 作 数 通 常 需 要 转 换 为 int; 型<br />

B.1.2 浮 点 变 量 用 作 度 精<br />

定 义 的 数 学 函 数 的 双 精 度 版 本 的 输 入 参 数 。 所<br />

的 线 程 分 支 , 从 而 显 著 影 响 有 效 的<br />

型 和 单 精 度 数 学 函 数 。 在 为 不 具 备 本 地 双 精 度 支 持 的 设 备 编 译 时 ,<br />

f 单 精 度 浮 点 常 量 , 在 定 义 时 带 用 使<br />

, 如 3.141592653589793f、1.0f、0.5f; 缀<br />

/ WSIZE) 时 块 块<br />

节<br />

f 数 学 函 数 的 单 精 度 版 本 , 定 义 时 同 样 带 用 使<br />

, 如 sinf()、logf()、expf()。 缀<br />

float 单 精 度 代 码 , 强 烈 建 议 使 用 于 对<br />

为 1.2<br />

任 何 流 控 制 指 令<br />

warp 致 同 一 导 会<br />

节<br />

块<br />

(branch<br />

unroll<br />

或 语 指 来 predication)<br />

令 吞 吐 量 , 也 就 是 说 , 这 些 指 令 会 导 致 线 程 采 用 不 同 的 执 行 路 径 。 如 果 出 现 这 种 情 况 , 就 必 须 序 列 化<br />

(serialize) 不 将 重 新 汇 聚 到 同 一 执 行 路 径 。 指<br />

warp 执 行 路 径 , 因 而 增 加 了 该 的 同<br />

执 行 的 指 令 总 数 。 完 成 所 有 不 同 的 执 行 路 径 时 , 线 程<br />

都<br />

ID 在 控 制 流 以 线 程 了 为<br />

warp 的 情 况 下 获 得 最 佳 性 能 , 应 编 写 控 制 条 件 , 最 小 化 分 支 据 依<br />

的 数 量 。<br />

warp 完 全 可 行 的 , 因 为 是 这<br />

3.1 内 的 分 布 情 况 是 确 定 的 , 如 块 在<br />

所 述 。 以 一 个 简 单 的 情 况 为 例 , 当<br />

或<br />

的<br />

(threadIdx 条 件 仅 依 赖 于 制 控<br />

WSIZE 如 此 , 其 中 的 是 就<br />

warp<br />

的 大 小 。 此 时 不 会 出 现 任<br />

在 使 用 转 移 猜 测 时 , 依 靠 控 制 条 件 执 行 的 任 何 指 令 都 不 会 被 跳 过 。 而 是 分 别 与 一 个 每 线 程 条 件 代 码 或 根 据<br />

何 warp<br />

warp , 因 为 控 制 条 件 与 支 分<br />

美 对 齐 。 完<br />

相 (predicate)<br />

5.1.1.3 存 储 器 指 令<br />

有 些 时 候 , 控 制 器 可 能 会 展 开 循 环 , 或 通 过 使 用 转 移 猜 测<br />

if 化 优<br />

switch<br />

句 ,<br />

warp 将 加 以 介 绍 。 在 这 些 情 况 下 , 不 会 有 任 何 文 下<br />

#pragma 。 程 序 员 还 可 使 用 支 分<br />

令 控 制 循<br />

4.2.5.2 展 开 ( 请 参 见 第 的 环<br />

)。<br />

warp<br />

。 只 有 在 分 支 条 件 控 制 的 指 令 数 量 小 于 或 等 于 特 定 阈 值 时 , 编 译 器 才 会 使 用 猜 测 的 指 令 替 换 分 支 指 令 : 如 果 编 译 确 定 出 有 可 能 产 生 大 量 分 支 的 条 件 , 则 此 阈 值 为 7, 否 则 为 4。 作 数<br />

器 指 令 包 含 读 取 或 写 入 共 享 、 本 地 或 全 局 存 储 器 的 任 何 指 令 。 只 有 在 使 用 某 些 自 动 变 量 时 才 会 发 生 本 节 储 存<br />

到<br />

个<br />

个<br />

块<br />

true 条 件 设 置 为 制 控<br />

false<br />

谓 词<br />

关 联 , 尽 管 每 一 条 指 令 都 为 执 行 而 进 行 了 调 度 , 但 只<br />

true 词 为 谓 有<br />

false 才 会 被 实 际 执 行 。 带 有 令 指<br />

词 的 指 令 不 会 写 入 结 果 , 也 不 会 计 算 地 址 或 读 取 操<br />

__shared__ float shared[32];<br />

__device__ float device[32];<br />

shared[threadIdx.x] = device[threadIdx.x];<br />

个 个<br />

到<br />

个<br />

<strong>CUDA</strong> 编<br />

37<br />

果 在 等 待 全 局 存 储 器 访 问 完 成 时 有 足 够 的 独 立 算 数 指 令 可 发 出 , 则 线 程 调 度 程 序 可 隐 藏 这 样 的 全 局 存 储 如<br />

例 说 明 , 注 意 以 下 示 例 代 码 中 的 赋 值 运 算 符 : 举<br />

4.2.2.4 储 器 访 问 , 详 见 第 存 地<br />

。<br />

4 理 器 要 占 用 处 多<br />

warp 周 期 来 为 一 个 钟 时<br />

发 出 一 条 存 储 器 指 令 。 在 访 问 本 地 或 全 局 存 储 器 时 , 还<br />

400 额 外 的 在 存<br />

600<br />

钟 周 期 的 存 储 器 延 迟 。 时<br />

4 占 用 将 它<br />

时 钟 周 期 来 发 送 全 局 存 储 器 的 读 取 指 令<br />

时 钟 周 期 来 发 送 共 享 存 储 器 的 写 入 指 令 , 但<br />

2.0 南 , 版 本 指 程<br />

400 需 要 共 总<br />

600<br />

钟 周 期 来 从 全 局 存 储 器 读 取 一 个 浮 点 数 。 时

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!