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;
}