You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@arrow.apache.org by "Antoine Pitrou (JIRA)" <ji...@apache.org> on 2018/04/11 11:17:00 UTC

[jira] [Updated] (ARROW-2447) [C++] Create a device abstraction

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