Add support for memory pool management for vaapi surfaces and vaapi-hip interops (#17)

* Add support for memory pool management for vaapi surfaces

* reuse memories for each channel if the sizes remain unchanged

* rename hip_interop to hip_interop_dev_mem
Tá an tiomantas seo le fáil i:
Aryan Salmanpour
2024-04-22 14:37:45 -04:00
tiomanta ag GitHub
tuismitheoir 6aaca70cd9
tiomantas 694a4bc07f
D'athraigh 5 comhad le 324 breiseanna agus 220 scriosta
+22 -12
Féach ar an gComhad
@@ -302,6 +302,7 @@ int main(int argc, char **argv) {
uint32_t widths[ROCJPEG_MAX_COMPONENT] = {};
uint32_t heights[ROCJPEG_MAX_COMPONENT] = {};
uint32_t channel_sizes[ROCJPEG_MAX_COMPONENT] = {};
uint32_t prior_channel_sizes[ROCJPEG_MAX_COMPONENT] = {};
uint32_t num_channels = 0;
int total_images = 0;
double time_per_image_all = 0;
@@ -459,9 +460,16 @@ int main(int argc, char **argv) {
std::cout << "Unknown output format!" << std::endl;
return EXIT_FAILURE;
}
// allocate memory for each channel
// allocate memory for each channel and reuse them if the sizes remain unchanged for a new image.
for (int i = 0; i < num_channels; i++) {
CHECK_HIP(hipMalloc(&output_image.channel[i], channel_sizes[i]));
if (prior_channel_sizes[i] != channel_sizes[i]) {
if (output_image.channel[i] != nullptr) {
CHECK_HIP(hipFree((void *)output_image.channel[i]));
output_image.channel[i] = nullptr;
}
CHECK_HIP(hipMalloc(&output_image.channel[i], channel_sizes[i]));
}
}
std::cout << "info: decoding started, please wait! ... " << std::endl;
@@ -503,14 +511,6 @@ int main(int argc, char **argv) {
SaveImage(image_save_path, &output_image, widths[0], heights[0], subsampling, output_format);
}
for (int i = 0; i < num_channels; i++) {
if (output_image.channel[i] != nullptr) {
CHECK_HIP(hipFree((void*)output_image.channel[i]));
output_image.channel[i] = nullptr;
output_image.pitch[i] = 0;
}
}
std::cout << "info: average processing time per image (ms): " << time_per_image_in_milli_sec << std::endl;
std::cout << "info: average images per sec: " << 1000 / time_per_image_in_milli_sec << std::endl;
@@ -521,6 +521,16 @@ int main(int argc, char **argv) {
mpixels_all += image_size_in_mpixels;
}
counter++;
for (int i = 0; i < ROCJPEG_MAX_COMPONENT; i++) {
prior_channel_sizes[i] = channel_sizes[i];
}
}
for (int i = 0; i < num_channels; i++) {
if (output_image.channel[i] != nullptr) {
CHECK_HIP(hipFree((void *)output_image.channel[i]));
output_image.channel[i] = nullptr;
}
}
if (is_dir) {
@@ -530,8 +540,8 @@ int main(int argc, char **argv) {
std::cout << "info: total decoded images: " << total_images << std::endl;
if (total_images) {
std::cout << "info: average processing time per image (ms): " << time_per_image_all << std::endl;
std::cout << "info: average decoded images per sec: " << images_per_sec << std::endl;
std::cout << "info: average decoded image_size_in_mpixels per sec: " << mpixels_per_sec << std::endl;
std::cout << "info: average decoded images per sec (Images/Sec): " << images_per_sec << std::endl;
std::cout << "info: average decoded images size (Mpixels/Sec): " << mpixels_per_sec << std::endl;
}
std::cout << std::endl;
}