CUDA TOOlkit Programming Guide 2. Programming Model
本章的样例来源:vectorAdd CUDA sample
2.1 Kernels
__global__
来声明kernel函数
// Kernel definition
__global__ void VecAdd(float* A, float* B, float* C)
{int i = threadIdx.x;C[i] = A[i] + B[i];
}int main()
{...// Kernel invocation with N threadsVecAdd<<<1, N>>>(A, B, C);...
}
2.2. Thread Hierarchy
ThreadIdx是3-component vector,所以threads可以被设计为one-dimensional, two-dimensional, or three-dimensional thread index,对应的block是a one-dimensional, two-dimensional, or three-dimensional block
Dx和Dy是横坐标和纵坐标的长度.这里是指thread的绝对索引(线性的,既将二维的block thread索引,转换为一维)
- one-dimensional block,size(Dx),thread ID是(x)
- two-dimensional block,size (Dx, Dy),thread ID 是 (x + y Dx)
- three-dimensional block, size (Dx, Dy, Dz),thread ID (x + y Dx + z Dx Dy)
// Kernel definition
__global__ void MatAdd(float A[N][N], float B[N][N],float C[N][N])
{int i = threadIdx.x;int j = threadIdx.y;C[i][j] = A[i][j] + B[i][j];
}int main()
{...// Kernel invocation with one block of N * N * 1 threadsint numBlocks = 1;dim3 threadsPerBlock(N, N);MatAdd<<<numBlocks, threadsPerBlock>>>(A, B, C);...
}
同样的block也可以像thread那样进行组合
图6 thread block 和 grid
每个bolck的thread可每个grid的block可以使用<<<...>>>
指定,传入int和或者dim3类型
类似于thread ID,block在grid里也是用相同的索引方式:
- one-dimensional:
- two-dimensional
- three-dimensional
// Kernel definition
__global__ void MatAdd(float A[N][N], float B[N][N],
float C[N][N])
{int i = blockIdx.x * blockDim.x + threadIdx.x;//将cuda的block,grid布局转换为矩阵的索引int j = blockIdx.y * blockDim.y + threadIdx.y;if (i < N && j < N)C[i][j] = A[i][j] + B[i][j];
}int main()
{...// Kernel invocationdim3 threadsPerBlock(16, 16);dim3 numBlocks(N / threadsPerBlock.x, N / threadsPerBlock.y);MatAdd<<<numBlocks, threadsPerBlock>>>(A, B, C);...
}
block size(16*16,256 threads),一个block的所有thread可以实现共享数据和同步(synchronizing)
__shared__
共享数据
__syncthreads()
实现同步,在一个block里建立一堵墙,必须block内的所有thread完成后才能进行下一步操作
2.3 Memory Hierarchy
内存设置:
1)每个thread有自己的local memory
2)一个block的所有thread有shared memory
3)一个grid的所有thread有global memory
4)2个额外的read-only memory空间:constant和texture memory
图7,内存架构
2.4 Heterogeneous Programming
host和device有各自的DRAM
Unified Memory 提供了host和device,memory 空间的桥梁
图8 ??
CUDA TOOlkit Programming Guide 2. Programming Model相关推荐
- CUDA TOOlkit Programming Guide 3. Programming Interface
3.1. Compilation with NVCC nvcc是简化的C++编译器(解释了为啥在编译C动态库时会丢失函数指针) 3.2. CUDA Runtime 3.2.1. Initializat ...
- CUDA C++ Programming Guide( v11.2.0)部分翻译+笔记
笔记对有些较为简单的部分做了省略,有些原文中表达比较拗口的地方,重新组织了话叙,由于部分内容并不是完全翻译,所以不建议作为主要学习资料,建议作为学习对比参考使用,如有不明白的地方或觉得有问题的地方,欢 ...
- Structured Streaming编程 Programming Guide
Structured Streaming编程 Programming Guide • Overview • Quick Example • Programming Model o Basic Conc ...
- View Controller Programming Guide for iOS---(七)---Resizing the View Controller’s Views
Resizing the View Controller's Views A view controller owns its own view and manages the view's cont ...
- [译]1-Key-Value Coding Programming Guide 官方文档第一部分
Key-Value Coding Programming Guide 官方文档第一部分 2018.9.20 第一次修正 iOS-KVC官方文档第一部分 Key-Value Coding Program ...
- [iOS]Advanced Memory Management Programming Guide 高级内存管理编程指南(官方文档翻译)
Advanced Memory Management Programming Guide - 高级内存管理编程指南(官方文档翻译) 版权声明:本文为博主原创翻译,如需转载请注明出处. 新博客文章地址: ...
- AVFoundation Programming Guide(官方文档翻译)完整版中英对照
新博客: 完整版 - AVFoundation Programming Guide 分章节版: – 第1章:About AVFoundation - AVFoundation概述 – 第2章:Usin ...
- AVFoundation Programming Guide(官方文档翻译5)Still and Video Media Capture - 静态视频媒体捕获。
新博客文章地址: 完整版 - AVFoundation Programming Guide 分章节版: – 第1章:About AVFoundation - AVFoundation概述 – 第2章: ...
- 再读苹果《Threading Programming Guide》笔记(一):初识线程
记得第一次读这个文档还是3年前,那时也只是泛读.如今关于iOS多线程的文章层出不穷,但我觉得若想更好的领会各个实践者的文章,应该先仔细读读官方的相关文档,打好基础,定会有更好的效果.文章中有对官方文档 ...
最新文章
- 【tf.keras】TensorFlow 1.x 到 2.0 的 API 变化
- 「MICCAI 2016」Reading Note
- python url请求
- Nginx安装、配置及使用总结
- linux常用命令linux自动挂载WinXP系统下的分区
- 利用xml+xsl给客户机添加超级管理帐户!
- 从零开始学C++之继承(一):公有/私有/保护继承、overload/overwrite/override之间的区别...
- 关于ALTERA的FPGA的弱上拉问题
- SQL表名,应该用复数还是单数
- 国产性能车天花板?145万买极星1,认真的么?
- Nginx内置模块简介
- 第十三 关于JavaScript
- 网站克隆工具-httrack安装使用教程
- u盘被写保护怎么解除,如何去掉u盘写保护?
- linux dns无法正向解析,linux系统下部署DNS正向解析
- 雷电9模拟器安装抓包工具whistle证书
- 测试用例评审的旁观记录
- 基于C++控制台(Windows平台)的一个吃豆人小游戏
- C# 操作通过word模板合并N个word文档
- 唐山大地震:接近尸体
热门文章
- Java接口四个类四则运算_java 实现四则运算小程序
- python自动卸载win程序_利用python实现自动扫雷程序
- python习题_新手练习:Python练习题目
- Python在应用层实现UDP协议的可靠传输
- 详解Python类定义中的各种方法
- 最新全国暴雨强度公式2019_2019-2020最新全国高中排名
- 毛绒材质渲染_零基础如何用OCtane做一只毛绒绒的皮卡丘?
- 魅族android n内测报名,底层升级安卓 N 内测报名 Flyme 迎来五周年
- ffmpeg threads_用ffmpeg命令行转压视频
- mysql连接28000错误代码_mysql 在登陆的时候出现error 1045 (28000): 错误解决办法