.. Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.


Device
=======


The Device abstract represents any hardware device with memory and compuation units.
All [Tensor operations](tensor.html) are scheduled by the resident device for execution.
Tensor memory is also managed by the device's memory manager. Therefore, optimization
of memory and execution are implemented in the Device class.

Specific devices
----------------
Currently, SINGA has three Device implmentations,

1. CudaGPU for an Nvidia GPU card which runs Cuda code
2. CppCPU for a CPU which runs Cpp code
3. OpenclGPU for a GPU card which runs OpenCL code


Python API
----------

.. automodule:: singa.device
   :members: create_cuda_gpus, create_cuda_gpus_on, get_default_device


The following code provides examples of creating devices::

   from singa import device
   cuda = device.create_cuda_gpu_on(0)  # use GPU card of ID 0
   host = device.get_default_device()  # get the default host device (a CppCPU)
   ary1 = device.create_cuda_gpus(2)  # create 2 devices, starting from ID 0
   ary2 = device.create_cuda_gpus([0,2])  # create 2 devices on ID 0 and 2
