30.04.2014 Views

NVIDIA CUDA 计算统一设备架构

NVIDIA CUDA 计算统一设备架构

NVIDIA CUDA 计算统一设备架构

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

节<br />

变<br />

和<br />

助<br />

变<br />

(implied<br />

(segmentation 和 fault)<br />

助<br />

节<br />

可<br />

4.2.2.3 __shared__<br />

__shared__ 限<br />

<br />

<br />

尽 与 位<br />

过 网 格 内 的 所 有 线 程 访 问 , 也 可 通 过 运 行 时 库 从 宿 主 访 问 。 通<br />

于 线 程 块 的 共 享 存 储 器 空 间 中 ; 限<br />

具 有 相 同 的 生 命 周 期 ; 节 块<br />

extern __shared__ float shared[];<br />

节<br />

short array0[128];<br />

float array1[64];<br />

int array2[256];<br />

通 过 块 内 的 所 有 线 程 访 问 。 参 将 共 享 存 储 器 声 明 为 外 部 数 组 时 , 例 如 : 可<br />

, 因 此 数 组 中 的 变 量 布 局 必 须 通 过 偏 移 显 式 管 理 。 例 如 , 如 果 一 名 用 户 希 望 在 动 态 分 配 的 共 享 存 储 器 内 始<br />

__device__ 可 选 择 与 符 定<br />

符 一 起 使 用 , 所 声 明 的 变 量 具 有 以 下 特 征 : 定<br />

extern __shared__ char array[];<br />

__device__ void func() // __device__ or __global__ function<br />

{<br />

short* array0 = (short*)array;<br />

float* array1 = (float*)&array0[128];<br />

int* array2 = (int*)&array1[64];<br />

}<br />

得 与 以 下 代 码 对 应 的 内 容 : 则 应 通 过 以 下 方 法 声 明 和 初 始 化 数 组 : 获<br />

有 在 __syncthreads()( 只<br />

4.4.2 第 见<br />

) 的 执 行 写 入 之 后 , 才 能 保 证 共 享 变 量 对 其 他 线 程 可 见 。 除 非 变<br />

volatile 声 明 为 被 量<br />

, 否 则 只 要 之 前 的 语 句 完 成 , 编 译 器 即 可 随 意 优 化 共 享 存 储 器 的 读 写 操 作 。 量<br />

4.2.3 的 大 小 将 在 启 动 时 确 定 ( 参 见 第 组 数<br />

)。 所 有 变 量 均 以 这 种 形 式 声 明 , 在 存 储 器 中 的 同 一 地 址 开<br />

4.2.2.4 限 制<br />

和<br />

成<br />

__shared__ 和<br />

变<br />

static storage)。<br />

__constant__<br />

量 无 法 使<br />

字 定 义 为 外 部 变 量 。 键<br />

__device__、__shared__ 和<br />

变<br />

关<br />

__device__ 和<br />

变<br />

struct 限 定 符 不 允 许 被 用 于 在 宿 主 上 执 行 的 函 数 内 的 些 这<br />

union<br />

的 形 参 和 局 部 变 量 。 员<br />

_shared_ 变<br />

量 的 声 明 中 不 可 包 含 初 始 化<br />

和<br />

)。<br />

__constant__<br />

量 具 有 隐 含 的 静 态 存 储<br />

设 备 代 码 中 声 明 、 不 带 任 何 限 定 符 的 自 动 变 量 通 常 位 于 寄 存 器 中 。 但 在 某 些 情 况 下 , 编 译 器 可 能 择 将 其 置 于 本 地 存 储 器 中 。 如 果 使 用 占 用 了 过 多 寄 存 器 空 间 的 大 型 结 构 或 数 组 , 或 者 编 译 器 无 法 确 定 其 是 否 使 汇 或 选 在<br />

options =-v<br />

。<br />

选<br />

用 extern<br />

__constant__<br />

仅 允 许 在 文 件 作 用 域 内 使 用 。 量<br />

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

针 即 受 支 持 , 否 则 将 仅 限 于 指 向 在 全 局 存 储 器 空 间 中 分 配 或 声 明 的 存 储 器 。<br />

15<br />

__constant__ 为 设 备 或 从 设 备 指 派 可 不<br />

4.5.2.3 仅 可 通 过 宿 主 运 行 时 函 数 从 宿 主 指 派 ( 参 见 第 , 量<br />

第 4.5.3.6<br />

--ptxas- 寄 存 器 空 间 。 可 通 过 使 用 多 过<br />

项 编 译 来 进 行 检 查 , 这 将 报 告 本 地 存 储 器 的 使 用 情 况<br />

ptx 定 数 量 索 引 的 数 组 , 则 往 往 会 出 现 这 种 情 况 。 检 查 固 用<br />

–ptx 码 ( 通 过 使 用 代 编<br />

–keep<br />

项 编<br />

用 , 将 导 致 不 确 定 的 行 为 , 往 往 会 出 现 分 区 错 误<br />

用 程 序 终 止 。 应<br />

.local 得 ) 即 可 在 初 次 编 译 过 程 中 确 定 一 个 变 量 是 否 位 于 本 地 存 储 器 中 , 因 为 它 将 使 用 获 译<br />

记 符 声 明 ,<br />

如 果 取 消 在 宿 主 上 执 行 的 代 码 中 全 局 或 共 享 存 储 器 指 针 , 或 者 在 设 备 上 执 行 的 代 码 中 宿 主 存 储 器 指 针 的 引<br />

只 要 编 译 器 能 够 确 定 在 设 备 上 执 行 的 代 码 中 的 指 针 指 向 的 是 共 享 存 储 器 空 间 还 是 全 局 存 储 器 空 间 , 此 类 指<br />

(lmem)。<br />

ld.local 用 使 可<br />

st.local<br />

记 符 访 问 。 如 果 不 是 这 样 , 在 后 续 编 译 阶 段 仍 能 确 定 是 否 占 用 了 目 标 架 构 的<br />

2.0 南 , 版 本 指 程

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

Saved successfully!

Ooh no, something went wrong!