问题标签 [cuda-events]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
777 浏览

cuda - cudaStreamWaitEvent 会阻塞主机吗?

我知道 cudaEventSynchronize 会阻止主机,直到事件被触发。但是,cudaStreamWaitEvent 呢?cudaStreamWaitEvent 将仅阻止指定的流,而主机将继续进行,还是主机也将被阻止?

0 投票
1 回答
3233 浏览

stream - cudaStreamWaitEvent 似乎没有等待

我正在尝试编写一个小型演示程序,该程序有两个 cuda 流正在进行,并且受事件控制,相互等待。到目前为止,这个程序看起来像这样:

我对 CUDA 流的掌握如下: 流是一种可以添加任务的列表。这些任务是按顺序处理的。所以在我的程序中,我可以放心 streamA 会按顺序

  1. 调用内核 k_A1
  2. 触发半A
  3. 等待有人触发halfB
  4. 调用内核 k_A2

和streamB会

  1. 等待有人触发halfA
  2. 调用内核 k_B1
  3. 触发半B
  4. 调用内核 k_B2

通常,两个流可能彼此异步运行。但是,我想阻止 streamB 直到 A1 完成,然后阻止 streamA 直到 B1 完成。

这似乎没有那么简单。在我的带有 Tesla M2090 (CC 2.0) 的 Ubuntu 上,输出

我真的希望 B1 在 cudaEventRecord(halfB,streamB) 之前完成。尽管如此,流 A 显然不会等待 B1 的完成,因此也不会等待 halfB 的记录。

更重要的是:如果我完全删除 cudaEventRecord 命令,我希望程序锁定 cudaStreamWait 命令。但它不会产生相同的输出。我在这里俯瞰什么?

0 投票
1 回答
1742 浏览

cuda - 等待后续流中的事件

我正在尝试使用 CUDA 在 GPU 上实现以下类型的管道:

管道

我有四个流,每个流都有一个 Host2Device 副本、一个内核调用和一个 Device2Host 副本。但是,内核调用必须等待下一个流的 Host2Device 副本完成。

我打算cudaStreamWaitEvent用于同步。但是,根据文档,这仅cudaEventRecord在之前为相应事件调用过的情况下才有效。在这种情况下,情况并非如此。

流由单独的 CPU 线程管理,基本上如下所示:

CPU 线程被管理以正确的顺序启动流。因此,cudaStreamWaitEvent对于流 1 的复制完成事件,在该事件(在流 1 中)之前调用(在流 0cudaEventRecord中)。这导致功能性无操作。

我觉得不能以这种方式使用事件。是否有另一种方法来实现所需的同步?

顺便说一句,我不能只是颠倒流顺序,因为还有更多的依赖关系。

API调用顺序

根据要求,这是发出 CUDA 调用的顺序:

可以看出,调用 tocudaStreamWaitEvent总是早于调用 to cudaEventRecord

0 投票
1 回答
435 浏览

cuda - 如何取消设置 CUDA 事件?

我在主机上有一个处理循环,我在 GPU 流中记录一个事件。然后另一个流等待该事件(等待事件的状态“设置”或“真”)。这个函数(cudaStreamWaitEvent)是否会取消设置这个事件(所以,将其切换为“unset”或“false”)?如果没有,我可以使用什么 CUDA 函数来取消设置此事件?

0 投票
2 回答
434 浏览

cuda - 可以从设备端代码触发 CUDA 事件吗?

有没有办法从 CUDA 中的设备内核触发事件(用于基准测试,类似于 CPU 代码中的 cudaEvents)?

例如,假设我想测量从内核启动到第一个启动计算的线程的时间,以及从最后一个离开计算的线程到 CPU 返回的时间。

我可以这样做吗?

0 投票
1 回答
1763 浏览

c - CUDA中流的非阻塞同步?

是否可以在不阻塞主机的情况下同步两个 CUDA 流?我知道有cudaStreamWaitEvent,这是非阻塞的。但是使用cudaEventCreate and来创建和销毁事件呢cudaEventDestroy

