CPU端多进程/多线程调用CUDA是否可以加速???
相关:
NVIDIA显卡cuda的多进程服务——MPS(Multi-Process Service)
tensorflow1.x——如何在C++多线程中调用同一个session会话
tensorflow1.x——如何在python多线程中调用同一个session会话
=============================================
CUDA程序运行中CPU端一般叫做host,GPU端一般叫做Device。
需要提前知道的内容:
1. CPU端对计算资源进行划分的单位为进程,GPU端对计算资源进行划分的单位为context。多核心CPU可以同一时刻多个进程/线程并发执行,GPU一个时刻只允许一个context允许,也就是说GPU端一个时刻只允许被CPU端的一个进程所调用执行(没开启mps的情况下)。
2. 一个CPU端的一个调用CUDA的进程在GPU上可以有一个或多个context。如果CPU端某个进程调用的cuda代码是runtime api级别的,那么在GPU上该进程对应的context只有一个;如果CPU端进程调用的cuda代码是driver api级别的,那么在GPU上该进程对应的context可以有多个。但是需要注意不论CPU端进行调用的进程所对应的GPU端的context有一个还是多个,GPU上一个时刻只能运行一个context。
3. 由于GPU在一个时刻只能运行一个context,但是往往一个context的运行并不能使整个GPU计算资源得到利用,所以nvidia推出了mps服务。mps服务可以把同一个用户名下的多个CPU进程所对应的GPU端的多个context融合成一个context,这样一个GPU在开启mps服务后虽然依然是一个时刻只能运行一个context,但是此时的context是多个CPU端进程所对应的多个context融合成的,那么此时一个时刻下就可以运行多个之前的同用户的多个进程所对应的context,这样就能同时刻多个kernel运行,提高GPU的利用效率。
4. CPU端同一进程下的多个线程同时刻并发调用GPU端的同一个context,此时GPU端在同一个context下是否能同时刻运行多个cuda调用就需要看此时的多个cuda调用是否在同一个steam队列中。一般情况下cuda代码中都是默认使用一个stream队列,因此即使CPU端多线程同时调用cuda最终也只能对请求进行排队运行。如果cuda代码中明确把多线程的调用操作写为不同stream队列,那么便可实现GPU端同时刻下多个kernel的运行。
5. CPU端一个进程(单进程单线程)内对多个kernel进行异步调用,并且这些kernel的操作都是写在了不同的stream队列中,并且这个cuda代码(.cu文件)使用 --default-stream per-thread 参数进行nvcc的编译。(参考:https://developer.nvidia.com/blog/gpu-pro-tip-cuda-7-streams-simplify-concurrency/)
在GPU端默认一个时刻下只能运行一个kernel,但是有三种情况除外:
一,是开启了mps服务后同用户的多个进程调用可以同时刻在GPU上运行,实现kernel的并发执行;
二,是一个进程的多个线程调用写明不同stream队列的kernel操作,并且代码使用 --default-stream per-thread 参数进行nvcc的编译。
三,是一个进程(单线程)异步调用写明不同stream队列的kernel操作,并且代码使用 --default-stream per-thread 参数进行nvcc的编译。
不过这三种方式都有极大的缺点,开启mps服务后显卡只能被单个用户所独占,只有该用户的所有cuda任务结束释放掉所有GPU资源后才可以给其他用户调用该显卡的cuda;将cuda操作写为多个stream队列往往需要额外的编码开销,该种方式比较适合小规模的开发任务,对于一些大型的cuda计算框架难以实现,比如TensorFlow、pytorch等基本都没有实现cuda调用的多stream操作。因为CPU端多进程/多线程调用CUDA并发的一些限制(写明不同的stream队列以及编译时的参数指定等),现在几乎所有的CUDA应用都是单进程单线程调用cuda并且kernel排队运行,也就是说绝大部分的cuda应用都是同一个时刻只有一个cpu线程可以调用GPU端的CUDA(一个时刻只有一个kernel在运行),而一个GPU端的多个CPU进程的调用都是通过分时系统进行的。
不论GPU端是否可以多kernel并发,HOST和Device间的数据传输在一个时刻下都只能是单个操作,也就是说一个时刻下host端向device的数据传输只能是一个cuda调用,但是在host向device传输数据的同时device可以向host同时传输数据,同理同一时刻下device向host传输数据也只能是以cuda操作,不论GPU端的cuda操作是否有多个stream队列,单向的数据传输都是不能并发的。
CPU端同时刻可以运行同进程的多个线程,GPU端同时刻只能运行一个context。在mps没有开启的情况下,如果GPU端一个context内的多个kernel操作写在不同stream队列中并且加入特定编译参数才可以实现GPU端的多kernel并发。
回答题目中的问题:CPU端多进程/多线程调用CUDA是否可以加速???
GPU的cuda同时刻实现多kernel并发执行往往需要很多的限制(多进程下mps服务开启,单进程下写明不同的stream队列并加入特定编译参数),因此调用cuda的一些编程框架并不会实现多kernel的并发操作,不过对于一些灵活性大适用面较窄的应用场景(小型应用)多kernel并发执行还是可以很好的提高cuda程序运行效率的。
参考:
https://www.cnblogs.com/LLW-NEU/p/16219611.html
https://blog.csdn.net/bocai1215/article/details/126334295
https://blog.csdn.net/qq_38574198/article/details/108773443
http://cn.voidcc.com/question/p-ziefextv-bgv.html
https://download.csdn.net/download/programmermw/8850951
https://developer.download.nvidia.com/CUDA/training/StreamsAndConcurrencyWebinar.pdf
==========================================
CPU端多进程/多线程调用CUDA是否可以加速???的更多相关文章
- 奉献pytorch 搭建 CNN 卷积神经网络训练图像识别的模型,配合numpy 和matplotlib 一起使用调用 cuda GPU进行加速训练
1.Torch构建简单的模型 # coding:utf-8 import torch class Net(torch.nn.Module): def __init__(self,img_rgb=3,i ...
- Python 多进程 多线程 协程 I/O多路复用
引言 在学习Python多进程.多线程之前,先脑补一下如下场景: 说有这么一道题:小红烧水需要10分钟,拖地需要5分钟,洗菜需要5分钟,如果一样一样去干,就是简单的加法,全部做完,需要20分钟:但是, ...
- Python-网络编程和多进程多线程开发
网络编程 osi7层模型 以通过访问网站发送请求数据为例,每一层会做如下的事情 应用层:规定数据的格式. "GET /s?wd=你好 HTTP/1.1\r\nHost:www.baidu.c ...
- [转帖]Windows和Linux对决(多进程多线程)
Windows和Linux对决(多进程多线程) https://blog.csdn.net/world_2015/article/details/44920467 太长了 还没看完.. 还是没太理解好 ...
- 【原创】uwsgi中多进程+多线程原因以及串行化accept() - thunder_lock说明
如有不对,请详细指正. 最近再研究uwsgi如何部署python app,看uwsgi的文档,里面有太多的参数,但每个参数的解释太苍白,作为菜鸟的我实在是不懂.想搞清楚uwsgi的工作原因以及里面的一 ...
- python爬虫入门八:多进程/多线程
什么是多线程/多进程 引用虫师的解释: 计算机程序只不过是磁盘中可执行的,二进制(或其它类型)的数据.它们只有在被读取到内存中,被操作系统调用的时候才开始它们的生命期. 进程(有时被称为重量级进程)是 ...
- Linux网络通信(TCP套接字编写,多进程多线程版本)
预备知识 源IP地址和目的IP地址 IP地址在上一篇博客中也介绍过,它是用来标识网络中不同主机的地址.两台主机进行通信时,发送方需要知道自己往哪一台主机发送,这就需要知道接受方主机的的IP地址,也就是 ...
- gdb常用命令及使用gdb调试多进程多线程程序
一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...
- python采用 多进程/多线程/协程 写爬虫以及性能对比,牛逼的分分钟就将一个网站爬下来!
首先我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是CPU,承担了所有的计算任务.一个CPU,在一个时间切片里只能运行一个程序. 从操作系统的角度: 进程和线程,都 ...
- 也说性能测试,顺便说python的多进程+多线程、协程
最近需要一个web系统进行接口性能测试,这里顺便说一下性能测试的步骤吧,大概如下 一.分析接口频率 根据系统的复杂程度,接口的数量有多有少,应该优先对那些频率高,数据库操作频繁的接口进行性能测试,所以 ...
随机推荐
- Vue学习:17.组件通信案例-记事本
通过上一节的学习,我们了解并掌握了组件通信的定义及一般使用.那么接下来,我们将之前练习过的案例使用组件化思想来实现一下吧. 实例:记事本(组件化) 实现功能 运用组件化思想,实现Vue学习:3.V标签 ...
- python批量读取excel csv文件插入mysql数据库
#python批量读取excel csv文件插入mysql数据库 import os import csv import argparse import pymysql import sys clas ...
- 通俗理解GAN -- 基础认知
Smiling & Weeping ---- 你已春风摇曳,我仍一身旧雪 1.GAN的基本思想 GAN全称对抗生成网络,顾名思义是生成模型的一种,而他的训练则是一种对抗博弈状态中的.下面我们举 ...
- [代码]C语言进行md5,SHA256,SHA512加密
前言 原本在学puppet,它的user资源需要设置hash后的散列值,结果-我把加密算法,shadow文件,密码破解搞了个遍- 环境 CentOS7 gcc编译器 /etc/shadow文件解析 文 ...
- 实验10.3层vlan互通实验
# 实验10.三层Vlan互通实验 本实验是跨vlan路由的第二种形式,比第一种形式更常见常用一些. 需要用到三层交换机. 实验组 交换机配置 不同于以往,本次的交换机使用了三层交换的功能 SW vl ...
- Linux设备模型:6、Bus
作者:wowo 发布于:2014-4-15 19:21 分类:统一设备模型 原创文章,转发请注明出处.蜗窝科技,www.wowotech.net. 概述 在Linux设备模型中,Bus(总线)是一类特 ...
- TI AM64x工业开发板硬件说明书(双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F,主频1GHz)
前 言 本文主要介绍TL64x-EVM评估板硬件接口资源以及设计注意事项等内容. 创龙科技TL64x-EVM是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 + 单/四核C ...
- C#开发一个混合Windows服务和Windows窗体的程序
很多时候,我们希望服务程序可以直接运行,或者可以响应一些参数,这时候,混合Windows服务和Windows窗体的程序就排上用场了.要实现同时支持Windows服务和Windows窗体,需要在启动的第 ...
- 解码技术债:AI代码助手与智能体的革新之道
技术债 技术债可能来源于多种原因,比如时间压力.资源限制.技术选型不当等.它可以表现为代码中的临时性修补.未能彻底解决的设计问题.缺乏文档或测试覆盖等.虽然技术债可以帮助快速推进项目进度,但长期来看, ...
- yb课堂 新版VueCli 4.3创建vue项目,Vue基础语法入门 《二十九》
Vue模版语法开发起步 基于HTML的模版语法,允许声明式地将DOM绑定至底层Vue实例的数据 用简洁的模版语法来声明式的将数据渲染进DOM的系统 结合响应系统,在应用状态改变时,Vue能够智能地计算 ...