1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
//! Provides the IBlas library trait for Collenchyma implementation. use super::binary::IBlasBinary; use super::transpose::*; use collenchyma::binary::IBinary; use collenchyma::tensor::SharedTensor; use collenchyma::device::DeviceType; /// Provides the functionality for a backend to support Basic Linear Algebra Subprogram operations. pub trait IBlas<F> { } /// Provides the asum operation. pub trait Asum<F> { /// Computes the absolute sum of vector `x` with complete memory management. /// /// Saves the result to `result`. /// This is a Level 1 BLAS operation. /// /// For a no-memory managed version see `asum_plain`. fn asum(&self, x: &mut SharedTensor<F>, result: &mut SharedTensor<F>) -> Result<(), ::collenchyma::error::Error>; /// Computes the absolute sum of vector `x` without any memory management. /// /// Saves the result to `result`. /// This is a Level 1 BLAS operation. /// /// *Attention*:<br/> /// For a correct computation result, you need to manage the memory allocation and synchronization yourself.<br/> /// For a memory managed version see `asum`. fn asum_plain(&self, x: &SharedTensor<F>, result: &mut SharedTensor<F>) -> Result<(), ::collenchyma::error::Error>; } /// Provides the axpy operation. pub trait Axpy<F> { /// Computes a vector `x` times a constant `a` plus a vector `y` aka. `a * x + y` with complete memory management. /// /// Saves the resulting vector back into `y`. /// This is a Level 1 BLAS operation. /// /// For a no-memory managed version see `axpy_plain`. fn axpy(&self, a: &mut SharedTensor<F>, x: &mut SharedTensor<F>, y: &mut SharedTensor<F>) -> Result<(), ::collenchyma::error::Error>; /// Computes a vector `x` times a constant `a` plus a vector `y` aka. `a * x + y` without any memory management. /// /// Saves the resulting vector back into `y`. /// This is a Level 1 BLAS operation. /// /// *Attention*:<br/> /// For a correct computation result, you need to manage the memory allocation and synchronization yourself.<br/> /// For a memory managed version see `axpy`. fn axpy_plain(&self, a: &SharedTensor<F>, x: &SharedTensor<F>, y: &mut SharedTensor<F>) -> Result<(), ::collenchyma::error::Error>; } /// Provides the copy operation. pub trait Copy<F> { /// Copies `x.len()` elements of vector `x` into vector `y` with complete memory management. /// /// Saves the result to `y`. /// This is a Level 1 BLAS operation. /// /// For a no-memory managed version see `copy_plain`. fn copy(&self, x: &mut SharedTensor<F>, y: &mut SharedTensor<F>) -> Result<(), ::collenchyma::error::Error>; /// Copies `x.len()` elements of vector `x` into vector `y` without any memory management. /// /// Saves the result to `y`. /// This is a Level 1 BLAS operation. /// /// *Attention*:<br/> /// For a correct computation result, you need to manage the memory allocation and synchronization yourself.<br/> /// For a memory managed version see `copy`. fn copy_plain(&self, x: &SharedTensor<F>, y: &mut SharedTensor<F>) -> Result<(), ::collenchyma::error::Error>; } /// Provides the dot operation. pub trait Dot<F> { /// Computes the [dot product][dot-product] over x and y with complete memory management. /// [dot-product]: https://en.wikipedia.org/wiki/Dot_product /// /// Saves the resulting value into `result`. /// This is a Level 1 BLAS operation. /// /// For a no-memory managed version see `dot_plain`. fn dot(&self, x: &mut SharedTensor<F>, y: &mut SharedTensor<F>, result: &mut SharedTensor<F>) -> Result<(), ::collenchyma::error::Error>; /// Computes the [dot product][dot-product] over x and y without any memory management. /// [dot-product]: https://en.wikipedia.org/wiki/Dot_product /// /// Saves the resulting value into `result`. /// This is a Level 1 BLAS operation. /// /// *Attention*:<br/> /// For a correct computation result, you need to manage the memory allocation and synchronization yourself.<br/> /// For a memory managed version see `dot`. fn dot_plain(&self, x: &SharedTensor<F>, y: &SharedTensor<F>, result: &mut SharedTensor<F>) -> Result<(), ::collenchyma::error::Error>; } /// Provides the nrm2 operation. pub trait Nrm2<F> { /// Computes the L2 norm aka. euclidean length of vector `x` with complete memory management. /// /// Saves the result to `result`. /// This is a Level 1 BLAS operation. /// /// For a no-memory managed version see `nrm2_plain`. fn nrm2(&self, x: &mut SharedTensor<F>, result: &mut SharedTensor<F>) -> Result<(), ::collenchyma::error::Error>; /// Computes the L2 norm aka. euclidean length of vector `x` without any memory management. /// /// Saves the result to `result`. /// This is a Level 1 BLAS operation. /// /// *Attention*:<br/> /// For a correct computation result, you need to manage the memory allocation and synchronization yourself.<br/> /// For a memory managed version see `nrm2`. fn nrm2_plain(&self, x: &SharedTensor<F>, result: &mut SharedTensor<F>) -> Result<(), ::collenchyma::error::Error>; } /// Provides the scal operation. pub trait Scal<F> { /// Scales a vector `x` by a constant `a` aka. `a * x` with complete memory management. /// /// Saves the resulting vector back into `x`. /// This is a Level 1 BLAS operation. /// /// For a no-memory managed version see `scale_plain`. fn scal(&self, a: &mut SharedTensor<F>, x: &mut SharedTensor<F>) -> Result<(), ::collenchyma::error::Error>; /// Scales a vector `x` by a constant `a` aka. `a * x` without any memory management. /// /// Saves the resulting vector back into `x`. /// This is a Level 1 BLAS operation. /// /// *Attention*:<br/> /// For a correct computation result, you need to manage the memory allocation and synchronization yourself.<br/> /// For a memory managed version see `scale`. fn scal_plain(&self, a: &SharedTensor<F>, x: &mut SharedTensor<F>) -> Result<(), ::collenchyma::error::Error>; } /// Provides the swap operation. pub trait Swap<F> { /// Swaps the content of vector `x` and vector `y` with complete memory management. /// /// Saves the resulting vector back into `x`. /// This is a Level 1 BLAS operation. /// /// For a no-memory managed version see `swap_plain`. fn swap(&self, x: &mut SharedTensor<F>, y: &mut SharedTensor<F>) -> Result<(), ::collenchyma::error::Error>; /// Swaps the content of vector `x` and vector `y` without any memory management. /// /// Saves the resulting vector back into `x`. /// This is a Level 1 BLAS operation. /// /// *Attention*:<br/> /// For a correct computation result, you need to manage the memory allocation and synchronization yourself.<br/> /// For a memory managed version see `swap`. fn swap_plain(&self, x: &mut SharedTensor<F>, y: &mut SharedTensor<F>) -> Result<(), ::collenchyma::error::Error>; } /// Provides the gemm operation. pub trait Gemm<F> { /// Computes a matrix-matrix product with general matrices. /// /// Saves the result into `c`. /// This is a Level 3 BLAS operation. /// /// For a no-memory managed version see `gemm_plain`. fn gemm(&self, alpha: &mut SharedTensor<F>, at: Transpose, a: &mut SharedTensor<F>, bt: Transpose, b: &mut SharedTensor<F>, beta: &mut SharedTensor<F>, c: &mut SharedTensor<F>) -> Result<(), ::collenchyma::error::Error>; /// Computes a matrix-matrix product with general matrices. /// /// Saves the result into `c`. /// This is a Level 3 BLAS operation. /// /// *Attention*:<br/> /// For a correct computation result, you need to manage the memory allocation and synchronization yourself.<br/> /// For a memory managed version see `gemm`. fn gemm_plain(&self, alpha: &SharedTensor<F>, at: Transpose, a: &SharedTensor<F>, bt: Transpose, b: &SharedTensor<F>, beta: &SharedTensor<F>, c: &mut SharedTensor<F>) -> Result<(), ::collenchyma::error::Error>; } /// Allows a BlasBinary to be provided which is used for a IBlas implementation. pub trait BlasBinaryProvider<F, B: IBlasBinary<F> + IBinary> { /// Returns the binary representation fn binary(&self) -> &B; /// Returns the device representation fn device(&self) -> &DeviceType; } impl<F, B: IBlasBinary<F> + IBinary> IBlas<F> for BlasBinaryProvider<F, B> { }