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

设<br />

的<br />

和<br />

相<br />

次 语<br />

语 (declaration 使 specifier),<br />

个<br />

block)。 这<br />

是<br />

是<br />

的<br />

中 变<br />

和<br />

z)<br />

相<br />

语 。<br />

此 ID。<br />

x,D y ) 的<br />

第 2 章 编 程 模 型<br />

<strong>CUDA</strong> 允<br />

言 的 一 种 扩 展 , 在 调 用 此 类 函<br />

言 函 数 只 执 行 一 次 的 方 式 不 同<br />

的<br />

// Kernel definition<br />

__global__ void vecAdd(float* A, float* B, float* C)<br />

{<br />

}<br />

符 定 限 明<br />

(kernel)<br />

许 程 序 员 定 义 被 称 为 内 核<br />

C<br />

int main()<br />

{<br />

}<br />

// Kernel invocation<br />

vecAdd(A, B, C);<br />

C 数 , 这 是 对 函 言<br />

N , 它 将 由 时 数<br />

<strong>CUDA</strong> 的 同 不<br />

N 行 执 行 并 程<br />

C 与 普 通 的 这 ,<br />

__global__ 义 内 核 时 , 需 要 使 用 定 在<br />

:<br />

种 全 新 的 一 用<br />

__global__ void vecAdd(float* A, float* B, float* C)<br />

{<br />

int i = threadIdx.x;<br />

C[i] = A[i] + B[i];<br />

}<br />

可<br />

<strong>CUDA</strong> 定 每 次 调 用 的 指 法<br />

数 : 程<br />

int main()<br />

{<br />

// Kernel invocation<br />

vecAdd(A, B, C);<br />

}<br />

) 每 个 线 程 都 会 执 行 一 次 两 两 相 加 运 算 的<br />

行 内 核 的 每 个 线 程 都 会 被 分 配 一 个 独 特 的 线 程 ID, 执<br />

threadIdx 内 置 的 过 通<br />

量 在 内 核 中 访 问<br />

2.1 线 程 层 次 结 构<br />

执<br />

线 程 层 次 结 构<br />

N 示 例 代 码 将 大 小 为 下 以<br />

A 量 向<br />

B 量 向<br />

C 并 将 结 果 存 储 在 向 量 , 加<br />

行 vecAdd(<br />

__global__ void matAdd(float A[N][N], float B[N][N],<br />

float C[N][N])<br />

{<br />

int i = threadIdx.x;<br />

int j = threadIdx.y;<br />

C[i][j] = A[i][j] + B[i][j];<br />

}<br />

int main()<br />

{<br />

// Kernel invocation<br />

dim3 dimBlock(N, N);<br />

matAdd(A, B, C);<br />

}<br />

:<br />

(thread<br />

C<br />

构 成 一 维 、 二 维 或 三 维 线 程 块 储 在 矩 阵 , 程 线<br />

有<br />

。<br />

供 了 一 种 自 然 的 方 法 , 可 为 一 个 域 中 的 各 元 素 提<br />

threadIdx 便 起 见 , 我 们 将 方 为<br />

3 一 个 包 含 为 置<br />

分 量 的 向 量 , 因 而 可 使 用 一 维 、 二 维 或 三 维 索 引 标 识<br />

y, z)<br />

+ yD<br />

+ yD x + zD x D y)。 x);<br />

x,D y,<br />

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

NxN 计 算 , 如 向 量 、 矩 阵 或 字 段 。 下 面 的 示 例 代 码 将 大 小 为 用 调<br />

A 阵 矩<br />

B 阵 矩<br />

加 , 并 将 结 果 存<br />

(x,y) 块 来 说 , 索 引 为 维 二<br />

ID 的 程 线<br />

(x<br />

(D 大 小 为 于 对<br />

D<br />

的 三 维 块 来 说 , 索<br />

2.0 南 , 版 本 指 程<br />

ID 的 索 引 与 其 线 程 程 线<br />

(D 接 的 对 应 关 系 : 对 于 一 维 块 来 说 , 两 者 是 相 同 的 ; 对 于 大 小 为 直 着<br />

(x, 为 引<br />

ID 程 的 线 的<br />

(x

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

Saved successfully!

Ooh no, something went wrong!