Во-первых, если это для рабочего кода, вы можете захотеть сделать что-то между вторым cudaEventRecord и cudaEventSynchronize ().В противном случае это может снизить способность вашего приложения перекрывать работу графического процессора и процессора.
Далее я бы отделил создание и удаление событий от записи событий.Я не уверен в стоимости, но в общем случае вы можете не захотеть часто вызывать 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;
};
Примечание Iне включает cudaSetDevice () - мне кажется, что следует оставить код, который использует этот класс, чтобы сделать его более гибким.Пользователь должен убедиться, что одно и то же устройство активно при вызове запуска и останова.
PS: NVIDIA не намерена полагаться на CUTIL для производственного кода - оно используется просто для удобства в нашемпримеры и не так тщательно протестированы или оптимизированы, как сами библиотеки CUDA и компиляторы.Я рекомендую вам распаковать такие вещи, как cutilSafeCall (), в свои собственные библиотеки и заголовки.