【问题标题】:CUDA blocking flagsCUDA 阻塞标志
【发布时间】:2018-07-23 14:52:18
【问题描述】:

创建 CUDA 事件时,您可以选择打开 cudaEventBlockingSync 标志。但是 - 如果创建带有或不带有标志的事件之间的区别呢?我read the fine manual;这对我来说没有意义。什么是“调用主机线程”,以及当您使用该标志时什么“阻塞”?

4.6.2.7 cudaError_t cudaEventSynchronize(cudaEvent_t 事件)

阻塞直到事件真正发生 被记录下来。 ... 等待一个 使用创建的事件 cudaEventBlockingSync 标志将导致 调用主机线程阻塞直到 该事件实际上已被记录。

【问题讨论】:

  • OP:我相信 Doug 的回答更清晰,信息量更大。

标签: synchronization cuda


【解决方案1】:

cudaEventBlockingSync 将定义主机将如何等待事件发生。

cudaEventBlockingSync 被设置时,CPU 可以放弃主机线程。即 CPU 将被传递一个不同的线程(可能是一个进程)。主机线程将在稍后重新获取 CPU。通过这种方式,宿主线程不会独占所有的CPU时间,可以允许宿主做其他工作。

cudaEventBlockingSync 未设置时,CPU 将忙于等待,即 CPU 将进入检查事件循环。当这种情况发生时,CPU 只是旋转,寻找要发生的事件。这通常会导致 CPU 性能表显示为 100%。使用这种方法,主机线程独占所有 CPU 时间。

不设置cudaEventBlockingSync 导致从内核执行结束到控制返回线程的最小延迟。您要使用哪个设置取决于内核在做什么。即事件发生需要多长时间,与 CPU 阻塞相关的调度开销有多少。不设置此标志的代价是在等待事件发生时无法执行任何其他 CPU 工作(其他线程)。

【讨论】:

    【解决方案2】:

    当您调用该函数时,线程将停止执行,直到该事件发生,此时程序继续。这是一种确保您了解正在运行的程序状态的方法。这在 CUDA 中尤其重要,因为很多事情都是异步的。

    “调用主机线程”是在 CUDA 设备所在主机的 CPU 上运行的线程。


    编辑以回应以下评论:

    我相信“阻塞同步”和常规同步之间的区别在于线程阻塞并且在事件完成之前不会运行,而不是线程在等待时“旋转”,不断检查值.这意味着线程不会使用任何额外的 CPU 时间旋转,而是会在事件完成后被唤醒。如果您在 CPU 时间非常宝贵或您必须按单位时间付费的服务器上运行此程序,这将非常有用。

    【讨论】:

    • 当然,但是那和没有那个标志的 cudaEventSynchronize 有什么区别?在正常情况下它会阻止什么?
    猜你喜欢
    • 2016-12-14
    • 2017-05-08
    • 1970-01-01
    • 2017-05-17
    • 2020-06-20
    • 2012-02-20
    • 2021-08-19
    • 2013-09-28
    相关资源
    最近更新 更多