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 />

个 的 位<br />

,warp<br />

块 块 块<br />

位<br />

位<br />

是<br />

展<br />

块<br />

等<br />

时<br />

节<br />

是<br />

(stride)<br />

位<br />

块<br />

和<br />

是 时<br />

__shared__ float shared[32];<br />

float data = shared[BaseIndex + s * tid];<br />

存<br />

的 和 访 的 是<br />

位<br />

tid 进<br />

的<br />

块<br />

的<br />

突 。<br />

存 储 体 冲 突 。 为 了 获 得 最 大 化 的 性 能 , 有 必 要 理 解 存 储 器 地 址 如 何 映 射 到 存 储 体 以 调 度 存 储 器 请 求 , 以 最 小 化 存 储 体 冲<br />

(n-way)<br />

32 共 享 存 储 器 空 间 , 存 储 体 采 用 了 这 样 一 种 组 织 方 式 : 为 连 续 的 存 储 体 分 配 连 续 的 于 对<br />

字 , 每 个 存 储<br />

32 带 宽 都 是 的 体<br />

/2<br />

钟 周 期 。 时<br />

1.x 计 算 能 力 为 于 对<br />

设 备<br />

大 小 是 32, 的<br />

体 的 数 量 为 16( 储<br />

5.1 第 见<br />

);warp<br />

的 共<br />

参<br />

为<br />

warp 储 器 请 求 将 分 割 为 一 个 针 对 存 享<br />

warp 部 分 的 请 求 和 一 个 针 对 半 上<br />

下 半 部 分 的 请 求 。 因 而 , 属<br />

于 warp<br />

warp 部 分 的 线 程 和 属 于 一 第<br />

二 部 分 的 线 程 之 间 不 可 能 出 现 存 储 体 冲 突 。 第<br />

32 常 见 的 情 况 就 是 各 线 程 访 问 数 组 中 的 种 一<br />

ID 使 用 线 程 , 字<br />

行 索 引 , 步 幅<br />

s:<br />

是<br />

的<br />

s*n 例 中 , 只 要 本 在<br />

m 体 储 存<br />

n , 或 者 说 只 要 数 倍<br />

m/d<br />

d ( 其 中 数 倍<br />

m<br />

s<br />

最 大 公<br />

char 数<br />

__shared__ char shared[32];<br />

char data = shared[BaseIndex + tid];<br />

, 则 将 出 现 存 储 体 冲 突 : 组<br />

和<br />

位<br />

属<br />

tid ), 线 程 数 约<br />

tid+n<br />

warp 就 是 同 一 个 存 储 体 。 因 而 , 只 有 在 的 问<br />

m/d 半 大 小 小 于 等 于 一 的<br />

,<br />

1.x 会 存 在 存 储 体 冲 突 。 对 于 计 算 能 力 是 不 才<br />

d , 可 以 说 只 有 在 备 设<br />

于 1<br />

s 者 说 只 有 在 或 ,<br />

图 5-5<br />

图 5-6<br />

5-7 无 冲 突 存 储 器 访 问 的 示 例 , 图 了 示<br />

了 导 致 存 储 体 冲 突 的 存 储 器 访 问 示 例 。 示<br />

char data = shared[BaseIndex + 4 * tid];<br />

double<br />

__shared__ double shared[32];<br />

double data = shared[BaseIndex + tid];<br />

位 数<br />

突 , 但 若 通 过 以 下 方 式 访 问 同 一 个 数 组 : 路 冲<br />

操<br />

m 时 , 才 不 会 存 在 存 储 体 冲 突 , 因 为 数 奇<br />

2<br />

。 幂<br />

shared[0]、shared[1]、shared[2] 来 说 , 由 于 例 举<br />

shared[3]<br />

于 同 一 个 存 储 体 。 因 此 不 存 在 存 储 体<br />

32 值 得 注 意 的 情 况 还 包 括 在 各 线 程 访 问 小 于 或 大 于 他 其<br />

元 素 时 。 举 例 来 说 , 如 果 通 过 以 下 方 式 访 问 的<br />

__shared__ int shared_lo[32];<br />

__shared__ int shared_hi[32];<br />

double dataIn;<br />

shared_lo[BaseIndex + tid] = __double2loint(dataIn);<br />

shared_hi[BaseIndex + tid] = __double2hiint(dataIn);<br />

double dataOut =<br />

__hiloint2double(shared_hi[BaseIndex + tid],<br />

shared_lo[BaseIndex + tid]);<br />

数 分 割 为 两 部 分 , 如 以 下 示 例 代 码 所 示 : 作<br />

2 存 在 将 组<br />

储 体 冲 突 : 存<br />

__shared__ struct type shared[32];<br />

struct type data = shared[BaseIndex + tid];<br />

这 种 做 法 并 非 总 是 能 够 提 高 性 能 , 在 未 来 的 架 构 中 可 能 表 现 更 差 。 结 构 体 赋 值 将 在 必 要 时 编 译 为 针 对 结 构 体 中 各 成 员 的 多 个 存 储 器 请 求 , 因 此 , 以 下 代 码 : 但<br />

32 存 储 器 请 求 将 编 译 为 两 个 独 立 的 于 由<br />

double 。 在 本 例 中 避 免 存 储 体 冲 突 的 方 法 之 一 就 是 将 求 请<br />

如<br />

定<br />

struct type {<br />

:<br />

};<br />

float x, y, z;<br />

如<br />

得 到 以 下 结 果 将<br />

定<br />

struct type {<br />

float x, y;<br />

};<br />

如<br />

定<br />

struct type {<br />

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

45<br />

果 type<br />

如 下 , 则 进 行 两 次 有 存 储 体 冲 突 的 存 储 器 读 取 : 义<br />

果 type<br />

如 下 , 则 进 行 三 次 无 存 储 体 冲 突 的 存 储 器 读 取 : 义<br />

32 因 为 每 个 成 员 都 是 使 用 三 个 是 这<br />

作 为 步 幅 访 问 的 。 字<br />

32 因 为 每 个 成 员 都 是 使 用 两 个 是 这<br />

作 为 步 幅 访 问 的 。 字<br />

2.0 南 , 版 本 指 程<br />

果 type<br />

如 下 , 则 进 行 两 次 有 存 储 体 冲 突 的 存 储 器 读 取 : 义

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

Saved successfully!

Ooh no, something went wrong!