You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
mode) emulation<br />
是 用<br />
(printf()<br />
:<br />
选<br />
因 (simulating)。<br />
(device<br />
或<br />
上<br />
。<br />
__global__ void myKernel(unsigned char* surface,<br />
int width, int height, size_t pitch)<br />
{<br />
int x = blockIdx.x * blockDim.x + threadIdx.x;<br />
int y = blockIdx.y * blockDim.y + threadIdx.y;<br />
if (x >= width || y >= height) return;<br />
float* pixel = (float*)(surface + y * pitch) + 4 * x;<br />
}<br />
4.5.2.9 使 用 设 备 模 拟 模 式 进 行 调 试<br />
于 设 备 的 代 码 , 编 程 环 境 未 包 含 任 何 本 地 调 试 支 持 , 但 附 带 了 一 种 设 备 模 拟 模 式 译 , 并 在 宿 主 上 运 行 , 允 许 程 序 员 使 用 宿 主 的 本 地 调 试 支 持 来 调 试 应 用 程 序 , 就 像 调 试 宿 主 应 用 程 序 一 样 。 对<br />
cudaErrorMixedDeviceExecution.<br />
<br />
有 宿<br />
KB 空<br />
<br />
<br />
通<br />
在 内 , 都 必 须 一 致 地 为 设 备 模 拟 或 设 备 执 行 而 编 译 。 将 为 设 备 模 拟 编 译 的 代 码 与 为 设 备 执 行 编 译 的 代 码 相 连 接 将 导 致 初 始 化 时 返 回 以 下 运 行 时 错 误 : 库<br />
设 备 模 拟 模 式 中 运 行 应 用 程 序 时 运 行 时 将 模 拟 编 程 模 型 。 对 于 线 程 块 中 的 每 一 个 线 程 , 运 行 时 都 会 在 宿 主 上 创 建 一 个 线 程 。 程 序 员 需 要 确 保 : 主 能 够 运 行 每 个 块 的 最 大 线 程 数 , 此 外 还 有 一 个 针 对 主 线 程 线 程 。 间 。 在<br />
备 模 拟 模 式 提 供 众 多 特 性 使 之 成 为 一 种 独 具 优 势 的 调 试 工 具 : 过 使 用 宿 主 的 本 地 调 试 支 持 , 程 序 员 即 可 利 用 调 试 程 序 支 持 的 所 有 特 性 , 例 如 设 置 断 点 和 检 查 数 据 。 设<br />
等<br />
出 操 作 或 打 印 到 屏 幕 )。 于 所 有 数 据 都 位 于 宿 主 上 , 因 而 可 从 设 备 或 宿 主 代 码 中 读 取 任 何 特 定 于 设 备 或 特 定 于 宿 主 的 数 据 ; 输<br />
–deviceemu 试 。 在 此 模 式 中 编 译 应 用 程 序 时 ( 使 用 调 于<br />
项 ), 设 备 代 码 将 为 宿 主 编<br />
由<br />
__DEVICE_EMULATION__ 理 宏 处 预<br />
在 此 模 式 中 定 义 的 。 一 个 应 用 程 序 的 所 有 代 码 , 包 括 所 用 的 全 部<br />
由 于 设 备 代 码 被 编 译 为 在 宿 主 上 运 行 , 因 而 可 通 过 无 法 在 设 备 上 运 行 的 代 码 扩 展 代 码 , 如 文 件 输 入 和<br />
如<br />
似 地 , 可 通 过 设 备 或 宿 主 代 码 调 用 任 何 设 备 或 宿 主 函 数 。 果 误 用 了 同 步 函 数 , 运 行 时 将 检 测 到 死 锁 情 况 。 程 序 员 必 须 牢 记 , 设 备 模 拟 模 式 的 目 的 在 于 模 拟 设 备 , 而 非 仿 真 类<br />
而 , 设 备 模 拟 模 式 在 查<br />
<br />
法 错 误 时 非 常 有 用 , 但 可 能 难 以 发 现 某 些 错 误 竞 算 找<br />
<br />
<br />
256 大 的 存 储 器 可 用 于 运 行 所 有 线 程 , 已 知 每 个 线 程 都 要 占 据 堆 栈 中 的 够 足<br />
<br />
<br />
<br />
<br />
使 用<br />
条 件 在 设 备 模 拟 模 式 中 可 能 无 法 体 现 , 因 为 同 时 执 行 的 线 程 数 量 要 比 实 际 设 备 上 少 得 多 争<br />
声 的 编 :<br />
C++<br />
上 编<br />
编<br />
解 除 指 针 对 宿 主 上 的 全 局 存 储 器 的 引 用 或 对 设 备 上 宿 主 存 储 器 的 引 用 时 , 设 备 执 行 几 乎 必 然 以 某 种 无 法 确 定 的 方 式 失 败 而 设 备 模 拟 可 能 会 得 到 正 确 。 大 多 数 时 候 , 相 同 的 浮 点 计 算 在 设 备 上 执 行 时 所 得 到 的 结 果 , 与 在 设 备 模 拟 模 式 在 宿 主 上 执 行 时 所 得 到 的 结 果 并 不 完 全 相 同 。 这 些 情 况 是 可 以 预 见 的 , 只 要 使 用 略 有 差 异 编 译 选 项 , 相 同 的 浮 点 计 在<br />
就 会 得 到 不 同 的 结 果 , 更 不 用 说 不 同 的 编 译 器 、 不 同 的 指 令 集 或 不 同 的 架 构 了 。 具 体 来 说 某 些 宿 主 平 台 会 将 单 精 度 浮 点 计 算 的 中 间 结 果 存 储 在 一 个 扩 展 精 度 寄 存 器 中 在 设 备 模 拟 模 式 中 运 行 时 , 这 可 能 会 造 成 准 确 性 的 显 著 差 异 。 发 生 这 种 情 况 时 , 程 序 员 可 尝 试 以 下 方 法 , 但 没 有 任 何 一 种 算<br />
<strong>CUDA</strong> 编<br />
29<br />
方 法 能 确 保 成 功<br />
unsigned int originalCW;<br />
_FPU_GETCW(originalCW);<br />
unsigned int cw = (originalCW & ~0x300) | 0x000;<br />
_FPU_SETCW(cw);<br />
在<br />
, 从 而 实 施 单 精 度 浮 点 计 算 : 码<br />
使<br />
volatile<br />
一 些 浮 点 变 量 , 实 施 单 精 度 存 储 ; 明<br />
用 gcc<br />
-ffloat-store<br />
器 选 项 ; 译<br />
在 Linux<br />
用 _FPU_GETCW()、 使<br />
Windows<br />
用 _controlfp(), 使<br />
用 以 下 代 码 包 围 目 标 代<br />
unsigned int originalCW = _controlfp(0, 0);<br />
_controlfp(_PC_24, _MCW_PC);<br />
: 用 使 可 也<br />
个<br />
用 Visual<br />
/Op 的 器 译<br />
/fp<br />
器 选 项 ; 译<br />
2.0 南 , 版 本 指 程<br />
24 头 处 , 为 了 存 储 控 制 字 的 当 前 值 并 更 改 它 以 使 尾 数 存 储 在 开 在<br />
中 , 可 使 用 : 位