#include "image.hpp"
#include "algorithms_gpu.hpp"
#include "algorithms_cpu.hpp"
#include "common.hpp"
#include <iostream>
#include <chrono>
#include <cuda_runtime.h>
#define CUDA_CHECK_ERROR(err) if (err != cudaSuccess) { \
std::cerr << "CUDA error: " << cudaGetErrorString(err) << std::endl; \
exit(EXIT_FAILURE); \
}
int main()
{
Image *image_gpu = load_image_gpu("../../input.png");
Image *image_cpu = load_image_cpu("../../input.png");
Image *image_transfer = load_image_cpu("../../input.png");
transfer_to_gpu(image_transfer);
auto start = std::chrono::high_resolution_clock::now();
convert_to_grayscale_gpu(*image_gpu); cudaError_t err = cudaDeviceSynchronize(); CUDA_CHECK_ERROR(err);
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::milli> elapsed = end - start;
std::cout << "Elapsed time (GPU 1): " << elapsed.count() << " ms" << std::endl;
start = std::chrono::high_resolution_clock::now();
convert_to_grayscale_cpu(*image_cpu);
end = std::chrono::high_resolution_clock::now();
elapsed = end - start;
std::cout << "Elapsed time (CPU): " << elapsed.count() << " ms" << std::endl;
start = std::chrono::high_resolution_clock::now();
convert_to_grayscale_gpu(*image_transfer); err = cudaDeviceSynchronize(); CUDA_CHECK_ERROR(err);
end = std::chrono::high_resolution_clock::now();
elapsed = end - start;
std::cout << "Elapsed time (GPU 2): " << elapsed.count() << " ms" << std::endl;
save_image_gpu("output_gpu.png", image_gpu);
save_image_cpu("output_cpu.png", image_cpu);
save_image_gpu("output_gpu2.png", image_transfer);
std::cout << "came here..." << std::endl;
std::cout << "Images saved." << std::endl;
free_image_gpu(image_gpu);
free_image_cpu(image_cpu);
free_image_gpu(image_transfer);
return 0;
}