[
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)