00001 #ifndef CUBLAS_ARRAY_H
00002 #define CUBLAS_ARRAY_H
00003
00004
00005
00006 #include <lac/cublas_wrapper.hh>
00007
00008 #include <lac/blas_wrapper.hh>
00009
00010 namespace bw_types {
00011
00012
00013
00014
00015
00016 template <typename T, typename BW>
00017 class Array : protected BW::template Data<T> {
00018
00019 typedef typename BW::template Data<T> Base;
00020
00021 public:
00022
00023 Array();
00024
00025 Array(int n);
00026
00027
00028
00029 void reinit(int n);
00030
00031 T * val();
00032
00033 const T * val() const;
00034
00035 int n_elements() const { return __n; }
00036
00037 Array<T, BW> & operator = (const Array<T, BW>& other);
00038
00039 protected:
00040 int __n;
00041
00042
00043
00044
00045
00046 Array(const Array<T, BW>& other) {}
00047
00048 };
00049
00050 }
00051
00052
00053
00054
00055
00056
00057 template <typename T, typename BW>
00058 bw_types::Array<T, BW>::Array()
00059 :
00060 Base(),
00061 __n(0)
00062 {}
00063
00064
00065 template <typename T, typename BW>
00066 bw_types::Array<T, BW>::Array(int n)
00067 :
00068 Base(),
00069 __n(0)
00070 {
00071 this->reinit(n);
00072 }
00073
00074
00075
00076
00077
00078
00079
00080 template <typename T, typename BW>
00081 inline void bw_types::Array<T, BW>::reinit(int n)
00082 {
00083 if ( this->__n == n) return;
00084
00085 AssertThrow(n > 0,
00086 ::ExcMessage("Reinitialization requires a positive number of elements.") );
00087
00088 if (this->__n != n) { this->Base::resize(n);
00089
00090
00091
00092
00093
00094
00095
00096 __n = n;
00097 }
00098 }
00099
00100
00101
00102
00103
00104
00105 template <typename T, typename BW>
00106 T * bw_types::Array<T, BW>::val()
00107 {
00108 #ifdef QT_NO_DEBUG
00109 AssertThrow(this->data() != 0,
00110 ::ExcMessage("Object not initialized"));
00111 #else
00112 Assert(this->data() != 0,
00113 ::ExcMessage("Object not initialized") );
00114 #endif
00115
00116 return this->data();
00117 }
00118
00119
00120 template <typename T, typename BW>
00121 const T * bw_types::Array<T, BW>::val() const
00122 {
00123 #ifdef QT_NO_DEBUG
00124 AssertThrow(this->data() != 0,
00125 ::ExcMessage("Object not initialized"));
00126 #else
00127 Assert(this->data() != 0,
00128 ::ExcMessage("Object not initialized") );
00129 #endif
00130
00131 return this->data();
00132 }
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143 template <typename T, typename BW>
00144 bw_types::Array<T, BW> &
00145 bw_types::Array<T, BW>::operator = (const Array<T, BW>& other)
00146 {
00147
00148 Assert(other.__is_allocd,
00149 ::ExcMessage("You cannot copy from an uninitialized object!") );
00150
00151 this->reinit(other.__n);
00152
00153
00154 int inc_src = 1;
00155 int inc_this = 1;
00156
00157 BW::copy(this->__n, other.val(), inc_src, this->dev_ptr
00158 , inc_this);
00159
00160 return *this;
00161 }
00162
00163
00164 #endif // CUBLAS_ARRAY_H
00165