Kokkos Node API and Local Linear Algebra Kernels Version of the Day
Kokkos_DefaultKernels.hpp
00001 //@HEADER
00002 // ************************************************************************
00003 // 
00004 //          Kokkos: Node API and Parallel Node Kernels
00005 //              Copyright (2008) Sandia Corporation
00006 // 
00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00008 // the U.S. Government retains certain rights in this software.
00009 // 
00010 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Michael A. Heroux (maherou@sandia.gov) 
00038 // 
00039 // ************************************************************************
00040 //@HEADER
00041 
00042 #ifndef KOKKOS_DEFAULT_KERNELS_
00043 #define KOKKOS_DEFAULT_KERNELS_
00044 
00045 #include "Kokkos_ConfigDefs.hpp"
00046 #include "Kokkos_DefaultSparseOps.hpp"
00047 #include "Kokkos_DefaultBlockSparseOps.hpp"
00048 #include "Kokkos_DefaultRelaxation.hpp"
00049 #ifdef HAVE_KOKKOS_CUSPARSE
00050 #include "Kokkos_CUSPARSEOps.hpp"
00051 #endif
00052 #ifdef HAVE_KOKKOS_CUSP
00053 #include "Kokkos_CuspOps.hpp"
00054 #endif
00055 
00056 namespace Kokkos {
00057 
00061   template <class Scalar, class Ordinal, class Node>
00062   struct DefaultKernels {
00063     typedef DefaultHostSparseOps <void  ,Ordinal,Node,details::DefaultCRSAllocator>  SparseOps;
00064     typedef DefaultBlockSparseOps<Scalar,Ordinal,Node>  BlockSparseOps;
00065     typedef DefaultRelaxation    <Scalar,Ordinal,Node>  Relaxations;
00066   };
00067 
00068 #ifdef HAVE_KOKKOS_FIRST_TOUCH_MATVEC_ALLOCATION
00069   class TBBNode;
00070   template <class Scalar, class Ordinal>
00071   struct DefaultKernels<Scalar,Ordinal,TBBNode> {
00072     typedef DefaultHostSparseOps <void  ,Ordinal,Node,details::FirstTouchCRSAllocator>  SparseOps;
00073     typedef DefaultBlockSparseOps<Scalar,Ordinal,TBBNode>  BlockSparseOps;
00074     typedef DefaultRelaxation    <Scalar,Ordinal,TBBNode>  Relaxations;
00075   };
00076   class TPINode;
00077   template <class Scalar, class Ordinal>
00078   struct DefaultKernels<Scalar,Ordinal,TPINode> {
00079     typedef DefaultHostSparseOps <void  ,Ordinal,Node,details::FirstTouchCRSAllocator>  SparseOps;
00080     typedef FirstTouchSparseOps  <void  ,Ordinal,TPINode>  SparseOps;
00081     typedef DefaultBlockSparseOps<Scalar,Ordinal,TPINode>  BlockSparseOps;
00082     typedef DefaultRelaxation    <Scalar,Ordinal,TPINode>  Relaxations;
00083   };
00084 #endif
00085 
00092    class ThrustGPUNode;
00093 #if defined(HAVE_KOKKOS_CUSP)
00094    template <class Scalar, class Ordinal>
00095    struct DefaultKernels<Scalar,Ordinal,ThrustGPUNode> {
00096      typedef CuspOps<void,Ordinal,ThrustGPUNode> SparseOps;
00097    };
00098 #else 
00099    template <class Scalar, class Ordinal>
00100    struct DefaultKernels<Scalar,Ordinal,ThrustGPUNode> {
00101      // empty == fail
00102    };
00103 #endif
00104 #if defined(HAVE_KOKKOS_CUSPARSE)
00105    template <>
00106    struct DefaultKernels<void,int,ThrustGPUNode> {
00107      typedef CUSPARSEOps<void,ThrustGPUNode> SparseOps;
00108    };
00109    template <>
00110    struct DefaultKernels<float,int,ThrustGPUNode> {
00111      typedef CUSPARSEOps<void,ThrustGPUNode> SparseOps;
00112    };
00113    template <>
00114    struct DefaultKernels<double,int,ThrustGPUNode> {
00115      typedef CUSPARSEOps<void,ThrustGPUNode> SparseOps;
00116    };
00117 #endif
00118 
00119 }
00120 
00121 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends