Antoine Pitrou created ARROW-2447:

             Summary: [C++] Create a device abstraction
                 Key: ARROW-2447
             Project: Apache Arrow
          Issue Type: Improvement
          Components: C++, GPU
    Affects Versions: 0.9.0
            Reporter: Antoine Pitrou

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:

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

This message was sent by Atlassian JIRA

Reply via email to