CUDA
文章平均质量分 67
Zhninu
...........
展开
-
cudaMemcpyAsync()并非真的Async
最近好奇,cudaMemcpyAsync()这个函数相对于Host端是否真的的异步的。简单测试了一下,发现有些时候并非是异步的。通过阅读文档发现,cudaMemcpyAsync()是否异步遵循以下定义。通过以上文档说明,对于cudaMemcpyAsync(), Host端pinned memory是必须的(与函数参数说明中一直)。非pinned memory的情况下,不是同步的,就是需要将pageable memory转化成pinned memory,之后再异步,非常耗时。...原创 2021-12-14 09:57:42 · 6665 阅读 · 0 评论 -
[CUDA编译问题] MSB3721(返回值1) & nvcc fatal : Path to libdevice library not specified
问题描述:Visual Studio 2015 + CUDA 11.1环境,之前环境正常, 突然出现以下问题: MSB3721, 返回值1 输出信息显示:nvcc fatal : Path to libdevice library not specified解决方法:根据上面的问题信息,我上网上检索问题解决方案, 方案汇总如下:1、平台信息不对,x64的平台配置成了x86的 2、nvcc.exe的路径或者环境变量配置的不对 3、各种库路径的信息配置的不对 等等.......原创 2021-12-07 12:49:02 · 1322 阅读 · 0 评论 -
VS2015 CUDA Code调试
1、需要Software(1)Visual Studio 2015(2)Nsight Visual Studio Edition(3)Nsight Monitor2、配置安全连接为了使Visual Studio中的NVIDIA Nsight主机软件和目标机器上的Nsight Monitor能够相互通信,它们的安全设置必须匹配。要启用安全连接:在主机上,打开NVIDIA Nsight选项窗口中的常规页面。a) 从Visual Studio 的Nsight菜单中,选择“Options”。b原创 2021-11-17 15:34:46 · 1940 阅读 · 0 评论 -
CUDA C 项目中 error C2059: 语法错误:“<” 问题
该问题的关键在于理解CUDA项目中C\C++文件需要由c++编译器进行编译,而CUDA C的源文件需要由CUDA的编译器nvcc.exe进行编译。发生该语法错误的原因是cu文件被C++编译器所编译,C++编译器无法识别 “<<<”,导致报错。cu文件会被C++编译器所编译,原因在于我们使用#include将cu文件包含到了C++文件中。对于#include的用途,更简单的理解就是把几个文件合并成一个文件,所以,当编译C++文件中,包含其中的cu文件也会被编译,从而导致 “<&转载 2021-11-16 12:18:51 · 3063 阅读 · 2 评论 -
CUDA Tool | Windows10-CUDA11.1-JDK8 环境下安装NVidia Visual Profiler(nvvp)安装笔记
背景:分析CUDA程序的GPU占用情况。除了使用常见的clock、gettimeofday计时分析程序的效率之外,还可以使用nvidia推出的nvprof进行具体的GPU指令耗时分析,为了方便分析,可以使用nvidia visual profiler对nvprof生成的分析报告进行可视化。官方链接:https://developer.nvidia.com/nvidia-visual-profiler准备:Window 10环境下的nvprof工具生成待可视化的目标文件(*.nvvp文件)。.原创 2021-11-02 11:18:55 · 2457 阅读 · 0 评论 -
CUDA版本与显卡驱动匹配
一、已知显卡驱动,安装对应版本的CUDANVIDIA 控制面板帮助>>系统信息组件可以查看对应的CUDA driver版本,下载对应的驱动。这个CUDA driver是在NVIDIA驱动中自带的。二、想要安装固定版本的CUDA,查看驱动是否匹配,或者更新驱动https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html上面网站是官方的CUDA版本和驱动对应的表格。根...原创 2021-10-21 16:39:55 · 21664 阅读 · 0 评论 -
显卡、显卡驱动、Nvcc、Cuda Driver、CudaToolkit 、Cudnn到底是什么?
显卡定义显卡显卡(Video card,Graphics card)全称显示接口卡,又称显示适配器,是计算机最基本配置、最重要的配件之一。显卡是电脑进行数模信号转换的设备,承担输出显示图形的任务。具体来说,显卡接在电脑主板上,它将电脑的数字信号转换成模拟信号让显示器显示出来。原始的显卡一般都是集成在主板上,只完成最基本的信号输出工作,并不用来处理数据。随着显卡的迅速发展,就出现了GPU的概念,显卡也分为独立显卡和集成显卡。独立显卡和集成显卡:集成显卡是指显卡集成在主板上,...原创 2021-10-21 16:21:33 · 3471 阅读 · 2 评论 -
理解CUDA中的cudaMalloc()的参数
函数的原型:cudaError_t cudaMalloc (void **devPtr, size_t size ); 返回值是CUDA中定义的一个错误代码。Host端创建一个指针变量,将这个指针变量传入到cudaMalloc()函数。Device端根据设置创建内存后,会将内存首地址赋值给Host端的指针变量,故参数设置需要**(指针变量地址)。例子:float *Device_Matrix = NULL;size_t size = 1024 * sizeof(float);c原创 2021-10-19 11:45:57 · 2045 阅读 · 0 评论 -
由矩阵运算理解CUDA kernel函数的运行
一、kernel函数介绍kernel在cuda中指的是一个函数,当一个kernel被调用的时候,gpu会同时启动很多个线程来执行这一个kernel,这样就实现了并行化;每个线程执行这一kernel将通过线程号来对应输入数据的下标,这样保证每个thread执行的kernel一样,但是处理的数据不一样。核函数以下几个的前缀分别代表:__global__:在GPU上执行,可以在CPU上被调用,也可以在GPU上被调用__device__:在GPU上执行,只能在GPU上被调用__host__:在CPU..转载 2021-10-19 11:37:07 · 3577 阅读 · 0 评论 -
2.3CUDA矩阵乘法
CPU 矩阵乘法能相乘的两个矩阵,必须满足一个矩阵的行数和第二个矩阵的列数相同.A(N*P) * B(P*M) = C(N*M). 其中P是行数,N是列数, 从宽高的角度来说,即 A的宽度和B的高度是相同的.C矩阵 = ha * wb.其中C(i,j) = A矩阵中的i行和B矩阵中的j列进行点乘得到该点的值.//C = A*Bvoid MatrixMulCPU(float* _C,const float *_A,const float *_B,int _wa,int _ha,in..转载 2021-10-19 11:22:10 · 478 阅读 · 0 评论 -
Cuda 11.4和VS2015不兼容
经过几天的折腾,发现Cuda 11.4和VS2015不兼容。我搭环境遇到的问题问题一:安装完Cuda 11.4之后,VS2015新建项目中没有Cuda 11.4的模板。经过一顿折腾之后,解决了。方法连接:https://blog.csdn.net/zjy1175044232/article/details/120746396问题二:可以新建Cuda工程了,发现根本编译不了。MSB3721编译报错。nvcc fatal : nvcc cannot find a su..原创 2021-10-14 16:32:26 · 2605 阅读 · 3 评论 -
VS2015+Cuda 11.4 新建项目CUDA模板
本机环境:Win10 + VS2015 + Cuda 11.4问题 :Cuda正常安装,Visual Studio Integration也正常安装完成,但是新建项目中没有Cuda模板,添加文件也没有Cuda C++文件。解决方法:1、关闭所有的Visual Studio程序。2、确保MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations下有visual_studio_integration\MSBuildExtensions的文件原创 2021-10-13 16:38:44 · 1738 阅读 · 2 评论 -
2.2CUDA-Memory(存储)和bank-conflict
在CUDA基本概念介绍有简单介绍CUDA memory。这里详细介绍:每一个线程拥有自己的私有存储器,每一个线程块拥有一块共享存储器(Shared memory);最后,grid中所有的线程都可以访问同一块全局存储器(global memory)。除此之外,还有两种可以被所有线程访问的只读存储器:常数存储器(constant memory)和纹理存储器(Texture memory),它们分别为不同的应用进行了优化。全局存储器、常数存储器和纹理存储器中的值在一个内核函数执行完成后将被继续保持,可以被同一转载 2021-10-11 15:04:54 · 561 阅读 · 0 评论 -
2.1CUDA-Thread
在HOST端我们会分配block的dimension, grid的dimension。但是对应到实际的硬件是如何执行这些硬件的呢?如下图:lanuch kernel 执行一个grid。一个Grid有8个block,可以有两个硬件执行单元,一个执行一个block,需要执行4次,或者像右边有4个执行单元,一共执行两次。这个就很灵活,提供啦程序的扩展性,我们在代码中可以根据具体硬件的约束来设置,提高程序的兼容性和扩展性。在CUDA中实际执行thread的硬件我们称作Streaming mult转载 2021-10-11 14:35:08 · 928 阅读 · 0 评论 -
1.2CPU和GPU的设计区别
CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针对了两种不同的应用场景。CPU需要很强的通用性来处理各种不同的数据类型,同时又要逻辑判断又会引入大量的分支跳转和中断的处理。这些都使得CPU的内部结构异常复杂。而GPU面对的则是类型高度统一的、相互无依赖的大规模数据和不需要被打断的纯净的计算环境。于是CPU和GPU就呈现出非常不同的架构(示意图):图片来自nVidia CUDA文档。其中绿色的是计算单元,橙红色的是存储单元,橙黄色的是控制单元。GPU采用了数量众多的计算单元转载 2021-10-10 13:59:13 · 294 阅读 · 0 评论 -
CUDA网格限制
转载 2021-10-10 11:32:06 · 142 阅读 · 0 评论 -
CUDA基本概念
CUDA计算模型CUDA中计算分为两部分,串行部分在Host上执行,即CPU,而并行部分在Device上执行,即GPU。相比传统的C语言,CUDA增加了一些扩展,包括了库和关键字。CUDA代码提交给NVCC编译器,该编译器将代码分为Host代码和Device代码两部分。Host代码即为原本的C语言,交由GCC,ICC或其他的编译器处理;Device代码部分交给一个称为实时(Just in time)编译器的组件,在给代码运行之前编译。Device code编译成类似java的字节码文件,转载 2021-10-10 10:48:48 · 715 阅读 · 0 评论 -
CUDA 进阶学习
CUDA 进阶学习CUDA基本概念CUDA网格限制1.2CPU和GPU的设计区别2.1CUDA-Thread2.2CUDA-Memory(存储)和bank-conflict2.3CUDA矩阵乘法3.1 全局存储带宽与合并访问 -- Global Memory(DRAM) bandwidth and memory coalesce3.2 卷积3.3分析卷积乘法优化的复用4.1Reduction模型4.2 CUDA Reduction 一步一步优化4.3 Reduction代码(Het转载 2021-10-10 10:26:40 · 272 阅读 · 0 评论