CUDA-GPU programming Introduction (4)

2024-06-20 05:58

本文主要是介绍CUDA-GPU programming Introduction (4),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Concurrent execution and streams

GPU和CPU之间的并行性是不言而喻的,各自的计算是asynchronous的,任何时候如果需要同步这两者,都需要用到:

CudaDeviceSynchronize ()

对于GPU和CPU之间的memory copy来说,小数据量传输默认是asynchronous,大数据量传输则是synchronous的。但是我们可以加上后缀强迫所有内存读取异步进行:

cudaMemcpyAsync()
cudaMemcpyToSymbolAsync()

同时,如果出于debug的需要,我们想让所有的memory copy依次进行,可以将environment variable:
CUDA_LAUNCH_BLOCKING 设置为1.

Concurrency between different device operations (kernels and/or
memory copying) is a completely different story

现代GPU从硬件上来说,当然是允许多个device的操作并行的。操作指的是,kernels or/and memory copy。默认来说,所有的device操作都是serial的,不具有并行性。要利用并行性,得使用cuda的stream设置。

• A stream is a sequence of commands (possibly issued by different
host threads) that execute in order
• If stream ID is omitted, it is assumed to be “0” (default) stream. For
non-default streams, the IDs have to be used explicitly:

mykernel <<<Nblocks, Nthreads, 0, ID>>> ();
cudaMemcpyAsync (d_A, h_A, size, cudaMemcpyHostToDevice, ID);

stream在用之前必须像变量一样被声明并创建然后用完也得destroy。基本代码如下:

// Host code
cudaStream_t ID[2];
// Creating streams:
for (int i = 0; i < 2; ++i) cudaStreamCreate (&ID[i]);
// These two commands will run concurrently on GPU:
mykernel <<<Nblocks, Nthreads, 0, ID[0]>>> ();
cudaMemcpyAsync (d_A, h_A, size, cudaMemcpyHostToDevice, ID[1]);
// Destroying streams:
for (int i = 0; i < 2; ++i) cudaStreamDestroy (ID[i]);

但这种stream的做法也是有局限性的。
首先,memory copy这件事需要跟别的kernel或者反方向copy并行的话,host memory必须要是page-locked 或者说pinned,也就是host上申请内存不能是C的基本malloc而必须是:

cudaMallocHost()

host上的静态变量要想用pinned可以用:cudaHostRegister();
对于kernel来说,最多可以有16个kernel并行,而且这种并行性是无法保证的,因为当GPU资源有限的时候,如果多的kernel无法分配到需要的resource,并行也不会发生。
其他几个stream命令:

• cudaDeviceSynchronize() : global synchronization (across all the streams and the host);
• cudaStreamSynchronize (ID) : synchronize stream ID with the host;
• cudaStreamQuery (ID) : tests if the stream ID has finished running.

利用stream来帮助memory transfer between GPU and CPU。
情景一:
transfer和host computation并行

// On host:
// This memory copying will be asynchronous only in regards to the host code:
cudaMemcpyAsync (d_a, h_a, size, cudaMemcpyHostToDevice, 0);
// This host code will be executed in parallel with memory copying:
serial_computation ();
// The kernel will be executed after copying and serial code is done:
kernel <<<N, M>>> (d_a);

情景二:
transfer和kernel并行

// This memory copying will be asynchronous in regards to the host and stream ID[1]:
cudaMemcpyAsync (d_a, h_a, size, cudaMemcpyHostToDevice, ID[0]);
// The kernel doesn't need d_a, and will run concurrently:
kernel1 <<<N, M, 0, ID[1]>>> ();
// This kernel needs d_a, but doesn't need the result of kernel1; it will run after the
// Memcpy operation, and concurrently with kernel1:
kernel2 <<<N, M, 0, ID[0]>>> ();

这篇关于CUDA-GPU programming Introduction (4)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077296

相关文章

AI Toolkit + H100 GPU,一小时内微调最新热门文生图模型 FLUX

上个月,FLUX 席卷了互联网,这并非没有原因。他们声称优于 DALLE 3、Ideogram 和 Stable Diffusion 3 等模型,而这一点已被证明是有依据的。随着越来越多的流行图像生成工具(如 Stable Diffusion Web UI Forge 和 ComyUI)开始支持这些模型,FLUX 在 Stable Diffusion 领域的扩展将会持续下去。 自 FLU

如何用GPU算力卡P100玩黑神话悟空?

精力有限,只记录关键信息,希望未来能够有助于其他人。 文章目录 综述背景评估游戏性能需求显卡需求CPU和内存系统需求主机需求显式需求 实操硬件安装安装操作系统Win11安装驱动修改注册表选择程序使用什么GPU 安装黑神话悟空其他 综述 用P100 + PCIe Gen3.0 + Dell720服务器(32C64G),运行黑神话悟空画质中等流畅运行。 背景 假设有一张P100-

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

PyInstaller问题解决 onnxruntime-gpu 使用GPU和CUDA加速模型推理

前言 在模型推理时,需要使用GPU加速,相关的CUDA和CUDNN安装好后,通过onnxruntime-gpu实现。 直接运行python程序是正常使用GPU的,如果使用PyInstaller将.py文件打包为.exe,发现只能使用CPU推理了。 本文分析这个问题和提供解决方案,供大家参考。 问题分析——找不到ONNX Runtime GPU 动态库 首先直接运行python程序

麒麟系统安装GPU驱动

1.nvidia 1.1显卡驱动 本机显卡型号:nvidia rtx 3090 1.1.1下载驱动 打开 https://www.nvidia.cn/geforce/drivers/ 也可以直接使用下面这个地址下载 https://www.nvidia.com/download/driverResults.aspx/205464/en-us/ 1.1.3安装驱动 右击,

Kubernetes的alpha.kubernetes.io/nvidia-gpu无法限制GPU个数

问题描述: Pod.yaml文件中关于GPU资源的设置如下: 然而在docker中运行GPU程序时,发现宿主机上的两块GPU都在跑。甚至在yaml文件中删除关于GPU的请求,在docker中都可以运行GPU。 原因: 上例说明alpha.kubernetes.io/nvidia-gpu无效。查看yaml文件,发现该docker开启了特权模式(privileged:ture): 而

GPU池化赋能智能制造

2023年3月10日,“第六届智能工厂高峰论坛”在杭州隆重揭幕。本次会议由e-works数字化企业网、浙江制信科技有限公司主办,中国人工智能学会智能制造专业委员会、长三角新能源汽车产业链联盟、长三角(杭州)制造业数字化能力中心、浙江省智能工厂操作系统技术创新中心协办。趋动科技作为钻石合作伙伴出席了本次峰会,与制造业精英企业以及行业专业人士共同分享制造业在智能工厂推进过程中的成功经验,探讨工厂改进中

【linux 常用命令】查看gpu、显卡常用命令

1.查看显卡基本信息 lspci | grep -i nvidia 2.查看显卡驱动版本 nvidia-smi -a 3.查看gpu使用情况 nvidia-smi (spam) [dongli@dt-gpu-1 train]$ nvidia-smi Fri Sep 27 16:42:33 2019 +----------------------------------------

CUDA:用并行计算的方法对图像进行直方图均衡处理

(一)目的 将所学算法运用于图像处理中。 (二)内容 用并行计算的方法对图像进行直方图均衡处理。 要求: 利用直方图均衡算法处理lena_salt图像 版本1:CPU实现 版本2:GPU实现  实验步骤一 软件设计分析: 数据类型: 根据实验要求,本实验的数据类型为一个256*256*8的整型矩阵,其中元素的值为256*256个0-255的灰度值。 存储方式: 图像在内存中