文档cudaEventDestroy说:

如果调用 cudaEventDestroy() 时事件已记录但尚未完成,则该函数将立即返回,并且一旦设备完成事件,与事件相关的资源将自动释放。

我在这里不明白的是记录的事件和完成的事件之间有什么区别。此外,这似乎意味着如果事件尚未记录,则呼叫将被阻塞。

任何人都可以对此有所了解吗?

0 投票
1 回答
167 浏览

cuda - cudaEventRecord 是否受当前设备的身份影响?

cudaEventRecord将事件 ID 和流 ID 作为参数。运行时 API 参考并没有说明是否需要将流与当前设备关联 - 我无法测试是否是这种情况,因为我现在可以访问的任何系统上最多只有一个 GPU。

假设它必须是当前设备上的流:

  • 如果它在另一台设备上获得流会发生什么?

假设它可以是任何设备上的流:

  • 当它获得(当前设备的)默认流的 ID 时会发生什么?毕竟,所有设备的默认流都具有相同的(空)ID?
  • 基于流的设备是否是最新的,行为是否有任何差异?
0 投票
0 回答
356 浏览

cuda - 切片在cuda中是什么意思?

我是 cuda 编程的新手。

我必须使用关于我的应用程序的 nvprof 进行 GPU 分析。

我找到了一个指标 l2_subp0_write_sector_misses,它表示从 L2 缓存的 slice 0 发送到 DRAM 的写请求数。

但我不知道切片是什么意思。

正如我猜测的那样,一个切片是一个 sm,因为 Gtx750 有 4 个 sm,并且事件中有 4 个切片(l2_subp0_write_sector_misses,l2_subp1_write_sector_misses,l2_subp2_write_sector_misses,l3_subp0_write_sector_misses)

但是,当我使用 1 个线程测试应用程序时,所有 write_misses 事件都有价值。

我认为如果一个切片是一个 sm,那么只有一个 write_misses 具有价值,而其他的都是 0。

什么是切片?

1个线程使用1个sm有错吗?

0 投票
1 回答
3596 浏览

cuda - cudaEventSynchronize 与 cudaDeviceSynchronize

我是 CUDA 新手,对cudaEvent. 我现在有一个代码示例,如下所示:

关于这段代码,我有两个问题:

1.最后一个cudaDeviceSynchronize有必要吗?因为根据 的文档cudaEventSynchronize,它的功能是等待直到最近一次调用之前的所有设备工作完成cudaEventRecord()。因此,鉴于我们已经调用了cudaEventSynchronize(stop),我们还需要cudaDeviceSynchronize再次调用吗?

2.上面的代码和下面的实现有什么不同:

0 投票
1 回答
263 浏览

cuda - CUDA 流中 CUDA 事件的异步行为

这个问题是关于 CUDA 流 (Stream) 的概念以及记录在流上的 CUDA 事件 (Event) 的明显异常。

考虑以下演示此异常的代码,

由于 Stream 上的所有工作都是顺序的,因此应该发生以下事件序列,

  1. " eventStart" 记录为完整
  2. kernel1运行并完成
  3. " eventBetween" 记录为已完成
  4. kernel2运行并完成
  5. " eventEnd" 记录为已完成

将主机线程与设备同步后, 和 之间所用的时间eventStarteventBetween由 测量cudaEventElapsedTime)应该是 的运行时间,kernel1和 之间所用的时间eventBetween应该eventEnd是 的运行时间kernel2

但根据NVIDIA 关于 的文档cudaStreamWaitEvent

使提交到流的所有未来工作等到事件报告完成后再开始执行。

博文

您还可以使用 cudaStreamWaitEvent(event) 在特定事件的单个流中同步操作

在同一流上记录事件之后安排的所有工作之前,事件不需要报告完成。这令人惊讶,因为在 Stream 上安排的所有工作都应该以顺序方式运行。

有人可以澄清 Stream 中事件的这种异步行为吗?