static ArrowErrorCode ArrowDeviceCudaBufferInit()

in extensions/nanoarrow_device/src/nanoarrow/nanoarrow_device_cuda.c [173:231]


static ArrowErrorCode ArrowDeviceCudaBufferInit(struct ArrowDevice* device_src,
                                                struct ArrowBufferView src,
                                                struct ArrowDevice* device_dst,
                                                struct ArrowBuffer* dst) {
  struct ArrowBuffer tmp;
  enum cudaMemcpyKind memcpy_kind;

  if (device_src->device_type == ARROW_DEVICE_CPU &&
      device_dst->device_type == ARROW_DEVICE_CUDA) {
    NANOARROW_RETURN_NOT_OK(
        ArrowDeviceCudaAllocateBuffer(device_dst, &tmp, src.size_bytes));
    memcpy_kind = cudaMemcpyHostToDevice;

  } else if (device_src->device_type == ARROW_DEVICE_CUDA &&
             device_dst->device_type == ARROW_DEVICE_CUDA) {
    NANOARROW_RETURN_NOT_OK(
        ArrowDeviceCudaAllocateBuffer(device_dst, &tmp, src.size_bytes));
    memcpy_kind = cudaMemcpyDeviceToDevice;

  } else if (device_src->device_type == ARROW_DEVICE_CUDA &&
             device_dst->device_type == ARROW_DEVICE_CPU) {
    ArrowBufferInit(&tmp);
    NANOARROW_RETURN_NOT_OK(ArrowBufferReserve(&tmp, src.size_bytes));
    tmp.size_bytes = src.size_bytes;
    memcpy_kind = cudaMemcpyDeviceToHost;

  } else if (device_src->device_type == ARROW_DEVICE_CPU &&
             device_dst->device_type == ARROW_DEVICE_CUDA_HOST) {
    NANOARROW_RETURN_NOT_OK(
        ArrowDeviceCudaAllocateBuffer(device_dst, &tmp, src.size_bytes));
    memcpy_kind = cudaMemcpyHostToHost;

  } else if (device_src->device_type == ARROW_DEVICE_CUDA_HOST &&
             device_dst->device_type == ARROW_DEVICE_CUDA_HOST) {
    NANOARROW_RETURN_NOT_OK(
        ArrowDeviceCudaAllocateBuffer(device_dst, &tmp, src.size_bytes));
    memcpy_kind = cudaMemcpyHostToHost;

  } else if (device_src->device_type == ARROW_DEVICE_CUDA_HOST &&
             device_dst->device_type == ARROW_DEVICE_CPU) {
    ArrowBufferInit(&tmp);
    NANOARROW_RETURN_NOT_OK(ArrowBufferReserve(&tmp, src.size_bytes));
    tmp.size_bytes = src.size_bytes;
    memcpy_kind = cudaMemcpyHostToHost;

  } else {
    return ENOTSUP;
  }

  cudaError_t result =
      cudaMemcpy(tmp.data, src.data.as_uint8, (size_t)src.size_bytes, memcpy_kind);
  if (result != cudaSuccess) {
    ArrowBufferReset(&tmp);
    return EINVAL;
  }

  ArrowBufferMove(&tmp, dst);
  return NANOARROW_OK;
}