21#ifndef VOTCA_XTP_OPENMP_CUDA_H
22#define VOTCA_XTP_OPENMP_CUDA_H
76 void setOperators(
const std::vector<Eigen::MatrixXd>& tensor,
77 const Eigen::MatrixXd& rightoperator);
82 const Eigen::MatrixXd& rightoperator);
88 void A_TDA(
const Eigen::VectorXd& vec,
Index OpenmpThread);
92 const Eigen::MatrixXd& input,
Index rows1,
Index rows2,
96 void PrepareMatrix2(
const Eigen::Block<const Eigen::MatrixXd>& mat,
bool Hd2,
98 void Addvec(
const Eigen::VectorXd& row,
Index OpenmpThread);
122 assert(
p !=
nullptr &&
"Dangling reference!");
127 const T*
p =
nullptr;
138 reduce_mat = Eigen::MatrixXd::Zero(rows, cols);
163 bool isGPUthread(
Index ParentThreadId)
const;
167 explicit GPU_data(
Index i)
173 std::unique_ptr<CudaPipeline> pipeline;
174 std::vector<std::unique_ptr<CudaMatrix>> temp;
177 CudaPipeline& pipe() {
return *pipeline; }
178 void activateGPU() { checkCuda(cudaSetDevice(pipeline->getDeviceId())); }
180 void push_back(
const Eigen::MatrixXd& m) {
181 temp.push_back(std::make_unique<CudaMatrix>(m, pipeline->get_stream()));
183 void push_back(Index rows, Index cols) {
185 std::make_unique<CudaMatrix>(rows, cols, pipeline->get_stream()));
188 void resize(Index
id, Index rows, Index cols) {
190 std::make_unique<CudaMatrix>(rows, cols, pipeline->get_stream());
194 std::vector<GPU_data> gpus_;
195 static bool isInVector(
Index Id,
const std::vector<GPU_data>& vec);
DefaultReference & operator=(const T &object)
DefaultReference()=default
DefaultReference(T object)
void A_TDA(const Eigen::VectorXd &vec, Index OpenmpThread)
void Addvec(const Eigen::VectorXd &row, Index OpenmpThread)
Index getParentThreadId(Index OpenmpThreadId) const
void PushMatrix1(const Eigen::MatrixXd &mat, Index OpenmpThread)
void MultiplyLeftRight(Eigen::MatrixXd &matrix, Index OpenmpThread)
std::vector< CPU_data > cpus_
Eigen::MatrixXd getReductionVar()
void SetTempZero(Index OpenmpThread)
void MultiplyRight(Eigen::MatrixXd &matrix, Index OpenmpThread)
void createTemporaries(Index rows, Index cols)
void setOperators(const std::vector< Eigen::MatrixXd > &tensor, const Eigen::MatrixXd &rightoperator)
void PushMatrix(const Eigen::MatrixXd &mat, Index OpenmpThread)
void MultiplyBlocks(const Eigen::Block< const Eigen::MatrixXd > &mat, Index i1, Index i2, Index OpenmpThread)
static Index AvailableGPUs()
void MultiplyRow(Index row, Index OpenmpThread)
bool inside_Parallel_region_
void createAdditionalTemporaries(Index rows, Index cols)
void PrepareMatrix2(const Eigen::Block< const Eigen::MatrixXd > &mat, bool Hd2, Index OpenmpThread)
static void SetNoGPUs(Index number)
Index getLocalThreadId(Index ParentThreadId) const
DefaultReference< const Eigen::MatrixXd > rOP_
DefaultReference< const Eigen::MatrixXd > lOP_
static Index number_of_gpus
Index getNumberThreads() const
DefaultReference< const Eigen::VectorXd > vec_
void PrepareMatrix1(Eigen::MatrixXd &mat, Index OpenmpThread)
base class for all analysis tools
DefaultReference< Eigen::MatrixXd > ref_mat
Eigen::MatrixXd & reduce()
Eigen::MatrixXd reduce_mat
void InitializeReduce(Index rows, Index cols)
void InitializeVec(Index size)