#pragma once #include #include "ck/ck.hpp" #include "ck/stream_config.hpp" #include "ck/device_utility/hip_check_error.hpp" template float launch_and_time_kernel(const StreamConfig& stream_config, F kernel, dim3 grid_dim, dim3 block_dim, std::size_t lds_byte, Args... args) { #if CK_TIME_KERNEL if(stream_config.time_kernel_) { printf("%s: grid_dim {%d, %d, %d}, block_dim {%d, %d, %d} \n", __func__, grid_dim.x, grid_dim.y, grid_dim.z, block_dim.x, block_dim.y, block_dim.z); const int nrepeat = 10; printf("Warm up 1 time\n"); // warm up kernel<<>>(args...); printf("Start running %d times...\n", nrepeat); hipEvent_t start, stop; hip_check_error(hipEventCreate(&start)); hip_check_error(hipEventCreate(&stop)); hip_check_error(hipDeviceSynchronize()); hip_check_error(hipEventRecord(start, stream_config.stream_id_)); for(int i = 0; i < nrepeat; ++i) { kernel<<>>(args...); } hip_check_error(hipEventRecord(stop, stream_config.stream_id_)); hip_check_error(hipEventSynchronize(stop)); float total_time = 0; hip_check_error(hipEventElapsedTime(&total_time, start, stop)); return total_time / nrepeat; } else { kernel<<>>(args...); return 0; } #else kernel<<>>(args...); return 0; #endif }