[CUDA] 设置sync模式cudaSetDeviceFlags

news/2024/11/8 17:42:45 标签: cuda, sync 逻辑

文章目录

  • 1. 设置cuda synchronize的等待模式
  • 2 设置函数
  • 3. streamQuery方式实现stream sync等待逻辑
  • Reference

cuda_synchronize_2">1. 设置cuda synchronize的等待模式

  • 参考资料:https://docs.nvidia.com/cuda/pdf/CUDA_Runtime_API.pdf

cuda的 synchronize等待模式分为: Yield方式, busy waiting方式(spin), blocking方式

  • busy waiting (spin): 是一直占用cpu,属于轮训式等待
  • yield:是让出时间片,将时间片轮空,可能会导致很多切入切出
  • blocking:方式会导致线程阻塞,从而让出cpu,等待stream上的gpu操作结束后,会触发block 的cpu线程/进程,然后恢复执行;但是这个是被动唤醒模式;可能会导致block的cpu恢复产生延迟,从而产生空白时间,导致线程整体执行耗时增加。
    前两个模式,在gpu操作完成后,cpu主线程会及时响应,从而继续往后执行;但是第三个会产生block空隙,如果主线程是FIFO这种实时线程,优先级高且抢占cpu资源,并且CPU资源充足的情况,则block的cpu线程会恢复较快但不排除存在延迟情况。
  • 采用blocking模式后,nsight观察的现象有几个
    - gpu context切换更加频繁了,应该是block阻塞导致的
    - block恢复存在延迟,导致一些空白gpu时间,如下图红色框
    在这里插入图片描述
    在这里插入图片描述

  • 可以设置cuda Stream synchorinze时是释放cpu资源还是把持cpu资源; 根据官方说明默认当gpu 个数大于cpu的时候,因为cpu紧张所以会yield时间片; 但是一般cpu core大于gpu个数;所以会spin on the processor; spin属于轮询等待的一种。

2 设置函数

official doc

  • 在执行函数设置cudaDeviceScheduleBlockingSync的时候,cudaDeviceMapHost可能被同步设置
__host__cudaError_t cudaSetDeviceFlags (unsigned int flags);
// flags:
- cudaDeviceScheduleAuto: 根据GPU和CPU 的个数来选择cudaDeviceScheduleSpin|cudaDeviceScheduleYield
- cudaDeviceScheduleSpin: 轮询方式
- cudaDeviceScheduleYield: 出让时间片方式
- cudaDeviceScheduleBlockingSync:阻塞方式
- cudaDeviceBlockingSync:deprecated
- cudaDeviceMapHost: 
- cudaDeviceLmemResizeToMax: deprecated
- cudaDeviceSyncMemops: 
  • cudaDeviceScheduleAuto: "If C > P, then CUDA will yield to other OS threads when waiting for the device, otherwise CUDA will not yield while waiting for results and actively spin on the processor. 有可能这个context在程序运行过程中会实时变化,导致C>P 那么就会不确定的执行yield
    cudaDeviceScheduleBlockingSync: Instruct CUDA to block the CPU thread on a synchronization primitive when waiting for the device to finish work 另外blocksync和spin还不一样,就是block会进入阻塞态 释放cpu,会被主动唤醒,而spin是把持;虽然都会导致程序wait,但是对硬件的使用情况不一样。

3. streamQuery方式实现stream sync等待逻辑

  • 也可以自己写等待逻辑, 如用thread::yeild或者busy waiting,通过用streamQuery来实现
  • In my experience, you can’t make the CPU activity level lower, if the CPU has nothing else to do, and it is spinning at a CUDA sync point. If you really want to do something like that, my suggestion would be that instead of doing a CUDA device or stream sync, put your GPU work into a stream, and then in a loop you do cudaStreamQuery alternating with an OS command to put the thread to sleep. You decide what level of responsiveness you want/need based on how long you put the CPU thread to sleep."

Reference

  • wiki百科: In computer science and software engineering, busy-waiting, busy-looping or spinning is a technique in which a process repeatedly checks to see if a condition is true, such as whether keyboard input or a lock is available.
    https://en.wikipedia.org/wiki/Busy_waiting#:~:text=In%20computer%20science%20and%20software,or%20a%20lock%20is%20available."

http://www.niftyadmin.cn/n/5744232.html

相关文章

机器学习周报(RNN的梯度消失和LSTM缓解梯度消失公式推导)

文章目录 摘要Abstract 1 RNN的梯度消失问题2 LSTM缓解梯度消失总结 摘要 在深度学习领域,循环神经网络(Recurrent Neural Network, RNN)被广泛应用于处理序列数据,特别是在自然语言处理、时间序列预测等任务中。然而&#xff0c…

Pytorch学习--神经网络--现有网络模型的使用及修改

一、VGG16 weights (Optional[VGG16_Weights]): 这个参数是可选的,指的是预训练的权重。用户可以选择使用不同的预训练权重,具体可参见 VGG16_Weights 的详细说明。默认情况下,如果不提供此参数,模型将不会使用任何预训练权重。 p…

Mysql基础 01 数据与sql

文章目录 一、基本概念二、mysql的常用命令三、sql规范四、数据类型五、SQL语句 一、基本概念 数据库(database,DB):存储数据的仓库。 数据库管理系统软件(Database Management System,DBMS):是一种操作和管理数据库的大型软件。常见的DBMS有oracle、s…

2024.11.4 STM32点灯和简单的数据收发

1.发送函数 HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); 参数1: UART 处理结构体的指针,该结构体包含了 UART 的所有配置参数。 参数2:要发送的数据指针 参数3&…

计算机视觉基础:OpenCV库详解

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 计算机视觉基础:OpenCV库详解 计算机视觉基础:OpenCV库详解 计算机视觉基础:OpenCV库详解 引…

Docker可视化管理面板DPanel的安装

本文软件由网友 rui 推荐; 什么是 DPanel ? DPanel 是一款 Docker 可视化管理面板,旨在简化 Docker 容器、镜像和文件的管理。它提供了一系列功能,使用户能够更轻松地管理和部署 Docker 环境。 软件特点: 可视化管理&…

第一个纯血鸿蒙应用(Napi开发-ArtTS调用C/C++)

1.行业背景 纯血鸿蒙,即鸿蒙Next版已于2014年1月正式发版,鸿蒙生态设备数量已经突破10亿台,已经有超过15000个应用和元服务上架。鸿蒙生态不只是移动设备这么简单,他打造的是一个18n的全场景战略,真正做到了“万物互联…

k8s 上如何跑 Dolphins 模型

接着上一篇的介绍,这一篇就来跑跑 Dolphins 模型,本篇会记录,跑模型常见的阬点。 1 在 k8s 上创建 pod 将外部数据挂载在 pod 里,并申请 gpu 资源。同时修改代码里对应的引入数据的路径 # dolphins.yaml apiVersion: v1 kind: …