AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 77423441
Accepted
msedi
msedi
Asked: 2023-11-05 02:59:52 +0800 CST2023-11-05 02:59:52 +0800 CST 2023-11-05 02:59:52 +0800 CST

流和 asyncEngine 计数如何在 CUDA 中协同工作

  • 772

CUDA 定义了一些参数,我不太确定 CUDA 的行为方式,如果我必须尊重它们,或者如果我不尊重它们,它确实会运行,但可能不会获得最佳性能。

查看时cudaGetDeviceProperties我可以看到一些参数(取自NVidia网站:https ://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__DEVICE.html#group__CUDART__DEVICE_1g1bf9d625a931d657e08db2b4391170f0 :

concurrentKernels:设备可能可以同时执行多个内核

这只是一个标志还是有任何影响?我认为并发内核只有在使用流时才有意义,对吧?(另请参阅 asyncEngineCount)。

asyncEngineCount:异步引擎数量

这是上面给出的可以并行运行的内核数量吗?另外,我认为这只在使用流时才有效,对吗?

这让我想到了一个关于流的更普遍的问题。总共可以使用或分配多少个流?例如,如果asyncEngineCount是 3,那么拥有 3 个以上的流是否有意义?如果我所说的不是真的,那么分配比asyncEngineCount.

如果我分配的流多于 asyncEngineCount 并让多个内核同时运行,会发生什么情况?假设我分配 10 个流并同时运行 10 个内核,但 asyncEngineCount 只有 3 个。CUDA 是否会一次只运行 3 个内核,而其他内核会被阻塞,直到有一个流空闲为止?

我总是将流解释为一个简单的同步对象,当调用 CUDA 异步方法时,该对象不会发出信号,以便其他方法等待该方法退出并且流设置为有信号,但这似乎是我这边的过于简单的解释?

我找不到关于异步执行和流的很好的解释,也许有更深入的见解。CUDA文档似乎没有解释细节。也许网络或书籍上有很好的解释?

cuda
  • 1 1 个回答
  • 22 Views

1 个回答

  • Voted
  1. Best Answer
    Robert Crovella
    2023-11-05T06:05:23+08:002023-11-05T06:05:23+08:00

    这只是一个标志还是有任何影响?

    它是一面旗帜,是能力指标。我认为基本上所有 CUDA GPU 都能够运行并发内核。如果有人遇到不具备该功能的 CUDA GPU,我会感到非常惊讶。

    我认为并发内核只有在使用流时才有意义,对吧?

    是的,要在 CUDA 中安排任何类型的并发(同时发生两个或多个事件),通常需要正确使用流。有一些小的例外,例如主机代码执行和设备代码执行的并发性。

    这是上面给出的可以并行运行的内核数量吗?

    不它不是。cudaMemcpyAsyncCUDA 中的异步引擎可以被认为是 DMA 引擎,并且每当您发出具有异步运行的实际能力的异步数据传输请求(例如)时都需要/使用它。为了使传输异步发生,使用了硬件引擎,该引擎称为异步引擎。异步引擎对于内核活动没有任何用途或影响,除了使用异步引擎将允许例如数据传输活动在内核执行的同时发生,这取决于各种要求和设备容量。

    这让我想到了一个关于流的更普遍的问题。总共可以使用或分配多少个流?例如,如果 asyncEngineCount 为 3,那么拥有超过 3 个流是否有意义?

    可以创建的流数量没有指定的上限。我见过使用 40 多个流的正确设计的代码。流与asyncEngineCount. 如果您创建和使用的流多于设备连接的数量,则流将在设备连接之间分配自身(“别名”),但设备连接也与异步引擎没有明确的关系。

    如果我分配的流多于 asyncEngineCount 并让多个内核同时运行,会发生什么情况?假设我分配 10 个流并同时运行 10 个内核,但 asyncEngineCount 只有 3 个。CUDA 是否会一次只运行 3 个内核,而其他内核会被阻塞,直到有一个流空闲为止?

    不会有什么异常的事情发生。和流之间没有联系asyncEngineCount,也没有可以同时执行的内核数量。并发内核执行取决于与 没有连接的因素和资源asyncEngineCount,并且您当然可以演示不仅仅是asyncEngineCount并发运行的内核,我上次检查时,concurrentKernels示例代码就是这样做的。并发内核数量存在上限/硬件限制(参见表 18),但与异步引擎无关。

    我找不到关于异步执行和流的很好的解释,

    对于一般的 CUDA 学习,我通常推荐这个在线培训系列,并且“CUDA 并发”部分有与此主题相关的信息。该编程指南还有关于 CUDA 中的异步并发执行的扩展部分。

    • 3

相关问题

  • 为什么他们只填充一个共享内存?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve