问题标签 [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.
cuda - cudaStreamWaitEvent 会阻塞主机吗?
我知道 cudaEventSynchronize 会阻止主机,直到事件被触发。但是,cudaStreamWaitEvent 呢?cudaStreamWaitEvent 将仅阻止指定的流,而主机将继续进行,还是主机也将被阻止?
stream - cudaStreamWaitEvent 似乎没有等待
我正在尝试编写一个小型演示程序,该程序有两个 cuda 流正在进行,并且受事件控制,相互等待。到目前为止,这个程序看起来像这样:
我对 CUDA 流的掌握如下: 流是一种可以添加任务的列表。这些任务是按顺序处理的。所以在我的程序中,我可以放心 streamA 会按顺序
- 调用内核 k_A1
- 触发半A
- 等待有人触发halfB
- 调用内核 k_A2
和streamB会
- 等待有人触发halfA
- 调用内核 k_B1
- 触发半B
- 调用内核 k_B2
通常,两个流可能彼此异步运行。但是,我想阻止 streamB 直到 A1 完成,然后阻止 streamA 直到 B1 完成。
这似乎没有那么简单。在我的带有 Tesla M2090 (CC 2.0) 的 Ubuntu 上,输出
是
我真的希望 B1 在 cudaEventRecord(halfB,streamB) 之前完成。尽管如此,流 A 显然不会等待 B1 的完成,因此也不会等待 halfB 的记录。
更重要的是:如果我完全删除 cudaEventRecord 命令,我希望程序锁定 cudaStreamWait 命令。但它不会产生相同的输出。我在这里俯瞰什么?
cuda - 等待后续流中的事件
我正在尝试使用 CUDA 在 GPU 上实现以下类型的管道:
我有四个流,每个流都有一个 Host2Device 副本、一个内核调用和一个 Device2Host 副本。但是,内核调用必须等待下一个流的 Host2Device 副本完成。
我打算cudaStreamWaitEvent
用于同步。但是,根据文档,这仅cudaEventRecord
在之前为相应事件调用过的情况下才有效。在这种情况下,情况并非如此。
流由单独的 CPU 线程管理,基本上如下所示:
CPU 线程被管理以正确的顺序启动流。因此,cudaStreamWaitEvent
对于流 1 的复制完成事件,在该事件(在流 1 中)之前调用(在流 0cudaEventRecord
中)。这导致功能性无操作。
我觉得不能以这种方式使用事件。是否有另一种方法来实现所需的同步?
顺便说一句,我不能只是颠倒流顺序,因为还有更多的依赖关系。
API调用顺序
根据要求,这是发出 CUDA 调用的顺序:
可以看出,调用 tocudaStreamWaitEvent
总是早于调用 to cudaEventRecord
。
cuda - 如何取消设置 CUDA 事件?
我在主机上有一个处理循环,我在 GPU 流中记录一个事件。然后另一个流等待该事件(等待事件的状态“设置”或“真”)。这个函数(cudaStreamWaitEvent)是否会取消设置这个事件(所以,将其切换为“unset”或“false”)?如果没有,我可以使用什么 CUDA 函数来取消设置此事件?
cuda - 可以从设备端代码触发 CUDA 事件吗?
有没有办法从 CUDA 中的设备内核触发事件(用于基准测试,类似于 CPU 代码中的 cudaEvents)?
例如,假设我想测量从内核启动到第一个启动计算的线程的时间,以及从最后一个离开计算的线程到 CPU 返回的时间。
我可以这样做吗?
c - CUDA中流的非阻塞同步?
是否可以在不阻塞主机的情况下同步两个 CUDA 流?我知道有cudaStreamWaitEvent
,这是非阻塞的。但是使用cudaEventCreate
and来创建和销毁事件呢cudaEventDestroy
?
的文档cudaEventDestroy
说:
如果调用 cudaEventDestroy() 时事件已记录但尚未完成,则该函数将立即返回,并且一旦设备完成事件,与事件相关的资源将自动释放。
我在这里不明白的是记录的事件和完成的事件之间有什么区别。此外,这似乎意味着如果事件尚未记录,则呼叫将被阻塞。
任何人都可以对此有所了解吗?
cuda - cudaEventRecord 是否受当前设备的身份影响?
cudaEventRecord将事件 ID 和流 ID 作为参数。运行时 API 参考并没有说明是否需要将流与当前设备关联 - 我无法测试是否是这种情况,因为我现在可以访问的任何系统上最多只有一个 GPU。
假设它必须是当前设备上的流:
- 如果它在另一台设备上获得流会发生什么?
假设它可以是任何设备上的流:
- 当它获得(当前设备的)默认流的 ID 时会发生什么?毕竟,所有设备的默认流都具有相同的(空)ID?
- 基于流的设备是否是最新的,行为是否有任何差异?
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有错吗?
cuda - cudaEventSynchronize 与 cudaDeviceSynchronize
我是 CUDA 新手,对cudaEvent
. 我现在有一个代码示例,如下所示:
关于这段代码,我有两个问题:
1.最后一个cudaDeviceSynchronize
有必要吗?因为根据 的文档cudaEventSynchronize
,它的功能是等待直到最近一次调用之前的所有设备工作完成cudaEventRecord()
。因此,鉴于我们已经调用了cudaEventSynchronize(stop)
,我们还需要cudaDeviceSynchronize
再次调用吗?
2.上面的代码和下面的实现有什么不同:
cuda - CUDA 流中 CUDA 事件的异步行为
这个问题是关于 CUDA 流 (Stream) 的概念以及记录在流上的 CUDA 事件 (Event) 的明显异常。
考虑以下演示此异常的代码,
由于 Stream 上的所有工作都是顺序的,因此应该发生以下事件序列,
- "
eventStart
" 记录为完整 kernel1
运行并完成- "
eventBetween
" 记录为已完成 kernel2
运行并完成- "
eventEnd
" 记录为已完成
将主机线程与设备同步后, 和 之间所用的时间eventStart
(eventBetween
由 测量cudaEventElapsedTime
)应该是 的运行时间,kernel1
和 之间所用的时间eventBetween
应该eventEnd
是 的运行时间kernel2
。
但根据NVIDIA 关于 的文档cudaStreamWaitEvent
,
使提交到流的所有未来工作等到事件报告完成后再开始执行。
和博文,
您还可以使用 cudaStreamWaitEvent(event) 在特定事件的单个流中同步操作
在同一流上记录事件之后安排的所有工作之前,事件不需要报告完成。这令人惊讶,因为在 Stream 上安排的所有工作都应该以顺序方式运行。
有人可以澄清 Stream 中事件的这种异步行为吗?