一:cuda编程模型

1:主机与设备

主机---CPU  设备/处理器---GPU

CUDA编程模型如下:

GPU多层存储空间结构如图:

2:Kernel函数的定义与调用

A:运行在GPU上,必须通过__global__函数类型限定符定义且只能在主机端代码中调用;

B:在调用时必须声明内核函数的执行参数----<<<>>>。

C:先为内核函数中用到的变量分配好足够空间再调用kernel函数

D:每个线程都有自己对应的id----由设备端的寄存器提供的内建变量保存,且是只读的。

3:线程结构

1)线程标识

  dim3类型(基于uint3定义的矢量类型----由三个unsigned int组成的结构体)的内建变量threadIdx和blockIdx。

2)一维block

  线程threadID----threadIdx.x.

3)二维block---(Dx,Dy)

  线程threadID----threadIdx.x+threadIdx.y*Dx;

4)三维block---(Dx,Dy,Dz)

  线程threadID----threadIdx.x+threadIdx.y*Dx+threadIdx.z*Dx*Dy;

4:硬件映射

1)计算单元

SM---流多处理器  SP---流处理器

A:一个SM包含8个SP,共用一块共享存储器

2)warp

  线程束在采用Tesla架构的gpu中:一个线程束由32个线程组成,且其线程只和threadID有关

A:warp才是真正的执行单位

3)执行模型

SIMT---单指令多线程  SIMD---单指令多数据

4)deviceQuery实例

 #include <stalib.h>
#include <stdio.h>
#include<string.h>
#include <cutil.h> int main()
{
int deviceCount;
CUDA_SAFE_CALL(cudaGetDeviceCount(&deviceCount));
if( == deviceCount)
{
printf("no deice\n");
}
int dev;
for(dev = ;dev <deviceCount;dev++)
{
cudaDeviceProp deviceProp;
CUDA_SAFE_CALL(cudaGetDeviceProperties(&deviceProp,dev));
print();
}
}

5)cuda程序编写流程

A:主机端

 启动CUDA,使用多卡时需加上设备号,或使用cudaSetDevice()设置
为输入数据分配空间
初始化输入数据
为GPU分配显存,用于存放输入数据
将内存中的输入数据拷贝到显存
为GPU分配显存,用于存放输出数据
调用device端的kernel进行计算,将结果写到显存中对应区域
为CPU分配内存,用于存放GPU传回来的输出数据
使用CPU对数据进行其他处理
释放内存和显存空间
退出CUDA

B:设备端

从显存读数据到GPU片内 对数据进行处理 将处理后的数据写回显存

(1)在显存全局内存分配线性空间--cudaMalloc()/cudaFree()

(2)拷贝存储器中的数据 --cudaMemcpy()

  拷贝操作类型:cudaMemcpyDeiceToHost  cudaMemcpyHostToDevice  cudaMemcpyDeviceToDevice

(3)网格定义

<<<Dg,Db,Ns,S>>>

Dg----grid纬度与尺寸  Db---block维度与尺寸  Ns--可分配动态共享内存大小  s--stream_t类型的可选参数

(4)设备端内建变量

gridDim  blockIdx  blockDim  threadIdx  warpSize

6)内核实例

A:与shared memory有关

 __global__ void
testKernel(float* g_idata,float* g_odata)
{
//分配共享内存  将全局内存的数据写入共享内存  进行计算,将结果写入共享内存  将结果写回全局内存
extern __shared__ float sdata[];//动态分配共享内存空间--__device__ __global__函数中
//动态分配大小是执行参数中的第三个参数。当静态分配时必须指明大小 const unsigned int bid = blockIdx.x;
const unsigned int tid_in_block = threadIdx.x;
const unsigned int tid_in_grid = blockIdx.x*blockDim.x+threadIdx.x;
sdata[tid_in_block] = g_idata[tid_in_grid];
__syncthreads(); sdata[tid_in_block] *= (float)bid; __syncthreads();   g_odata[tid_in_grid] = sdata[tid_in_block];
}

