diff --git a/lite/core/memory.h b/lite/core/memory.h index c80c8fb6b6e1356ebfa52920a8ee39f61ed20692..872cfd120ca0db889ec6cacebcba1431dafc931b 100644 --- a/lite/core/memory.h +++ b/lite/core/memory.h @@ -13,6 +13,7 @@ // limitations under the License. #pragma once +#include #include #include "lite/api/paddle_place.h" #include "lite/core/target_wrapper.h" @@ -140,20 +141,21 @@ class Buffer { #ifdef LITE_WITH_OPENCL template void ResetLazyImage2D(TargetType target, - const size_t img_w, - const size_t img_h, + const size_t img_w_req, + const size_t img_h_req, void* host_ptr = nullptr) { - if (target != target_ || cl_image2d_width_ < img_w || - cl_image2d_height_ < img_h || host_ptr != nullptr) { + if (target != target_ || cl_image2d_width_ < img_w_req || + cl_image2d_height_ < img_h_req || host_ptr != nullptr) { CHECK_EQ(own_data_, true) << "Can not reset unowned buffer."; + cl_image2d_width_ = std::max(cl_image2d_width_, img_w_req); + cl_image2d_height_ = std::max(cl_image2d_height_, img_h_req); Free(); - data_ = TargetWrapperCL::MallocImage(img_w, img_h, host_ptr); + data_ = TargetWrapperCL::MallocImage( + cl_image2d_width_, cl_image2d_height_, host_ptr); target_ = target; - space_ = sizeof(T) * img_w * img_h * + space_ = sizeof(T) * cl_image2d_width_ * cl_image2d_height_ * 4; // un-used for opencl Image2D, 4 for RGBA, cl_use_image2d_ = true; - cl_image2d_width_ = img_w; - cl_image2d_height_ = img_h; } } #endif diff --git a/lite/core/memory_test.cc b/lite/core/memory_test.cc index cd9062afca7fbf05ef639fed34c50bdf8ee3cb7a..6343854db2b75f7db1fff852056f3c4d86a48c85 100644 --- a/lite/core/memory_test.cc +++ b/lite/core/memory_test.cc @@ -28,6 +28,12 @@ TEST(memory, test) { ASSERT_TRUE(buf_cuda); TargetFree(TARGET(kCUDA), buf_cuda); #endif + +#ifdef LITE_WITH_OPENCL + auto* buf_cl = TargetMalloc(TARGET(kOpenCL), 10); + ASSERT_TRUE(buf_cl); + TargetFree(TARGET(kOpenCL), buf_cl); +#endif } } // namespace lite