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 />
如 下 , 则 进 行 两 次 有 存 储 体 冲 突 的 存 储 器 读 取 : 义