cuda基础的更多相关文章

  1. CUDA基础介绍

    一.GPU简介 1985年8月20日ATi公司成立,同年10月ATi使用ASIC技术开发出了第一款图形芯片和图形卡,1992年4月ATi发布了Mach32图形卡集成了图形加速功能,1998年4月ATi ...

  2. 【CUDA 基础】6.5 流回调

    title: [CUDA 基础]6.5 流回调 categories: - CUDA - Freshman tags: - 流回调 toc: true date: 2018-06-20 21:56:1 ...

  3. 【CUDA 基础】6.3 重叠内和执行和数据传输

    title: [CUDA 基础]6.3 重叠内和执行和数据传输 categories: - CUDA - Freshman tags: - 深度优先 - 广度优先 toc: true date: 20 ...

  4. 【CUDA 基础】6.1 流和事件概述

    title: [CUDA 基础]6.1 流和事件概述 categories: - CUDA - Freshman tags: - 流 - 事件 toc: true date: 2018-06-10 2 ...

  5. 【CUDA 基础】6.2 并发内核执行

    title: [CUDA 基础]6.2 并发内核执行 categories: - CUDA - Freshman tags: - 流 - 事件 - 深度优先 - 广度优先 - 硬件工作队列 - 默认流 ...

  6. 【CUDA 基础】6.0 流和并发

    title: [CUDA 基础]6.0 流和并发 categories: - CUDA - Freshman tags: - 流 - 事件 - 网格级并行 - 同步机制 - NVVP toc: tru ...

  7. 【CUDA 基础】5.6 线程束洗牌指令

    title: [CUDA 基础]5.6 线程束洗牌指令 categories: - CUDA - Freshman tags: - 线程束洗牌指令 toc: true date: 2018-06-06 ...

  8. 【CUDA 基础】5.4 合并的全局内存访问

    title: [CUDA 基础]5.4 合并的全局内存访问 categories: - CUDA - Freshman tags: - 合并 - 转置 toc: true date: 2018-06- ...

  9. 【CUDA 基础】5.3 减少全局内存访问

    title: [CUDA 基础]5.3 减少全局内存访问 categories: - CUDA - Freshman tags: - 共享内存 - 归约 toc: true date: 2018-06 ...

  10. 【CUDA 基础】5.2 共享内存的数据布局

    title: [CUDA 基础]5.2 共享内存的数据布局 categories: - CUDA - Freshman tags: - 行主序 - 列主序 toc: true date: 2018-0 ...

随机推荐

  1. jquery监听input

    $(function(){ //输入框正在输入时 $("#ipt").on('input',function(){ if(!($('#ipt').val()=='')){ $(&q ...

  2. kafka如何防止key相同的消息并发消费

    最开始,我认为只用把消费者设置为单线程消费,就可以避免并发问题. 因为同一个key,分区一定相同,那么就只会被同一个消费者消费,消费者又是单线程,这样就避免了并发问题 后面发现,上述的方式没有办法处理 ...

  3. 模板渲染jnja2模块

    模板渲染jnja2模块 模板的引入: 在返回动态页面时,上述我们在08版web框架返回每次访问的时间,利用自己写的占位符进行字符串替换进行动态响应: 在实际应用中,完全可以从数据库中读取数据,然后替换 ...

  4. 模拟SWPU邮件登录页面

    模拟SWPU邮件登录页面设计流程 一.开发工具准备 本次开发该页面时使用的开发工具为vscode—— 在下载安装完成后,需要下载各类插件——如汉化.通过浏览器打开网页插件等. 二.开发过程 首先,打开 ...

  5. 解决el-tree横向滚动条问题

    代码如下 效果如图 仅做下记录,不做过多解释

  6. 基于Netty包中的Recycler实现的对象池技术详解

    一.业务背景 当项目中涉及到频繁的对象的创建和回收的时候,就会出现频繁GC的情况,这时就出现了池化的技术来实现对象的循环使用从而避免对象的频繁回收,Netty包下的Recycler就实现了这一功能.当 ...

  7. Android中的成员变量与局部变量

    简单说一下吧, note:java中的成员变量就是c++中的全局变量 1.可以在全局范围内使用:局部变量只能在其定义的方法里使用. 2.成员变量可以不赋初值使用,调用时有系统的默认的初值,比如int类 ...

  8. CentOS 安装 git2.x.x 版本

    方法一 源码方式安装 第一步:卸载旧的git版本. $ yum remove git 第二步:下载git $ wget --no-check-certificate https://www.kerne ...

  9. [JavaWeb基础] 006.Struts1的配置和简单使用

    1.框架简介 采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架,用于快速开发Java Web应用.Struts实现的重点在C(Controller), ...

  10. CustomerDAO及CustomerImpl的实现 & CustomerImpl的单元测试

    BaseDAO:封装了针对于数据表的操作,提供通用的方法,完成后续针对具体表的逻辑 CustomerDAO:此接口用于规范 针对customers表的常用操作 CustomerDAOImpl:继承Ba ...