gpt4 book ai didi

timer - 使用事件计时 CUDA 应用程序

转载 作者:行者123 更新时间:2023-12-04 16:22:40 31 4
gpt4 key购买 nike

我使用以下两个函数来计时我的代码(包括多 GPU、同一 GPU 上的并发内核、内核的顺序执行等)的不同部分(cudaMemcpyHtoD、内核执行、cudaMemcpyDtoH)。据我了解,这些函数会记录事件之间耗时,但我猜在代码的生命周期内插入事件可能会导致开销和不准确。我想听听批评、改进这些功能的一般建议,并就它们提出警告。

//Create event and start recording
cudaEvent_t *start_event(int device, cudaEvent_t *events, cudaStream_t streamid=0)
{
cutilSafeCall( cudaSetDevice(device) );
cutilSafeCall( cudaEventCreate(&events[0]) );
cutilSafeCall( cudaEventCreate(&events[1]) );
cudaEventRecord(events[0], streamid);

return events;
}

//Return elapsed time and destroy events
float end_event(int device, cudaEvent_t *events, cudaStream_t streamid=0)
{

float elapsed = 0.0;
cutilSafeCall( cudaSetDevice(device) );
cutilSafeCall( cudaEventRecord(events[1], streamid) );
cutilSafeCall( cudaEventSynchronize(events[1]) );
cutilSafeCall( cudaEventElapsedTime(&elapsed, events[0], events[1]) );

cutilSafeCall( cudaEventDestroy( events[0] ) );
cutilSafeCall( cudaEventDestroy( events[1] ) );

return elapsed;
}

用法:
cudaEvent_t *events;
cudaEvent_t event[2]; //0 for start and 1 for end
...
events = start_event( cuda_device, event, 0 );
<Code to time>
printf("Time taken for the above code... - %f secs\n\n", (end_event(cuda_device, events, 0) / 1000) );

最佳答案

首先,如果这是用于生产代码,您可能希望能够在第二个 cudaEventRecord 和 cudaEventSynchronize() 之间做一些事情。否则,这可能会降低您的应用重叠 GPU 和 CPU 工作的能力。

接下来,我会将事件创建和销毁与事件记录分开。我不确定成本,但通常您可能不想经常调用 cudaEventCreate 和 cudaEventDestroy。

我要做的是创建一个这样的类

class EventTimer {
public:
EventTimer() : mStarted(false), mStopped(false) {
cudaEventCreate(&mStart);
cudaEventCreate(&mStop);
}
~EventTimer() {
cudaEventDestroy(mStart);
cudaEventDestroy(mStop);
}
void start(cudaStream_t s = 0) { cudaEventRecord(mStart, s);
mStarted = true; mStopped = false; }
void stop(cudaStream_t s = 0) { assert(mStarted);
cudaEventRecord(mStop, s);
mStarted = false; mStopped = true; }
float elapsed() {
assert(mStopped);
if (!mStopped) return 0;
cudaEventSynchronize(mStop);
float elapsed = 0;
cudaEventElapsedTime(&elapsed, mStart, mStop);
return elapsed;
}

private:
bool mStarted, mStopped;
cudaEvent_t mStart, mStop;
};

注意我没有包含 cudaSetDevice()——在我看来应该留给使用这个类的代码,以使其更灵活。用户必须确保在调用 start 和 stop 时同一设备处于事件状态。

PS:NVIDIA 的意图并不是让 CUTIL 依赖于生产代码——它只是为了我们示例中的方便而使用,并没有像 CUDA 库和编译器本身那样经过严格的测试或优化。我建议您将 cutilSafeCall() 之类的内容提取到您自己的库和 header 中。

关于timer - 使用事件计时 CUDA 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6959213/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com