1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use std::ptr::null_mut;

use crate::bindings::{cudaEventCreate, cudaEventDestroy, cudaEventElapsedTime, cudaEventSynchronize, cudaEvent_t};
use crate::wrapper::status::Status;

#[derive(Debug)]
pub struct CudaEvent(cudaEvent_t);

impl CudaEvent {
    pub fn new() -> Self {
        unsafe {
            let mut inner = null_mut();
            cudaEventCreate(&mut inner as *mut _).unwrap();
            CudaEvent(inner)
        }
    }

    /// Return the elapsed time since `start` _in seconds_.
    pub fn time_elapsed_since(&self, start: &CudaEvent) -> f32 {
        unsafe {
            let mut result: f32 = 0.0;
            cudaEventElapsedTime(&mut result as *mut _, start.inner(), self.inner()).unwrap();
            result / 1000.0
        }
    }

    pub fn synchronize(&self) {
        unsafe { cudaEventSynchronize(self.inner()).unwrap() }
    }

    pub unsafe fn inner(&self) -> cudaEvent_t {
        self.0
    }
}

impl Drop for CudaEvent {
    fn drop(&mut self) {
        unsafe { cudaEventDestroy(self.0).unwrap_in_drop() }
    }
}