![](https://img-blog.csdnimg.cn/20210317114844574.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
CUDA
文章平均质量分 89
学习CUDA
伴君
这个作者很懒,什么都没留下…
展开
-
CUDA C编程(三十九)将C程序移植到CUDA C的案例研究
评 估 crypt并 行 crypt优 化 crypt部 署 crypt多GPU的crypt混合OpenMP-CUDA Crypt原创 2022-03-20 22:10:04 · 1703 阅读 · 0 评论 -
CUDA C编程(三十八)CUDA调试
内 核 调 试使用cuda-gdbUDA的printfCUDA的assert工具内 存 调 试cuda-memcheck的编译memcheck工具racecheck工具原创 2022-03-20 10:59:17 · 6442 阅读 · 1 评论 -
CUDA C编程(三十七)配置文件驱动优化
使 用 nvprof 寻 找 优 化 因 素性能分析模式性能分析的范围内存带宽全局内存访问模式共享内存存储体冲突寄存器溢出指令吞吐量使 用 nvvp 指 导 优 化导向分析无导向分析NVIDIA工具扩展...原创 2022-03-18 17:18:44 · 1036 阅读 · 3 评论 -
CUDA C编程(三十六)CUDA C的开发过程
在产品研发过程中的软件开发注意结构,旨在标准化代码并维护最好的范例。现在有许多软件开发模型,每种模型都描述了一些方法,这些方法都是针对特定情况下的特殊需求的。CUDA平台的开发过程是建立在现有模型和熟悉软件生命周期的概念之上的。了解GPU内存和执行模型抽象有助于更好地控制大规模并行GPU环境。这样,创建映射到抽象二维或三维网格的应用子域就变得很正常了,并且可以是使核函数像串行一样表示。重点关注高级区域分解和内存层次结构存储管理的内容,就不会被创建和销毁线程的繁琐细节所妨碍了。在CUDA的开发过程中,需要关原创 2022-03-17 16:47:34 · 1324 阅读 · 0 评论 -
CUDA C编程(三十五)跨GPU集群扩展应用程序
与同构系统相比,GPU加速集群被公认为极大地提升了性能效果和节省了计算密集型应用程序的功耗。当处理超大数据集时,通常需要多个计算节点来有效地解决问题。MPI(消息传递接口)是一个标准化和便携式地用于数据通信的API,它通过分布式进程之间的消息进行数据通信。在大多数MPI实现中,库例程是直接从C或其他语言中调用的。MPI与CUDA是完全兼容的。支持GPU之间不同节点上移动数据的MPI有两种实现方式:传统的MPI与CUDA-aware API。在传统的MPI中,只有主机内存的内容可以直接通过MPI函数来传输。原创 2022-03-15 16:43:28 · 2741 阅读 · 0 评论 -
CUDA C编程(三十四)多GPU上的有限差分
接下来通过使用有限差分的方法求解二维波动方程,将会学习到如何跨设备重叠计算和通信。二 次 波 动 方 程 的 模 板 计 算二维波的传播由以下波动方程来决定:其中,u(x,y,t)是波场,v(x,y)是介质的速度。这是一个二阶偏微分方程。求解这种偏微分方程的典型方法是使用规则的笛卡尔网格上的有限差分法。更简单地说,有限差分法近似于使用一个模板求导以计算规则网格中单一点的倒数,具体方法是围绕该点的多个局部点应用一个函数。下图展示了17点的模板。如果要求解中心点的导数,则需要使用16个离中心点最近的局部原创 2022-03-14 11:39:54 · 2492 阅读 · 0 评论 -
CUDA C编程(三十三)多GPU上的点对点通信
本篇主要介绍两个GPU之间的数据传输。将测试以下3种情况:两个GPU之间的单向内存复制;两个GPU之间的双向内存复制;内核中对等设备内存的访问。实 现 点 对 点 访 问首先,必须对所有设备启用双向点对点访问,如以下代码所示:inline void enableP2P(int ngpus){ for(int i = 0; i < ngpus; i++){ cudaSetDevice(i); for(int j = 0; j < ngpus; j+原创 2022-03-13 10:36:15 · 2030 阅读 · 0 评论 -
CUDA C编程(三十二)多GPU间细分计算
在 多 设 备 上 分 配 内 存在从主机向设备分配计算任务之前,需要确定在当前中有多少可用的GPU:int ngpus;cudaGetDeviceCount(&ngpus);printf("CUDA-capable devices: %i\n",ngpus);一旦GPU的数量已经确定,接下来就需要为多个设备声明主机内存、设备内存、流和事件。保存这些变量的一个简单方法是使用数组,声明如下:float *d_A[NGPUS], *d_B[NGPUS], *d_C[NGPUS];floa原创 2022-03-12 21:21:04 · 1153 阅读 · 0 评论 -
CUDA C编程(三十一)从一个GPU到多个GPU
在应用程序中添加对多GPU的支持,其最常见的原因是以下几个方面:问题域的大小:现有的数据集太大,单GPU内存大小与其不相符合;如果单GPU适合处理单任务,那么可以通过使用多GPU并发地处理多任务来增加应用程序地吞吐量。 在多GPU系统中,允许分摊跨GPU的服务器节点的功率消耗,具体方式是为给定的功率消耗单元提供更多的性能,同时提高吞吐量。当使用多GPU运行应用程序时,需要正确设计GPU间的通信。GPU间数据传输的效率取决于GPU是如何连接在一个节点上并跨集群的。在多GPU系统里有两种连接方式原创 2022-03-11 14:36:43 · 7444 阅读 · 0 评论 -
CUDA C编程(三十)OpenACC的使用
OpenACC 计 算 指 令 的 使 用 内核指令的使用 并行指令的使用 循环指令的使用 OpenACC计算指令小结 OpenACC 数 据 指 令 的 使 用 数据指令的使用 为内核指令和并行指令添加data子句 OpenACC 运 行 时 API OpenACC 和 CUDA 库 的 结 合 OpenACC 小 结 ...原创 2022-03-09 09:32:15 · 5520 阅读 · 0 评论 -
CUDA C编程(二十九)CUDA函数库的性能研究
cuSPARSE 与 MKL 的 比 较 cuBLAS 与 MKL BLAS 的 比 较 cuFFT 与 FFTW 及 MKL 的 比 较原创 2022-03-06 21:26:59 · 2015 阅读 · 0 评论 -
CUDA C编程(二十八)CUDA 6.0中函数库的介绍
Drop-In 库 多 GPU 库原创 2022-03-04 10:47:14 · 1353 阅读 · 0 评论 -
CUDA C编程(二十七)cuRAND库
拟 随 机 数 或 伪 随 机 数 的 选 择 cuRAND 库 概 述 概念介绍 主机和设备端API对比 cuRAND 介 绍 替换rand() 为CUDA内核生成随机数 cuRAND 发 展 中 的 重 要 主 题 ...原创 2022-03-03 21:31:25 · 2337 阅读 · 0 评论 -
CUDA C编程(二十六)cuFFT库
使 用 cuFFT API cuFFT 功 能 示 范原创 2022-03-01 11:01:15 · 2793 阅读 · 0 评论 -
CUDA C编程(二十五)cuBLAS库
管 理 cuBLAS 数 据 cuBLAS 功 能 示 范 cuBLAS 发 展 中 的 重 要 主 题原创 2022-02-28 10:59:14 · 2120 阅读 · 0 评论 -
CUDA C编程(二十四)cuSPARSE库
cuSPARSE 数 据 存 储 格 式 稠密存储方式 坐标存储方式 压缩稀疏行方式(CSR) 存储格式小结 用 cuSPARSE 进 行 格 式 转 换 cuSPARSE 功 能 示 范 cuSPARSE 发 展 中 的 重 要 主 题 ...原创 2022-02-27 21:24:41 · 4349 阅读 · 3 评论 -
CUDA C编程(二十三)CUDA库概述
CUDA 库 支 持 的 作 用 域 通用的CUDA库工作流 CUDA 库 支 持 的 作 用 域原创 2022-02-26 22:41:50 · 2277 阅读 · 0 评论 -
CUDA C编程(二十二)程序优化指令
单 精 度 与 双 精 度 的 比 较 标 准 函 数 与 内 部 函 数 的 比 较 标准函数和内部函数可视化 操纵指令生成 总结 了 解 原 子 指 令 从头开始 内置的CUDA原子函数 原子操作的成本 限制原子操作的性能成本 原子级浮点支持 总结 综 合 范 例...原创 2022-02-17 18:29:10 · 1469 阅读 · 0 评论 -
CUDA C编程(二十一)CUDA指令概述
浮 点 指 令 内 部 函 数 和 标 准 函 数 原 子 操 作 指 令原创 2022-02-04 23:03:51 · 2253 阅读 · 0 评论 -
CUDA C编程(二十)重叠GPU和CPU执行以及流回调
重 叠 GPU 和 CPU 执 行流 回 调原创 2022-01-22 18:16:29 · 940 阅读 · 0 评论 -
CUDA C编程(十九)重叠内核执行和数据传输
使 用 深 度 优 先 调 度 重 叠使 用 广 度 优 先 调 度 重 叠原创 2022-01-15 21:36:43 · 763 阅读 · 0 评论 -
CUDA C编程(十八)并发内核执行
非 空 流 中 的 并 发 内 核Fermi GPU 上 的 虚 假 依 赖 关 系使 用 OpenMP 的 调 度 操 作用环境变量调整流行为GPU 资 源 的 并 发 限 制默 认 流 的 阻 塞 行 为创 建 流 间 依 赖 关 系原创 2022-01-14 21:14:12 · 2109 阅读 · 0 评论 -
CUDA C编程(十七)流和事件概述
CUDA流是一系列异步的CUDA操作,这些操作按照主机代码确定的顺序在设备上执行。流能封装这些操作,保持操作的顺序,允许操作在流中排队,并使它们在先前的所有操作之后执行,并且可以查询排队操作的状态。这些操作包括在主机和设备间进行数据传输,内核启动以及大多数由主机发起但由设备处理的其他命令。流中操作的执行相对于主机总是异步的。CUDA运行时决定何时可以在设备上执行操作。我们的任务是使用CUDA的API来确保一个异步操作在运行结果被使用之前可以完成。在同一个CUDA流中的操作有严格的执行顺序,而在不同CUD原创 2022-01-13 21:11:24 · 1256 阅读 · 0 评论 -
CUDA C编程(十六)线程束洗牌指令
线 程 束 洗 牌 指 令 的 不 同 形 式 线 程 束 内 的 共 享 数 据 使 用 线 程 束 洗 牌 指 令 的 并 行 归 约 总 结原创 2022-01-06 22:54:15 · 2044 阅读 · 1 评论 -
CUDA C编程(十五)常量内存
使 用 常 量 内 存 实 现 一 维 模 板 与 只 缓 内 存 的 比 较原创 2022-01-05 18:16:19 · 1954 阅读 · 0 评论 -
CUDA C编程(十四)合并的全局内存访问
基 准 转 置 内 核 使 用 共 享 内 存 的 矩 阵 转 置 使 用 填 充 共 享 内 存 的 矩 阵 转 置 使 用 展 开 的 矩 阵 转 置 增 大 并 行 性原创 2022-01-04 20:54:49 · 1781 阅读 · 0 评论 -
CUDA C编程(十三)使用共享内存作为可编程管理缓存减少全局内存访问
使用共享内存的主要原因之一是要缓存片上的数据,从而减少核函数中全局内存访问的次数,接下来将重新使用并行归约核函数,以共享内存作为可编程管理缓存来减少全局内存的访问。使 用 共 享 内 存 的 归 约 下面的reduceGmem核函数将被作为基准性能的起点。实现并行归约只使用全局内存,输入元素的内循环是完全展开的。核函数如下:__global__ void reduceGmem(int *g_idata,int *g_odata,unsigned int n){ unsigned int原创 2022-01-03 20:57:23 · 724 阅读 · 1 评论 -
CUDA C编程(十二)CUDA共享内存的数据布局
**方 形 共 享 内 存** 矩 形 共 享 内 存 共 享 内 存原创 2022-01-01 19:30:33 · 1175 阅读 · 0 评论 -
CUDA C编程(十一)CUDA共享内存概述
GPU有两种类型的内存:板载内存以及片上内存。其中全局内存是较大的板载内存,具有相对较高的延迟。共享内存是较小的片上内存,具有相对较低的延迟,并且共享内存可以提供比全局内存高得多的带宽。可以把它当作一个可编程管理的缓存,共享内存通常的用途有:块间线程通信的通道;用于全局内存数据的可编程管理的缓存;高速暂存存储器,用于转换数据以优化全局内存访问模式。共 享 内 存 共 享 内 存 分 配共 享 内 存 存 储 体 和 访 问 模 式配 置 共 享 内 存 量同 步...原创 2021-12-31 21:30:48 · 4626 阅读 · 2 评论 -
CUDA C编程(九)CUDA内存访问模式
大多数设备端数据访问都是从全局内存开始的,并且多数GPU应用程序容易受内存带宽的限制。因此,最大限度地利用全局内存带宽是调控核函数性能的基础。如果不能正确的调控全局内存的使用,其他优化方案很可能也收效甚微。为了在读写数据时达到最佳的性能,内存访问操作必须满足一定的条件。CUDA执行模型的显著特征之一就是指令必须以线程束为单位进行发布和执行。存储操作也是同样。在执行内存指令时,每个线程都提出了一个包含请求地址的单一内存访问请求,它并由一个或多个设备内存传输提供服务。根据线程束中内存地址的分布,内存访问可以原创 2021-12-23 21:13:19 · 2995 阅读 · 0 评论 -
CUDA C编程(八)CUDA内存管理
CUDA编程的内存管理与C语言的类似,需要程序员显式管理主机和设备之间的数据移动。随着CUDA版本的升级,NVIDIA正系统地实现主机和设备内存空间的统一,但对于大多数应用程序来说,仍需要手动移动数据。对于CUDA内存管理来说,工作重点在于如何使用CUDA函数来显式地管理内存和数据移动,主要是两个方面:分配和释放设备内存;在主机和设备之间传输数据。为了达到最优性能,CUDA提供了在主机端准备设备内存地函数,并且显式地向设备传输数据和从设备中获取数据。内 存 分 配 和 释 放 CUDA编程模型假设原创 2021-12-20 22:34:21 · 2108 阅读 · 0 评论 -
CUDA C编程(七)CUDA内存模型
内存的访问和管理是所有编程语言的重要部分。在现代加速器中,内存管理对高性能计算有着很大的影响。因为多数工作负载被加载和存储数据的速度所限制,所以有大量低延迟、高带宽的内存对性能是非常有利的。然而,大容量、高性能的内存造价高且不容易生产。因此,在现有的硬件存储子系统下,必须依靠内存模型获得最佳的延迟和带宽。CUDA内存模型结合了主机和设备的内存系统,展现了完整的内存层次结构,使我们能够显式地控制数据布局以优化性能。...原创 2021-12-18 20:35:45 · 1079 阅读 · 0 评论 -
CUDA C编程(六)展开循环以及动态并行
展开循环 展开循环是一个尝试通过减少分支出现的频率和循环维护指令来优化循环的技术。在循环展开中,循环主体再代码中要多次被编写,而不是只编写一次循环主体再使用另一个循环来反复执行的。任何的封闭循环可将它的迭代次数减少或者完全循环。循环体的复制数量被称为循环展开因子,迭代次数就变为了原始循环迭代次数除以循环展开因子。在顺序数组中,当循环的迭代次数在循环执行之前就已经知道时,循环展开是最有效提升性能的方法。考虑下面的代码:for(int i = 0; i < 100; i++){ a[i] =原创 2021-12-14 16:30:16 · 3473 阅读 · 2 评论 -
CUDA C编程(五)并行性的表现以及避免分支分化
为更好地理解线程束执行的本质,将使用不同的执行配置分析下述的sumMatrixOnGPU2D核函数。使用nvprof配置指标,可以有助于理解为什么有些网格/块的维数组合比其他的组合更好。这些练习会提供网格和块的启发式算法,这是CUDA编程人员必备的技能。二维矩阵求和的核函数如下所示:__global__ void sumMatrixOnGPU2D(float *A, float *B, float *C, int NX, int NY){ unsigned int ix = blockId原创 2021-12-07 11:16:01 · 1243 阅读 · 0 评论 -
CUDA C编程(四)理解线程束执行的本质
对于我们来说,在内核中似乎所有的线程都是并行地运行的。这在逻辑上是正确的,但从硬件的角度来看,不是所有线程在物理上都是可以同时并行地执行。前面提到,线程束的概念是把32个线程划分到一个执行单元中,接下来从硬件的角度来介绍线程束执行,并能够获得指导内核设计的方法。线 程 束 和 线 程 块 线程束是SM中基本的执行单元。当一个线程块被调度到一个SM上,线程块中的线程会被进一步划分为线程束。一个线程束由32个连续的线程组成,在一个线程束中,所有的县城按照单指令多线程(SIMT)方式执行;也就是说,所有原创 2021-12-04 15:15:22 · 2382 阅读 · 0 评论 -
CUDA C编程(三)CUDA执行模型概述
CUDA执行模型概述 一般来说,执行模型会提供一个操作视图,说明如何在特定的计算架构上执行指令。CUDA执行模型揭示了GPU并行架构的理解线程束执行的本质原创 2021-12-01 21:52:44 · 2476 阅读 · 0 评论 -
CUDA C编程(二)CUDA编程模型
CUDA编程模型概述 CUDA是一种通用的并行计算平台和编程模型,是在C语言上扩展的的。借助于CUDA,可以像编写C语言程序一样实现并行算法。 CUDA编程模型提供了一个计算机架构抽象作为应用程序和其可用硬件之间的桥梁。下图说明了程序和编程模型实现之间的抽象结构。其中通信抽象是程序与编程模型实现之间的分界线,它通过专业的硬件原语和操作系统的编译器或库来实现。利用编程模型所编写的程序指定了程序的各组成部分是如何共享信息及相互协作的。编程模型从逻辑上提供了一个特定的计算机架构,通常它体现在编程语言或编程原创 2021-11-29 20:44:11 · 3437 阅读 · 1 评论 -
CUDA C编程(一)基于CUDA的异构并行计算
并行计算 并行计算可以被定义为同时使用许多计算资源(核心或计算机)来执行并发计算,一个大的问题被分解成多个小问题,然后再不同的计算资源上并行处理这些小问题。并行计算通常涉及两个不同的技术领域:计算机架构以及并行程序设计。具体如下图: 大多数现代处理器都应用了哈佛体系结构(Harvard architecture),如下图所示,它主要由3部分组成:内存(指令内存和数据内存)、中央处理单元(控制单元和算术逻辑单元)、输入/输出接口。串 行 编 程 和 并 行 编 程 下图描述了区分两个计算单元原创 2021-11-25 00:06:55 · 1873 阅读 · 0 评论 -
CUDA安装配置以及遇到的一些问题解决
文章目录CUDA安装CUDA安装遇到的问题以及解决方法CUDA安装首先说一下自己用的是VS2017+CUDA9.2,在这里给予参考。1.首先查看自己的电脑是否支持CUDA的图形处理器(GPU),一般电脑都可以,因为NVIDIA推出的每款GPU都能支持CUDA。首先查看自己的GPU,右键此电脑,点击属性选择设备管理器选择显示设备器,在这里可以看到自己的GPU对照英伟达官网链接检查自己的GPU是否支持CUDA2. 查看适合自己的CUDA版本并下载首先在控制面板中找到NVIDIA控制.原创 2021-04-09 12:19:31 · 9692 阅读 · 0 评论