Open ysh329 opened 4 years ago
// Memory Object APIs CL_API_ENTRY cl_mem clCreateBuffer(cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_0 { auto func = mace::runtime::OpenCLLibrary::Get()->clCreateBuffer; if (func != nullptr) { MACE_LATENCY_LOGGER(3, "clCreateBuffer"); return func(context, flags, size, host_ptr, errcode_ret); } else { if (errcode_ret != nullptr) *errcode_ret = CL_INVALID_PLATFORM; return nullptr; } } CL_API_ENTRY cl_mem clCreateImage(cl_context context, cl_mem_flags flags, const cl_image_format *image_format, const cl_image_desc *image_desc, void *host_ptr, cl_int *errcode_ret) CL_API_SUFFIX__VERSION_1_2 { auto func = mace::runtime::OpenCLLibrary::Get()->clCreateImage; if (func != nullptr) { MACE_LATENCY_LOGGER(3, "clCreateImage"); return func(context, flags, image_format, image_desc, host_ptr, errcode_ret); } else { if (errcode_ret != nullptr) *errcode_ret = CL_INVALID_PLATFORM; return nullptr; } }
MaceStatus OpenCLAllocator::New(size_t nbytes, void **result) const { if (nbytes == 0) { return MaceStatus::MACE_SUCCESS; } VLOG(3) << "Allocate OpenCL buffer: " << nbytes; if (ShouldMockRuntimeFailure()) { return MaceStatus::MACE_OUT_OF_RESOURCES; } cl_int error; cl::Buffer *buffer = new cl::Buffer(opencl_runtime_->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, nbytes, nullptr, &error); if (error != CL_SUCCESS) { LOG(WARNING) << "Allocate OpenCL Buffer with " << nbytes << " bytes failed because of " << OpenCLErrorToString(error); delete buffer; *result = nullptr; return MaceStatus::MACE_OUT_OF_RESOURCES; } else { *result = buffer; return MaceStatus::MACE_SUCCESS; } } MaceStatus OpenCLAllocator::NewImage(const std::vector<size_t> &image_shape, const DataType dt, void **result) const { MACE_CHECK(image_shape.size() == 2, "Image shape's size must equal 2"); VLOG(3) << "Allocate OpenCL image: " << image_shape[0] << ", " << image_shape[1]; if (ShouldMockRuntimeFailure()) { return MaceStatus::MACE_OUT_OF_RESOURCES; } cl::ImageFormat img_format(CL_RGBA, DataTypeToCLChannelType(dt)); cl_int error; cl::Image2D *cl_image = new cl::Image2D(opencl_runtime_->context(), CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, img_format, image_shape[0], image_shape[1], 0, nullptr, &error); if (error != CL_SUCCESS) { LOG(WARNING) << "Allocate OpenCL image with shape: [" << image_shape[0] << ", " << image_shape[1] << "] failed because of " << OpenCLErrorToString(error); // Many users have doubts at CL_INVALID_IMAGE_SIZE, add some tips. if (error == CL_INVALID_IMAGE_SIZE) { auto max_2d_size = opencl_runtime_->GetMaxImage2DSize(); LOG(WARNING) << "The allowable OpenCL image size is: " << max_2d_size[0] << "x" << max_2d_size[1]; } delete cl_image; *result = nullptr; return MaceStatus::MACE_OUT_OF_RESOURCES; } else { *result = cl_image; return MaceStatus::MACE_SUCCESS; } }
Mace
target_warpper创建Buffer和Image
opencl_allocator创建的New Buffer和New Image
MNN