随笔分类 - CUDA
摘要:简单可以理解为:cudaMemcpy是同步的,而cudaMemcpyAsync是异步的。具体理解需要弄清以下概念: 1.CUDA Streams 在cuda中一个Stream是由主机代码发布的一系列再设备上执行的操作,必须确保顺序执行。不同streams里面的操作可以交叉执行或者并发执行。 2.默认
阅读全文
摘要:学习代码时,遇到了cudaMalloc 和 cudaMallocHosts 同时出现的情景,所以学习一下二者的区别。 参考资料1:cudaMallocHost函数详解 参考资料2:How to Optimize Data Transfers in CUDA C/C++ 中文翻译:中文翻译 host内
阅读全文
摘要:一、FFT介绍 傅里叶变换是数字信号处理领域一个很重要的数学变换,它用来实现将信号从时域到频域的变换,在物理学、数论、组合数学、信号处理、概率、统计、密码学、声学、光学等领域有广泛的应用。离散傅里叶变换(Discrete Fourier Transform,DFT)是连续傅里叶变换在离散系统中的表示
阅读全文
摘要:Thrust是并行算法和数据结构的基于GPU CUDA的C++库,类似于C++标准库stl,cuda安装后自带。Trust用于求最值的函数为min_element和max_element,和stl名字一样; 我是偶然发现原来cuda还有一个这个库,在项目中,因为中间有一个过程需要最值的索引,原本我是
阅读全文
摘要:cudaMemcpy用于在主机(Host)和设备(Device)之间往返的传递数据,用法如下: 主机到设备:cudaMemcpy(d_A,h_A,nBytes,cudaMemcpyHostToDevice) 设备到主机:cudaMemcpy(h_A,d_A,nBytes,cudaMemcpyDevi
阅读全文
摘要:对指针和地址比较熟悉的童鞋可以比较容易的理解这个概念,为了更好的让更多的人理解cudaMalloc的参数,写这篇文章,以飨读者。 首先看下此运行时函数的原型: cudaError_t cudaMalloc (void **devPtr, size_t size ); 此函数返回值是CUDA中定义的一
阅读全文
摘要:我们讨论的数据传输,是指设备端和主机端的数据相互拷贝。 设备端指GPU端,数据存放在显存中;主机端指CPU,数据存放在内存中。一般情况下,设备端是不能直接访问主机端内存的(注意是一般情况下,有一种情况是例外,我后面会说),而我们的数据通常情况下都是存放在主机端内存中,要在GPU中执行算法运算就必须先
阅读全文
摘要:在VS2017中通过add添加.cu文件后,需要设置.cu对应的编译环境。 在.cu文件中右键选择“Property”,然后在“Configuration Property”中选择“General”,然后打开“Item Type”,发现没有选项“CUDA C/C++”,如下图所示: 无法选择CUDA
阅读全文
摘要:知道了CUDA编程基础,我们就来个简单的实战:利用CUDA编程实现两个向量的加法。在实现之前,先简单介绍一下CUDA编程中内存管理API。首先是在device上分配内存的cudaMalloc函数。 cudaError_t cudaMalloc(void** devPtr, size_t size);
阅读全文
摘要:摘要 本文主要讲述CUDA的threadIdx。 1. Grid,Block和Thread三者的关系 其中,一个grid包含多个blocks,这些blocks的组织方式可以是一维,二维或者三维。任何一个block包含有多个Threads,这些Threads的组织方式也可以是一维,二维或者三维。举例来
阅读全文
摘要:入门后的进一步学习的内容,就是如何优化自己的代码。我们前面的例子没有考虑任何性能方面优化,是为了更好地学习基本知识点,而不是其他细节问题。从本节开始,我们要从性能出发考虑问题,不断优化代码,使执行速度提高是并行处理的唯一目的。 测试代码运行速度有很多方法,C语言里提供了类似于SystemTime()
阅读全文
摘要:打开nvvp并新建session时弹窗报错 解决方法: 添加环境变量Path: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\extras\CUPTI\lib64 完成后,重启nvvp即可
阅读全文
摘要:写CUDA,追求的就是加速比,想要得到准确的时间,计时函数就是必不可少 计时通常分为两种情况,(1)直接得到接口函数的时间,一般用于得到加速比;(2)获得接口函数内核函数、内存拷贝函数等所耗时间,一般用于优化代码时。 情况(1)方法有两种,CPU计时函数和GPU计时函数。 情况(2)有三种工具nsi
阅读全文
摘要:1、纹理存储器的特性 纹理存储器中的数据以一维、二维或者三维数组的形式存储在显存中,可以通过缓存加速访问,并且可以声明大小比常数存储器要大的多。在kernel中访问纹理存储器的操作称为纹理拾取(texture fetching)。将显存中的数据与纹理参照系关联的操作,称为将数据与纹理绑定(textu
阅读全文
摘要:关于GPU编程的这些资料均是我早期的一些资料,趁出差这段时间整理下,所以就直接复制过来了,其中会有一些瑕疵,请读者朋友斧正,以下的代码仅仅是验证,在VS上已通过且达到了预期的目的,如果有时间,接下来我会编写并分享使用gpu编程实际应用过程中的经验教训和总结。 图像的纹理内存的读取方法: 特别提示:g
阅读全文
摘要:通过将CUDA相关计算操作放在库中,方便在项目中调用,省去了每次编译cu文件的麻烦,也便于集成到其他平台上。 本文配置:VS2015 CUDA8.0 一、封装CUDA动态库 主要步骤:修改自定义方式、设置cu文件项类型为CDUA CC++ ,添加依赖库cudart.lib. 1、创建一个动态库,这里
阅读全文