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

相关文章

Apple - Media Playback Programming Guide

本文翻译整理自:Media Playback Programming Guide(Updated: 2018-01-16 https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/MediaPlaybackGuide/Contents/Resources/en.lproj/Introduction

GPU集群搭建-IDC要求

高性能GPU服务器集群对于IDC(Internet Data Center)的配电环境有特定的要求,主要涉及到电力供应的稳定性和冗余性、电力质量、以及冷却系统等几个关键方面: 1. **高功率密度**:GPU服务器因执行密集型计算任务,如人工智能、深度学习和高性能计算,往往消耗较大的电能。因此,IDC需要提供高功率密度的机架,通常每个机架的功率范围可达10kW到50kW甚至更高,以满足这些服务器

GPU系列2

GPU孙泽简单命令

GPU系列1

【服务器bilibili】 netsarang进入官网 输入指令: python #进入python编译环境 import tensorflow as tf tf.version #查看tersorflow版本 tf.test.is_gpu_available() #查看tf是否支持GPU 如显示最后为True,表示支持 传输文件–Xftp 推荐压缩为zip格式 传输快 e.g:xx.zip

NVIDIA GPU参数

NVIDIA作为全球领先的GPU制造商,其产品广泛应用于深度学习、机器学习、高性能计算(HPC)和图形计算等领域。以下是NVIDIA一系列GPU的性能参数概述: V100 Tensor Core GPU V100是NVIDIA的一款高性能GPU,专为深度学习、机器学习和高性能计算应用而设计。它具有32GB内存,支持半精度(FP16)和单精度(FP32)计算,可提供高吞吐量和低延迟的计算性能。V

pytorch 使用GPU加速常见的问题

pytorch如何使用gpu加速 print(torch.cuda.is_available())# 设置gpu设备device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')# net使用GPUnet.to(device)# 数据copy到gpuinputData = inputData.to(devi

【深度学习系列】全面指南:安装TensorFlow的CPU和GPU版本

本博客旨在为初学者提供一份全面的指南,介绍如何根据个人电脑的配置选择并安装适合的TensorFlow版本。内容涵盖了如何查看电脑显卡型号以确定是安装CPU还是GPU版本的TensorFlow,创建Python虚拟环境,以及使用conda命令查找可用的TensorFlow版本。同时,文章还提供了安装过程中可能遇到的问题及其解决方法,确保读者能够顺利完成安装过程,并开始他们的机器学习或深度学习项目。

【Rust日报】2020-10-23 - rust-gpu v0.1发布,尝试让Rust成为GPU编程的一等语言

rust-gpu v0.1发布,尝试让Rust成为GPU编程的一等语言 纵观游戏开发的历史,离不开GPU编程,其中最为重要的一个概念是Sharder language,即着色器语言。如今主流的着色器语言主要有三种: 基于 OpenGL 的 OpenGL Shading Language,简称 GLSL;基于 微软DirectX 的 High Level Shading Language,简称 H

pytorch [GPU版] 安装教程 torch is_available() false 解决

安装GPU torch 踩坑 基础环境 Python 3.12.0 CUDA Version: 12.2 验证 import torchprint(torch.cuda.is_available())x = torch.rand(5, 3)print(x)结果Truetensor([[0.7078, 0.8994, 0.3168],[0.6900, 0.3825, 0.5802]

Ubuntu使用 NVIDIA GPU 和 CUDA 设置 LLM 的训练、微调和推理

0.引言 近年来,人工智能领域取得了令人瞩目的进步,其核心是图形处理单元(GPU)和并行计算平台的强大组合。 大模型如 GPT、BER能够理解和生成具有前所未有的流畅性和连贯性的类人文本。然而,训练这些模型需要大量的数据和计算资源,因此 GPU 和 CUDA 是这一努力中不可或缺的工具。 这个博客演示了在 Ubuntu 上设置 NVIDIA GPU 的过程,涵盖 NVIDIA 驱动程序、CUDA