Cuda
Dezeming
研究方向:数学原理,GPU加速技术,数据结构与算法,机器学习,深度学习神经网络,3D可视化,计算机图形学,图像处理,计算机视觉,Qt程序设计,C++编程
曾学习和研究过:Java,51,stm32,msp430等单片机,嵌入式ARM,DSP,模拟/数字电路,树莓派
展开
-
指定CUDA版本失败的解决方案
但是因为我有的代码需要CUDA 11里的函数,这些函数在CUDA12里被彻底删除了,但是接下来我的代码中,CMakeLists.txt 无论怎么设置,结果都只能选择CUDA 12的nvcc.exe。新电脑安装的WIN11系统,因为CUDA只有11和12目前能装到WIN11上,所以就装了一个CUDA 11.7。无奈之下,重装了一下CUDA 11,我本以为是12压制住了11,但是又重装了11以后仍然不行。虽然我知道卸载CUDA12一定可以,但是我实在不想装了又卸,很麻烦的。系统路径也全改了,还是不行。原创 2023-08-15 20:37:57 · 637 阅读 · 0 评论 -
配置Nvidia CUDA-VS开发环境
首先进入官网:https://www.nvidia.cn/原创 2021-06-08 10:04:20 · 4469 阅读 · 0 评论 -
共享内存 Bank冲突
计算机图形学技术见计算机图形学技术GPU上的warp其实是软件上来说的,在CUDA架构中,一个warp指的是32个线程的集合,这些线程是“编织在一起”并以一致步调(lockstep)方式执行的。在程序的每一行,warp中的每个线程对不同的数据执行相同的指令。为了获得较高的内存带宽,共享存储器被划分为多个大小相等的存储器模块,称为bank,可以被同时访问。如果跨越多个(假设n个)不同的内存bank的对里面的m个地址进行读取和写入的操作,这是可以被同时执行的,这样就大大提高了整体的带宽 ,带宽可..原创 2020-12-08 11:01:49 · 1414 阅读 · 0 评论 -
CUDA线程同步
CUDA 复杂问题 + 细节问题 解答见CUDA复杂问题 + 细节问题 解答考虑如下程序:__global__ void staticReverse(int *d, int n){ __shared__ int s[64]; int index = threadIdx.x; int reindex = n-index-1; s[index] = d[index]; __syncthreads(); d[index] = s[reindex];}采用了线程同步,因..原创 2020-12-08 08:54:17 · 2171 阅读 · 0 评论 -
CUDA Handbook CUDA的硬件架构
CPU配置以前的时候,CPU通过“芯片组”(chipset ,或者core logic)来与外界(包括输出输出,网络控制器,键盘等)相连。最近,芯片组被分为了南北桥系统:南桥连接大多数外围设备和系统,北桥连接图形总线和内存控制器(通过前端总线与内存相连),后来,图形总线被PCIe接口取代。 (垂直同步技术和新的方案)垂直同步技术可以避免帧率过高时的画面撕裂问题,但由于普通液晶显示器存在60Hz的刷新率限制,打开垂直同步往会导致游戏帧率过低而卡顿,因此很多人都会选择关闭它。G...原创 2020-11-25 15:36:54 · 281 阅读 · 0 评论 -
CUDA Handbook 关于CUDA的硬件架构和软件架构的详细解读
CUDA 复杂问题 + 细节问题 解答见CUDA复杂问题 + 细节问题 解答基础:之前学习过一定的CUDA并行编程,比如《CUDA by Example》Chapter 1上个世纪,Intel和AMD曾经引入了多媒体处理指令集(MMX),并与微软合作实现3D光栅器,来遏制光栅器的运行从CPU到其他硬件转移的趋势,但是失败了。它速度也就赶得上第一代电脑的2D/3D加速卡S3 Virge GX的速度的一半。之后,图形底层开始直接和CPU供应商合作,把CPU核心引入到图形管线中,得到了很多好处,但..原创 2020-11-24 16:13:09 · 468 阅读 · 1 评论 -
CUDA拷贝二维数组到GPU内存中
CUDA 复杂问题 + 细节问题 解答见CUDA复杂问题 + 细节问题 解答网上没找到如何拷贝二维数组到GPU的例程,所以我就自己写一个,其实原理也很简单,就是用三维指针导入给二维指针分配内存。先说一下我们的目标:导入到GPU一个二维数组:dev_data[arrayNum][mwidth * mheight],该数组内元素的值是data[i][j] = i + 0.001*j。我们首先先输出data[i][7]。然后我们再在GPU里把数组的data[i][7]全都改为82,然后再输出所有的..原创 2020-11-22 20:01:00 · 2950 阅读 · 0 评论 -
CUDA 二维纹理的创建和使用测试
CUDA 复杂问题 + 细节问题 解答见CUDA复杂问题 + 细节问题 解答首先先把程序贴上:#include "cuda_runtime.h"#include "device_launch_parameters.h"#include <cuda_runtime_api.h>#include <cuda.h>#include <iostream>#define width 10#define height 11using std::cout;..原创 2020-07-24 17:50:28 · 2271 阅读 · 0 评论 -
CUDA 一维纹理的创建和使用测试
CUDA 复杂问题 + 细节问题 解答见CUDA复杂问题 + 细节问题 解答先直接贴上总代码#include "cuda_runtime.h"#include "device_launch_parameters.h"#include "cuda.h"#include <iostream>using std::cout;using std::endl;#define arrayNum 100texture<float, cudaTextureType1D, cud..原创 2020-07-24 10:59:19 · 1824 阅读 · 0 评论 -
CUDA 复杂问题 + 细节问题 详细解答
CUDA 复杂问题 + 细节问题 详细解答 见本人在使用CUDA做项目时,会遇到很多比较细节或者复杂的问题,在这里以博客的形式记录下来,喜欢的可以关注收藏。CUDA纹理原创 2020-07-24 09:53:44 · 2142 阅读 · 0 评论 -
CUDA 之 共享内存
某些部分翻译自《CUDA by Example》块(Block)内的并行线程将能够执行并行块无法完成的任务。硬件将一次发射的数据块数限制在65535块。类似地,硬件限制了每个块的线程数,我们可以用这些线程来启动内核。具体地说,这个数字不能超过设备属性结构的maxThreadsPerBlock字段指定的值。对于许多当前可用的图形处理器,这个限制是每个块512个线程,那么我们如何使用基于线程的方法来添加两个大小大于512的向量?我们将不得不使用线程和块的组合来实现这一点。很高兴你这么问。cuda翻译 2020-07-18 21:16:40 · 1200 阅读 · 0 评论 -
CUDA的Block和Grid详解
一般CUDA会把线程分为Block和Grid:这里方便介绍我们用的都是二维的结构,其实Block和Grid也可以设置成三维的。blockDim.x:Block的x方向的维度,这里是5,即每行5个线程。blockDim.y:Block的y方向的维度,这里是3,即每列3个线程。blockIdx.x:Block在x方向的位置,图中放大的Block是2,即为第2个。blockIdx.y:Block在y向的位置,图中放大的Block是2,即为第2个。注意blockIdx中的Idx是表示in原创 2020-07-07 15:24:00 · 8131 阅读 · 2 评论 -
CUDA结构体或类的传递内存实验
我想把指针传送到CUDA内存区域中,但是遇到了一定的问题,最终找到了解决方法,这里进行一下记录:一、普通传递没有任何问题:cudaMalloc((void**)&a_dev, 50 * sizeof(int));a_host = (int*)malloc(sizeof(int) * 50);for(inti = 0;i < 50;i++) a_host[i] = i;cudaMemcpy(a_dev, a_host, 50 * sizeof(int), cudaMem..原创 2020-06-29 18:26:59 · 1921 阅读 · 0 评论 -
CUDA定义在类内的数组内存拷贝和计算问题
CUDA在类内进行拷贝的内存,在外部无法进行计算?比如:#include "cuda_runtime.h"#include "device_launch_parameters.h"#include <stdio.h>#include <iostream>class myRandom {public: myRandom() { cudaMalloc((void**)&a_dev, 50 * sizeof(int)); a_host = (int*)原创 2020-06-29 11:36:18 · 457 阅读 · 0 评论 -
CUDA Handbook 补充 CPU和GPU硬件架构1
CPU通过内存管理模块与内存进行连接,如果内存不足,那么系统自动从硬盘划定出区域作为虚拟内存空间,读写速度很慢。 北桥是Intel计算机主板芯片组的两枚芯片之一,另一枚是南桥,南桥连接外围设备到CPU。以前的GPU显卡在北桥,后来集成到了CPU内部。现在则基本上都是独立显卡,位于所谓的南桥区域,PCIe总线已经取代了北桥显卡设计,以前的PCI总线速度较慢,不太能满足...原创 2019-03-30 10:28:41 · 6100 阅读 · 0 评论 -
CUDA Handbook 补充 CPU和GPU硬件架构2
Latency Hiding = Latency tolerance 延迟隐匿又叫延迟容忍。通过在同一时间执行更多的warp来获得更高的吞吐量,叫做延迟容忍。所谓warp就是一个线程区里面一起执行的线程,一般是32个线程一起执行。它的意义是为了“隐藏”延迟性,也就是说最大化利用GPU的计算功能,计算相对多了,数据传输则相对就小了(比如同样执行100个操作,其中90个是计算,10个...原创 2019-03-30 11:19:53 · 6292 阅读 · 0 评论 -
CUDA Handbook 补充 CPU和GPU硬件架构3
上一个博客说道,不同CPU内存可以共享,但是如果同一时间共享次数或者数量太多,缓存就不够用了,则也会对性能造成影响。 有些时候,GPU设备使用同一个PCIe总线,连接到IO设备控制器上,但是有个问题,毕竟GPU带宽是有限的,如果程序要从GPU广泛传输数据,则可能造成阻塞。如图: 图片来自CUDA han...原创 2019-03-30 16:09:32 · 6212 阅读 · 0 评论 -
CUDA Handbook 补充 CPU和GPU硬件架构4
SM(streaming multiprocessor) Mapped pinned memory 页锁定内存,分配在主机内存但是映射到GPU,所以可以直接从GPU上访问。 缓存侦测cache snoops:当特定数据由多个缓存共享,并且处理器修改共享数据的值时,更改必须传播到具有数据副本的所有其他缓存,把所有存有该数据的缓存都更改。此更改传播可防止系统违...原创 2019-03-31 23:00:41 · 6074 阅读 · 0 评论 -
CUDA Handbook 补充 CUDA软件架构
首先要区分CUDA驱动程序和CUDA运行时,以及设备运行时。 CUDA驱动程序的版本,是由CUDA驱动决定,通过cuDriverGetVersion()函数获得。CUDA运行时的版本,则是需要用cudaDeviceProp结构获得的。驱动程序版本必须大于运行时版本(因为CUDA是向后兼容,所以高版本的驱动会兼容低版本的 程序)。设备运行时则是CUDA运行时的一个子集,里面的函...原创 2019-04-01 19:40:30 · 6411 阅读 · 0 评论 -
CUDA纹理1
最近的项目需要用到三维纹理来加速,之前使用的纹理也基本上都是二维纹理,现在不如趁机会把纹理的内容好好整理一下。 当然是建立在一些基础之上的,比如最简单的CUDA书《cuda by example》,里面的纹理介绍很简单,但是也非常基础。主要内容还是依据CUDA handbook ,但是这本书对于从事软件开发行业的人来说内容过于晦涩,有些内容我也是没有接触过,如果有问题欢迎留言...原创 2019-04-01 20:56:53 · 6093 阅读 · 0 评论 -
CUDA的纹理内存讲解
CUDA的纹理内存讲解,来自翻译和补充官方文档 CUDA programming GuideTexture and Surface MemoryCUDA支持供GPU处理图形用的纹理硬件和表面(surface)内存,但是只支持一部分功能。从纹理和表面内存中读取数据可以得到很多好处(以后再说)。有两个不同的API可以来获取纹理内存和表面内存:1.纹理参考API,支持所有设备。2.纹理对象...原创 2019-03-28 21:03:34 · 7131 阅读 · 0 评论 -
CUDA纹理2
所谓CUDA module,网上翻译的是CUDA模块,在查阅CUDA手册得知,CUDA module就是CUDA driver API的一个数据类型形式。驱动API使用的时候一定要初始化所有的属性,因为不管可变还是不可变的属性,都不会把引用加载到CUDA moudule中。在这里,与纹理有关的CUDA moudule指的就是一个结构,里面有很多变量,可以用来设置纹理的属性。 ...原创 2019-04-08 14:50:05 · 6075 阅读 · 0 评论 -
Cuda中的cuda_Malloc函数
很多人不理解为什么cuda_Malloc的第一个参数是两个星星, int *dev_c; HANDLE_ERROR(cudaMalloc((void**)&dev_c, sizeof(int)));其实直接用&dev_c也是可以的,但是函数原型必须得是void**型的指针(请看我的指针游戏系列博客)如图,假设dev_c的地址是0x05430,假设变量v...原创 2019-02-05 14:19:50 · 17954 阅读 · 4 评论