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

、cudaMallocPitch() 分<br />

数<br />

。 用<br />

节<br />

、<strong>CUDA</strong> 数<br />

int device;<br />

for (device = 0; device < deviceCount; ++device) {<br />

cudaDeviceProp deviceProp;<br />

cudaGetDeviceProperties(&deviceProp, device);<br />

}<br />

cudaSetDevice() 于 选 择 与 宿 主 线 程 相 关 的 设 备 : 用<br />

cudaSetDevice(device);<br />

cudaSetDevice() 完<br />

函<br />

的 4.5.2.3 存 储 器 管 理<br />

或<br />

分<br />

: 释<br />

成 此 任 务 , 将 自 动 选 中 设<br />

__global__ 首 先 选 择 设 备 , 之 后 才 能 调 用 须 必<br />

API 任 何 来 自 运 行 时 或 数<br />

数 。 如 果 未 通 过 显 式 调 任 何 显 式 调 用 都 将 无 效 函<br />

cudaSetDevice() 随 后 对 0, 备<br />

float* devPtr;<br />

cudaMalloc((void**)&devPtr, 256 * sizeof(float));<br />

// host code<br />

float* devPtr;<br />

int pitch;<br />

点 元 素 的 数 组 因<br />

cudaMallocPitch((void**)&devPtr, &pitch,<br />

浮<br />

width * sizeof(float), height);<br />

myKernel(devPtr, pitch);<br />

// device code<br />

__global__ void myKernel(float* devPtr, int pitch)<br />

{<br />

for (int r = 0; r < height; ++r) {<br />

float* row = (float*)((char*)devPtr + r * pitch);<br />

for (int c = 0; c < width; ++c) {<br />

float element = row[c];<br />

}<br />

}<br />

}<br />

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

cudaCreateChannelDesc() 创 分 数<br />

释<br />

。 放<br />

。cudaMallocArray() 需<br />

cudaMalloc() 存 储 器 是 使 用 性 线<br />

cudaMallocPitch()<br />

cudaFree() , 使 用 的 配<br />

256 示 例 代 码 将 在 线 性 存 储 器 中 分 配 一 个 包 含 下 以<br />

议 在 分 配 二 维 数 组 时 使 用 cudaMallocPitch(), 建<br />

5.1.2.1 能 确 保 合 理 填 充 已 分 配 的 存 储 器 , 满 足 第 它 为<br />

绍 的 对 齐 要 求 , 从 而 确 保 访 问 行 地 址 或 执 行 二 维 数 组 与 设 备 存 储 器 的 其 他 区 域 之 间 的 复 制 ( 使 用<br />

cudaMemcpy2D()) 时 获 得 最 优 性 能 。 所 返 回 的 间 距 ( 或 步 幅 ) 必 须 用 于 访 问 数 组 元 素 。 以 下 代 码 示 例 将 分 介<br />

widthxheight 个 一 配<br />

维 浮 点 值 数 组 , 并 显 示 如 何 在 设 备 代 码 中 循 环 遍 历 数 组 元 素 : 二<br />

的<br />

数<br />

位<br />

cudaChannelFormatDesc channelDesc =<br />

cudaCreateChannelDesc();<br />

cudaArray* cuArray;<br />

cudaMallocArray(&cuArray, &channelDesc, width, height);<br />

cudaGetSymbolAddress() 用<br />

的 格 式 描 述 。 建<br />

获<br />

cudaMallocArray() 使 用 是 组<br />

cudaFreeArray() , 使 用 的 配<br />

放<br />

使 用 要<br />

考 手 册 列 举 了 用 于 配 的 线 性 存 储 器 组 和 为 全 局 或 常 量 存 储 器 空 间 中 声 明 的 变 量 分 配 的 存 储 器 之 间 复 制 存 储 器 的 所 有 函 数 。 参<br />

widthxheight 代 码 示 例 分 配 了 一 个 下 以<br />

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

32 包 含 一 个 , 组<br />

浮 点 组 件 : 的<br />

cudaGetSymbolSize()<br />

索 指 向 为 全 局 存 储 器 空 间 中 声 明 的 变 量 分 配 的 存 储 器 的 地 址 。 所 分 配 存 储 器 的 大 小 是 通 过 取 的 。<br />

cudaMemcpy2DToArray(cuArray, 0, 0, devPtr, pitch,<br />

检 于<br />

width * sizeof(float), height,<br />

cudaMemcpyDeviceToDevice);<br />

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

:<br />

25<br />

在 cudaMalloc()<br />

配 的 线 性 存 储 器<br />

float data[256];<br />

代 码 示 例 将 一 些 宿 主 存 储 器 数 组 复 制 到 设 备 存 储 器 中 的 面 下<br />

int size = sizeof(data);<br />

float* devPtr;<br />

cudaMalloc((void**)&devPtr, size);<br />

<strong>CUDA</strong> 的 代 码 示 例 将 二 维 数 组 复 制 到 之 前 代 码 示 例 中 分 配 的 面 下<br />

中 : 组<br />

2.0 南 , 版 本 指 程

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

Saved successfully!

Ooh no, something went wrong!