.. 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.


Tensor
========

Each Tensor instance is a multi-dimensional array allocated on a specific
Device instance. Tensor instances store variables and provide
linear algebra operations over different types of hardware devices without user
awareness. Note that users need to make sure the tensor operands are
allocated on the same device except copy functions.


Tensor implementation
---------------------

SINGA has three different sets of implmentations of Tensor functions, one for each
type of Device.

* 'tensor_math_cpp.h' implements operations using Cpp (with CBLAS) for CppGPU devices.
* 'tensor_math_cuda.h' implements operations using Cuda (with cuBLAS) for CudaGPU devices.
* 'tensor_math_opencl.h' implements operations using OpenCL for OpenclGPU devices.

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


.. automodule:: singa.tensor
   :members:
