pd_tensor.cc 3.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include <algorithm>
F
flame 已提交
16 17 18
#include <cstdlib>
#include <cstring>
#include <memory>
19 20
#include <vector>
#include "paddle/fluid/inference/capi/c_api_internal.h"
F
flame 已提交
21
#include "paddle/fluid/inference/capi/paddle_c_api.h"
22

F
flame 已提交
23
using paddle::ConvertToACPrecision;
24 25 26 27 28 29 30 31 32 33 34
using paddle::ConvertToPaddleDType;
using paddle::ConvertToPDDataType;

extern "C" {
// PaddleTensor
PD_Tensor* PD_NewPaddleTensor() { return new PD_Tensor; }

void PD_DeletePaddleTensor(PD_Tensor* tensor) {
  if (tensor) {
    delete tensor;
    tensor = nullptr;
35
    VLOG(3) << "PD_Tensor delete successfully. ";
36 37 38 39
  }
}

void PD_SetPaddleTensorName(PD_Tensor* tensor, char* name) {
40
  PADDLE_ENFORCE_NOT_NULL(tensor);
41 42 43 44
  tensor->tensor.name = std::string(name);
}

void PD_SetPaddleTensorDType(PD_Tensor* tensor, PD_DataType dtype) {
45
  PADDLE_ENFORCE_NOT_NULL(tensor);
46 47 48 49
  tensor->tensor.dtype = paddle::ConvertToPaddleDType(dtype);
}

void PD_SetPaddleTensorData(PD_Tensor* tensor, PD_PaddleBuf* buf) {
50
  PADDLE_ENFORCE_NOT_NULL(tensor);
51 52 53 54
  tensor->tensor.data = buf->buf;
}

void PD_SetPaddleTensorShape(PD_Tensor* tensor, int* shape, int size) {
55
  PADDLE_ENFORCE_NOT_NULL(tensor);
56 57 58 59
  tensor->tensor.shape.assign(shape, shape + size);
}

const char* PD_GetPaddleTensorName(const PD_Tensor* tensor) {
60
  PADDLE_ENFORCE_NOT_NULL(tensor);
61 62 63 64
  return tensor->tensor.name.c_str();
}

PD_DataType PD_GetPaddleTensorDType(const PD_Tensor* tensor) {
65
  PADDLE_ENFORCE_NOT_NULL(tensor);
66 67 68 69
  return ConvertToPDDataType(tensor->tensor.dtype);
}

PD_PaddleBuf* PD_GetPaddleTensorData(const PD_Tensor* tensor) {
70
  PADDLE_ENFORCE_NOT_NULL(tensor);
71 72 73 74 75 76
  PD_PaddleBuf* ret = PD_NewPaddleBuf();
  ret->buf = tensor->tensor.data;
  return ret;
}

int* PD_GetPaddleTensorShape(const PD_Tensor* tensor, int** size) {
77
  PADDLE_ENFORCE_NOT_NULL(tensor);
78 79 80 81 82 83
  std::vector<int> shape = tensor->tensor.shape;
  int s = shape.size();
  *size = &s;
  return shape.data();
}

F
flame 已提交
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
PD_ZeroCopyTensor* PD_NewZeroCopyTensor() {
  auto* tensor = new PD_ZeroCopyTensor;
  PD_InitZeroCopyTensor(tensor);
  return tensor;
}
void PD_DeleteZeroCopyTensor(PD_ZeroCopyTensor* tensor) {
  if (tensor) {
    PD_DestroyZeroCopyTensor(tensor);
    delete tensor;
  }
  tensor = nullptr;
}

void PD_InitZeroCopyTensor(PD_ZeroCopyTensor* tensor) {
  std::memset(tensor, 0, sizeof(PD_ZeroCopyTensor));
}

void PD_DestroyZeroCopyTensor(PD_ZeroCopyTensor* tensor) {
#define __PADDLE_INFER_CAPI_DELETE_PTR(__ptr) \
  if (__ptr) {                                \
    std::free(__ptr);                         \
    __ptr = nullptr;                          \
  }

  __PADDLE_INFER_CAPI_DELETE_PTR(tensor->data.data);
  __PADDLE_INFER_CAPI_DELETE_PTR(tensor->shape.data);
  __PADDLE_INFER_CAPI_DELETE_PTR(tensor->lod.data);

#undef __PADDLE_INFER_CAPI_DELETE_PTR
}

115
}  // extern "C"