我是 CUDA 的新手,对cudaEvent. 我现在有一个代码示例,如下所示:
float elapsedTime;
cudaEvent_t start, stop;
CUDA_ERR_CHECK(cudaEventCreate(&start));
CUDA_ERR_CHECK(cudaEventCreate(&stop));
CUDA_ERR_CHECK(cudaEventRecord(start));
// Kernel functions go here ...
CUDA_ERR_CHECK(cudaEventRecord(stop));
CUDA_ERR_CHECK(cudaEventSynchronize(stop));
CUDA_ERR_CHECK(cudaEventElapsedTime(&elapsedTime, start, stop));
CUDA_ERR_CHECK(cudaDeviceSynchronize());
Run Code Online (Sandbox Code Playgroud)
我对这段代码有两个问题:
1.最后一个cudaDeviceSynchronize有必要吗?因为根据 的文档cudaEventSynchronize,其功能是等待直到最近一次调用之前的所有设备工作完成cudaEventRecord()。既然我们已经打电话了cudaEventSynchronize(stop),还需要再打电话吗cudaDeviceSynchronize?
2.上面的代码与下面的实现相比有什么不同:
#include <chrono>
auto tic = std::chrono::system_clock::now();
// Kernel functions go here ...
CUDA_ERR_CHECK(cudaDeviceSynchronize());
auto toc = std::chrono::system_clock:now();
float elapsedTime = std::chrono::duration_cast < std::chrono::milliseconds > (toc - tic).count() * 1.0;
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个小型演示程序,该程序具有两个正在运行的cuda流,并受事件控制,彼此等待。到目前为止,该程序如下所示:
// event.cu
#include <iostream>
#include <cstdio>
#include <cuda_runtime.h>
#include <cuda.h>
using namespace std;
__global__ void k_A1() { printf("\tHi! I am Kernel A1.\n"); }
__global__ void k_B1() { printf("\tHi! I am Kernel B1.\n"); }
__global__ void k_A2() { printf("\tHi! I am Kernel A2.\n"); }
__global__ void k_B2() { printf("\tHi! I am Kernel B2.\n"); }
int main()
{
cudaStream_t streamA, streamB;
cudaEvent_t halfA, halfB;
cudaStreamCreate(&streamA);
cudaStreamCreate(&streamB);
cudaEventCreate(&halfA);
cudaEventCreate(&halfB);
cout << "Here is the plan:" << endl <<
"Stream A: A1, launch …Run Code Online (Sandbox Code Playgroud) 我知道cudaEventSynchronize将阻止主机,直到事件被触发.但是,cudaStreamWaitEvent怎么样?cudaStreamWaitEvent是否仅阻止指定的流,而主机将继续,或者主机也将被阻止?
是否可以在不阻塞主机的情况下同步两个CUDA流?我知道有cudaStreamWaitEvent,它是非阻塞的。但是使用cudaEventCreate
和创建和破坏事件呢cudaEventDestroy?
该文档的cudaEventDestroy说:
如果调用cudaEventDestroy()时已记录事件但尚未完成事件,则该函数将立即返回,并且一旦设备完成事件,与事件关联的资源将自动释放。
我不明白的是,已记录事件和已完成事件之间有什么区别。同样,这似乎意味着如果尚未记录该事件,则呼叫正在阻塞。
任何人都可以对此有所了解吗?