当使用一个包含一维块的二维网格时,每个线程都只关注一个数据元素并且网格的第二个维数等于ny,如下图所示:

这可以看作是含有二维块的二维网格的特殊情况,其中块儿的第二个维数是1。因此,从块儿和线程索引到矩阵坐标的映射就变成:

ix = threadIdx.x + blockIdx.x * blockDim.x;

iy = blockIdx.y;

从矩阵坐标到全局线性内存偏移量的映射保持不变。核函数如下:

 __global__ void sumMatrixOnGPUMix(float *MatA,float *MatB,float *MatC,int nx,int ny)
{
unsigned int ix=threadIdx.x+blockIdx.x*blockDim.x;
unsigned int iy=blockIdx.y;
unsigned int idx=iy*nx+ix;
if(ix<nx&&iy<ny)
MatC[idx]=MatA[idx]+MatB[idx];
}

与二维核函数sumMatrixOnGPU2D不同的是,这个新的核函数的唯一优点是每个线程省去了一次整数乘法和整数加法的运算。将块尺寸设置为32,并在此基础上计算网格大小。

 dim3 block();//x方向上有32个线程块
dim3 grid((nx-)/block.x+,ny);

实验运行结果如下图:

将线程块的大小增加到256,实验表现出目前为止最佳的性能:

下表是不同核函数实现的结果比较,执行配置都是对应核函数性能较优的参数。

内核函数 执行配置 运行时间
sumMatrixOnGPU2D  (512,1024),(32,16)  0.197 sec
 sumMatrixOnGPU1D  (512,1),(32,1)  0.032 sec
sumMatrixOnGPUMix   (64,16384),(256,1)  0.0178 sec

从矩阵加法的例子中看出:

  1. 改变执行配置对内核性能有影响;
  2. 传统的核函数实现一般不能获得最佳性能;
  3. 对于一个给定的核函数,尝试使用不同的网络和线程块大小可以获得更好的性能。

主要参考文献:

  1. 《 CUDA C编程权威指南》

CUDA编程模型——组织并行线程3 (2D grid 1D block)的更多相关文章

  1. CUDA编程模型——组织并行线程2 (1D grid 1D block)

    在”组织并行编程1“中,通过组织并行线程为”2D grid 2D block“对矩阵求和,在本文中通过组织为 1D grid 1D block进行矩阵求和.一维网格和一维线程块的结构如下图: 其中,n ...

  2. 【CUDA 基础】2.3 组织并行线程

    title: [CUDA 基础]2.3 组织并行线程 categories: CUDA Freshman tags: Thread Block Grid toc: true date: 2018-03 ...

  3. CUDA编程模型

    1. 典型的CUDA编程包括五个步骤: 分配GPU内存 从CPU内存中拷贝数据到GPU内存中 调用CUDA内核函数来完成指定的任务 将数据从GPU内存中拷贝回CPU内存中 释放GPU内存 *2. 数据 ...

  4. CUDA刷新器:CUDA编程模型

    CUDA刷新器:CUDA编程模型 CUDA Refresher: The CUDA Programming Model CUDA,CUDA刷新器,并行编程 这是CUDA更新系列的第四篇文章,它的目标是 ...

  5. CUDA编程模型之内存管理

    CUDA编程模型假设系统是由一个主机和一个设备组成的,而且各自拥有独立的内存. 主机:CPU及其内存(主机内存),主机内存中的变量名以h_为前缀,主机代码按照ANSI C标准进行编写 设备:GPU及其 ...

  6. CUDA学习笔记(一)——CUDA编程模型

    转自:http://blog.sina.com.cn/s/blog_48b9e1f90100fm56.html CUDA的代码分成两部分,一部分在host(CPU)上运行,是普通的C代码:另一部分在d ...

  7. CUDA编程之快速入门

    CUDA(Compute Unified Device Architecture)的中文全称为计算统一设备架构.做图像视觉领域的同学多多少少都会接触到CUDA,毕竟要做性能速度优化,CUDA是个很重要 ...

  8. CUDA编程之快速入门【转】

    https://www.cnblogs.com/skyfsm/p/9673960.html CUDA(Compute Unified Device Architecture)的中文全称为计算统一设备架 ...

  9. cuda编程基础

    转自: http://blog.csdn.net/augusdi/article/details/12529247 CUDA编程模型 CUDA编程模型将CPU作为主机,GPU作为协处理器(co-pro ...

随机推荐

  1. 多线程系列之自己实现一个 lock 锁

    我们面试中经常会被问到多线程相关知识,这一块内容往浅了说大家都会,但是一问到底层实现原理,我们往往就一脸懵逼. 这段时间准备好好学习多线程,接下来会写一系列关于多线程的知识. 我们首先要了解线程,百度 ...

  2. SQLI DUMB SERIES-18

    (1)对username和password无论怎么输入,都没有回显,再看题目,POST - Header Injection - Uagent field - Error based (基于错误的用户 ...

  3. 技术笔记1:java.sql.SQLException: Access denied for user 'root'@'localhost' (using password)

    在myEclipse10中运行java项目的时候,遇到java.sql.SQLException: Access denied for user 'root'@'localhost' (using p ...

  4. PA教材提纲 TAW10-2

    Unit1 Introduction to the ABAP Dictionary(ABAP字典介绍) 1.1 Describing the ABAP Dictionary(描述ABAP字典) ABA ...

  5. SqlSugar ORM 的学习

    http://www.codeisbug.com/Doc/8/1163 https://www.cnblogs.com/sunkaixuan/p/6082664.html

  6. Spark SQL External DataSource简介

    随着Spark1.2的发布,Spark SQL开始正式支持外部数据源.这使得Spark SQL支持了更多的类型数据源,如json, parquet, avro, csv格式.只要我们愿意,我们可以开发 ...

  7. Git 几个常用操作

    git init        --    初始化仓库, git clone    --    从远端克隆仓库到本地 git status   --    查看git仓库的状态 git log    ...

  8. JavaScript对象(第四天)

    面向对象编程中,JavaScript并不完全具备封装.继承.多态:在JavaScript中,对象是一个无序的键值对集合 封装JavaScript是具备的,将属性和方法定义到对象内部: 继承,在java ...

  9. java web(二): servlet的简单使用和介绍

    前言:通过编写一个servlet类,向浏览器发送hello world来阐述servlet. 一:创建动态web项目 1. 首先切换到javaEE视图. 在ecplise左边即项目管理器哪里右键点击新 ...

  10. log4j根据包名 日志输出到不同文件中 , service层无法输出日志问题

    1. service 层因为要配置事务,使用了代理 <aop:config proxy-target-calss=''true"> <aop:pointcut id=&qu ...