[ https://issues.apache.org/jira/browse/ARROW-2447?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Antoine Pitrou updated ARROW-2447: ---------------------------------- Description: Right now, a plain Buffer doesn't carry information about where it actually lies. That information also cannot be passed around, so you get APIs like {{PlasmaClient}} which take or return device number integers, and have implementations which hardcode operations on CUDA buffers. Also, unsuspecting receivers of a {{Buffer}} pointer may try to act on the underlying memory without knowing whether it's CPU-reachable or not. Here is a sketch for a proposed Device abstraction: {code} class Device { enum DeviceKind { KIND_CPU, KIND_CUDA }; virtual DeviceKind kind() const; //MemoryPool* default_memory_pool() const; //std::shared_ptr<Buffer> Allocate(...); }; class CpuDevice : public Device {}; class CudaDevice : public Device { int device_num() const; }; class Buffer { virtual DeviceKind device_kind() const; virtual std::shared_ptr<Device> device() const; virtual bool on_cpu() const { return true; } const uint8_t* cpu_data() const { return on_cpu() ? data() : nullptr; } uint8_t* cpu_mutable_data() { return on_cpu() ? mutable_data() : nullptr; } virtual CopyToCpu(std::shared_ptr<Buffer> dest) const; virtual CopyFromCpu(std::shared_ptr<Buffer> src); }; class CudaBuffer : public Buffer { virtual bool on_cpu() const { return false; } }; CopyBuffer(std::shared_ptr<Buffer> dest, const std::shared_ptr<Buffer> src); {code} was: Right now, a plain Buffer doesn't carry information about where it actually lies. That information also cannot be passed around, so you get APIs like {{PlasmaClient}} which take or return device number integers, and have implementations which hardcode operations on CUDA buffers. Here is a sketch for a proposed Device abstraction: {code:c++} class Device { enum DeviceKind { KIND_CPU, KIND_CUDA }; virtual DeviceKind kind() const; //MemoryPool* default_memory_pool() const; //std::shared_ptr<Buffer> Allocate(...); }; class CpuDevice : public Device {}; class CudaDevice : public Device { int device_num() const; }; class Buffer { virtual DeviceKind device_kind() const; virtual std::shared_ptr<Device> device() const; virtual bool on_cpu() const { return true; } const uint8_t* cpu_data() const { return on_cpu() ? data() : nullptr; } uint8_t* cpu_mutable_data() { return on_cpu() ? mutable_data() : nullptr; } virtual CopyToCpu(std::shared_ptr<Buffer> dest) const; virtual CopyFromCpu(std::shared_ptr<Buffer> src); }; class CudaBuffer : public Buffer { virtual bool on_cpu() const { return false; } }; CopyBuffer(std::shared_ptr<Buffer> dest, const std::shared_ptr<Buffer> src); {code} > [C++] Create a device abstraction > --------------------------------- > > Key: ARROW-2447 > URL: https://issues.apache.org/jira/browse/ARROW-2447 > Project: Apache Arrow > Issue Type: Improvement > Components: C++, GPU > Affects Versions: 0.9.0 > Reporter: Antoine Pitrou > Priority: Major > > Right now, a plain Buffer doesn't carry information about where it actually > lies. That information also cannot be passed around, so you get APIs like > {{PlasmaClient}} which take or return device number integers, and have > implementations which hardcode operations on CUDA buffers. Also, unsuspecting > receivers of a {{Buffer}} pointer may try to act on the underlying memory > without knowing whether it's CPU-reachable or not. > Here is a sketch for a proposed Device abstraction: > {code} > class Device { > enum DeviceKind { KIND_CPU, KIND_CUDA }; > virtual DeviceKind kind() const; > //MemoryPool* default_memory_pool() const; > //std::shared_ptr<Buffer> Allocate(...); > }; > class CpuDevice : public Device {}; > class CudaDevice : public Device { > int device_num() const; > }; > class Buffer { > virtual DeviceKind device_kind() const; > virtual std::shared_ptr<Device> device() const; > virtual bool on_cpu() const { > return true; > } > const uint8_t* cpu_data() const { > return on_cpu() ? data() : nullptr; > } > uint8_t* cpu_mutable_data() { > return on_cpu() ? mutable_data() : nullptr; > } > virtual CopyToCpu(std::shared_ptr<Buffer> dest) const; > virtual CopyFromCpu(std::shared_ptr<Buffer> src); > }; > class CudaBuffer : public Buffer { > virtual bool on_cpu() const { > return false; > } > }; > CopyBuffer(std::shared_ptr<Buffer> dest, const std::shared_ptr<Buffer> src); > {code} -- This message was sent by Atlassian JIRA (v7.6.3#76005)