CUDA编程入门笔记
1、线程块(block)是独立执行的,在执行的过程中线程块之间互不干扰,因此它们的执行顺序是随机的
2、同一线程块中的线程可以通过访问共享内存(shared memory)或者通过同步函数__syncthreads()来协调合作。
3、cuda全称:computer union device architecture 统一计算设备架构,因此CUDA并不是 编程语言
从线程层次看:
从内存层次看:
4、CUDA提供的API主要有两种: runtime API和driver API,其中runtime API实际上是driver API的封装,方便程序员编程,而driver
API可以操纵更为底层的东西,例如控制CUDA Contexts(一种类似主机进程的概念)以及CUDA Modules(类似主机动态加载库的概念)等更加底层的CUDA模块。
5、
6、二进制代码在CUDA计算设备上具有小版本的向前兼容性,但是在大版本上不具备兼容性
7、在显卡内存中称为global memory
8、cudaError_t
cudaMalloc( void** devPtr,size_t
count )函数主要作用是在GPU中申请一块内存地址,向设备分配 count 字节的线性存储器,并以*devPtr的形式返回指向所分配存储器的指针。可针对任何类型的变量合理调整所分配的存储器。存储器不会被清除。如果出现错误,cudaMalloc()将返回cudaErrorMemoryAllocation。
9、cudaError_t cudaMemcpy( void* dst,const
void* src,size_t
count,enum
cudaMemcpyKind kind )函数的主要作用是GPU与CPU之间的数据复制,从src指向的存储器区域中将count个字节复制到dst指向的存储器区域,其中kind是cudaMemcpyHostToHost、cudaMemcpyHostToDevice、cudaMemcpyDeviceToHost或cudaMemcpyDeviceToDevice之一,用于指定复制的方向。存储器区域不可重叠。调用cudaMemcpy()时,如果dst和src指针与复制的方向不匹配,则将导致不确定的行为。
cudaError_t cudaMemcpyAsync( void* dst,const void* src,size_t count,enum cudaMemcpyKind kind,cudaStream_t
stream )
cudaMemcpyAsync()是异步的,可选择传入非零流参数,从而将其关联到一个流。它仅对分页锁定的主存储器有效,如果传入指向可分页存储器的指针,那么将返回一个错误。
10、cudaError_t
cudaFree (void* devPtr)释放GPU上的存储器,,则不执行任何操作。如果出现错误,cudaFree()将返回cudaErrorInvalid-DevicePointer。
11、cudaMalloc、cudaMemcpy和cudaFree三个函数,如果其为之前为异步启动,函数可能会返回错误码,例如:cudaMencpy调用前cudaMalloc还未调用过
12、_global__
void kernel(param list){}核函数只能在主机端调用,调用时必须申明执行参数。调用形式如下:Kernel<<<Dg,Db, Ns, S>>>(param list);
<<<>>>运算符内是核函数的执行参数,告诉编译器运行时如何启动核函数,用于说明内核函数中的线程数量,以及线程是如何组织的。<<<>>>运算符对kernel函数完整的执行配置参数形式是<<<Dg, Db, Ns, S>>>
参数Dg用于定义整个grid的维度和尺寸,即一个grid有多少个block。为dim3类型。Dim3
Dg(Dg.x, Dg.y, 1)表示grid中每行有Dg.x个block,每列有Dg.y个block,第三维恒为1(目前一个核函数只有一个grid)。整个grid中共有Dg.x*Dg.y个block,其中Dg.x和Dg.y最大值为65535。
参数Db用于定义一个block的维度和尺寸,即一个block有多少个thread。为dim3类型。Dim3
Db(Db.x, Db.y, Db.z)表示整个block中每行有Db.x个thread,每列有Db.y个thread,高度为Db.z。Db.x和Db.y最大值为512,Db.z最大值为62。 一个block中共有Db.x*Db.y*Db.z个thread。计算能力为1.0,1.1的硬件该乘积的最大值为768,计算能力为1.2,1.3的硬件支持的最大值为1024。参数Ns是一个可选参数,用于设置每个block除了静态分配的shared
Memory以外,最多能动态分配的shared memory大小,单位为byte。不需要动态分配时该值为0或省略不写。参数S是一个cudaStream_t类型的可选参数,初始值为零,表示该核函数处在哪个流之中。
13、texure也是全局存储器,速度比global还要更快,但是为只读,即对应的矩阵的变化不会影响传入的数组。
14、只要同一个
warp 的不同线程会访问到同一个 bank 的不同地址就会发生 bank conflict,除此之外的都不会发生 bank conflict。
15、cudaMallocPitch(void**,int*,widthInBytes,height):这个函数是在线性内存中分配二维数组,因此在使用时,还是用一维的方式使用。注意,width的单位是字节,而height单位是数据类型,而第二个参数的含义下面一段话说明了。说明 向设备分配至少widthInBytes*height字节的线性存储器,并以*devPtr的形式返回指向所分配存储器的指针。该函数可以填充所分配的存储器,以确保在地址从一行更新到另一行时,给定行的对应指针依然满足对齐要求。
c语言申请2维内存时,一般是连续存放的。a[y][x]存放在第y*widthofx*sizeof(元素)+x*sizeof(元素)个字节。但在cuda的global memory访问中,从256字节对齐的地址(addr=0, 256, 512, ...)开始的连续访问是最有效率的。这样,为了提高内存访问的效率,有了cudaMallocPitch函数。cudaMallocPitch函数分配的内存中,数组的每一行的第一个元素的开始地址都保证是对齐的。因为每行有多少个数据是不确定的,widthofx*sizeof(元素)不一定是256的倍数。故此,为保证数组的每一行的第一个元素的开始地址对齐,cudaMallocPitch在分配内存时,每行会多分配一些字节,以保证widthofx*sizeof(元素)+多分配的字节是256的倍数(对齐)。这样,上面的y*widthofx*sizeof(元素)+x*sizeof(元素)来计算a[y][x]的地址就不正确了。而应该是y*[widthofx*sizeof(元素)+多分配的字节]+x*sizeof(元素)。而函数中返回的pitch的值就是widthofx*sizeof(元素)+多分配的字节。说明:widthInBytes作为输入参数,应该是widthofx*sizeof(元素);这样的话,复制内容时也要作相应的修改。
CUDA编程入门笔记的更多相关文章
- CUDA编程入门,Dim3变量
dim3是NVIDIA的CUDA编程中一种自定义的整型向量类型,基于用于指定维度的uint3. 例如:dim3 grid(num1,num2,num3): dim3类型最终设置的是一个三维向量,三维参 ...
- CUDA编程学习笔记1
CUDA编程模型是一个异构模型,需要CPU和GPU协同工作. host和device host和device是两个重要的概念 host指代CPU及其内存 device指代GPU及其内存 __globa ...
- 57 CUDA 编程入门
0 引言 由于毕设用到了Marvin,采用的是CUDA框架作为加速器,正好借此学习一下CUDA编程的一些基本知识. 各个版本的cuda的下载链接如下. https://developer.nvidia ...
- (转)Android: NDK编程入门笔记
转自: http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html 为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代 ...
- CUDA编程学习笔记2
第二章 cuda代码写在.cu/.cuh里面 cuda 7.0 / 9.0开始,NVCC就支持c++11 / 14里面绝大部分的语言特性了. Dim3 __host__ __device__ dim3 ...
- CUDA编程入门
CUDA是一个并行计算框架.用于计算加速.是nvidia家的产品.广泛地应用于现在的深度学习加速. 一句话描述就是:cuda帮助我们把运算从cpu放到gpu上做,gpu多线程同时处理运算,达到加速效果 ...
- 【C语言编程入门笔记】排序算法之快速排序,一文轻松掌握快排!
排序算法一直是c语言重点,各个算法适应不用的环境,同时,在面试时,排序算法也是经常被问到的.今天我们介绍下快速排序,简称就是快排. 1.快速排序思想: 快排使用 分治法 (Divide and con ...
- 【C语言编程入门笔记】C语言果然博大精深!函数还分内部和外部?
۞ 外部函数与内部函数 前面我们讲解了关于函数的调用都是针对同一个源文件中其他函数进行调用的,而在有些情况下,函数也可以对另外一个源文件中的函数进行调用.当一个程序由多个源文件组成时,根据函数是否能被 ...
- OpenCV3编程入门笔记(6)自我验证各函数程序代码
// asw.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <opencv2/opencv.hpp> usi ...
随机推荐
- python json格式参数遍历所有key、value 及替换key对于的value
1.对于接口自动化测试,一般接口以json形式发送返回,往往我们就需要遍历json文件中所有key,value以及修改替换key对于的value. 例如json发送/接收的文件: SendRegist ...
- 大数据和AI怎么与现代教育相结合?
大数据和AI怎么与现代教育相结合? 比尔·盖茨曾预言,"5年以后,你将可以在网上免费获取世界上最好的课程,而且这些课程比任何一个单独大学提供的课程都要好." 现在看来,虽然并不是每 ...
- Hexo next博客的pjax一个Bug引发的关于pjax用法的小技巧-----pjax后图片点击放大的js失效
文章目录 广告: 背景 发现 解决 get技能 广告: 本人博客地址:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.git ...
- 【JavaSE】运行时类型信息(RTTI、反射)
运行时类型信息使得你可以在程序运行时发现和使用类型信息.--<Think in java 4th> **** 通常我们在面向对象的程序设计中我们经常使用多态特性使得大部分代码尽可能地少了解 ...
- jmeter压测、操作数据库、分布式、 linux下运行的简单介绍
一.jmeter压测 1.如何压测 常规性能压测:10-15分钟 稳定性测试:一周.2天等 如果想要压测10分钟,勾选永远,勾选调度器,填写600秒.也可以使用固定启动时间. 2.tps.响应时间 ( ...
- UVA11572_Unique Snowflakes
超级经典的题目,扫描区间,滑动窗口 对这题目的最大感受就是,单独看这个题目,其实不难,但是很多我感觉挺难或者没做出来的题目,都是由这些若干个经典的算法组合而成的 滑动窗口便是一个典型的例子!!!!遇到 ...
- jmeter beanshell 变量传递
如果写成这样会报错: ${__BeanShell(${__threadNum}*2,ToatlAmount)}; ${__BeanShell(${__Random(1,99999,)},DayNum) ...
- vue做一个上移和下移,删除的li 功能
效果图: 思路就是冒泡原理,把数据放到一个空数组,对其进行排序, 单选框用到的是iview . 具体实现代码: <div v-for="item in singledLists&quo ...
- Java菜鸟笔记
System.out.println( ); 会在输出完毕后自动换行 System.out.print( ); 在输出完毕后不会自动换行 MyEclipse/Eclipse快捷键: 定位到某一行, ...
- linux文本处理工具篇
一.常用简单工具 cat [OPTION]... [FILE]... -E:显示行的结束符$ -n:对显示出的每一行进行编号. -A:显示所有控制符 -s:压缩连续空行为一行 more:分页查看文件 ...