Skip to content

Commit 3fcf8fc

Browse files
committed
1. optimize LRI_Cal_Aux::add_Ds()
1 parent 5827cfe commit 3fcf8fc

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

include/RI/ri/LRI-cal.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ void LRI<TA,Tcell,Ndim,Tdata>::cal(
9999

100100
if( !LRI_Cal_Aux::judge_Ds_empty(Ds_result_thread) && omp_test_lock(&lock_Ds_result_add) )
101101
{
102-
LRI_Cal_Aux::add_Ds(Ds_result_thread, Ds_result);
102+
LRI_Cal_Aux::add_Ds(std::move(Ds_result_thread), Ds_result);
103103
omp_unset_lock(&lock_Ds_result_add);
104104
Ds_result_thread.clear();
105105
Ds_result_thread.resize(Ds_result.size());
@@ -111,7 +111,7 @@ void LRI<TA,Tcell,Ndim,Tdata>::cal(
111111
if(!LRI_Cal_Aux::judge_Ds_empty(Ds_result_thread))
112112
{
113113
omp_set_lock(&lock_Ds_result_add);
114-
LRI_Cal_Aux::add_Ds(Ds_result_thread, Ds_result);
114+
LRI_Cal_Aux::add_Ds(std::move(Ds_result_thread), Ds_result);
115115
omp_unset_lock(&lock_Ds_result_add);
116116
Ds_result_thread.clear();
117117
Ds_result_thread.resize(Ds_result.size());

include/RI/ri/LRI_Cal_Aux.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ namespace LRI_Cal_Aux
5454
D_result = D_result + D_add;
5555
}
5656

57+
/*
5758
template<typename T>
5859
inline void add_Ds(const std::vector<T> &Ds_add, std::vector<T> &Ds_result)
5960
{
@@ -62,6 +63,27 @@ namespace LRI_Cal_Aux
6263
for(std::size_t i=0; i<Ds_result.size(); ++i)
6364
Ds_result[i] = Ds_result[i] + Ds_add[i]; // tmp
6465
}
66+
*/
67+
68+
template<typename TA, typename TAC, typename Tdata>
69+
void add_Ds(
70+
std::vector<std::map<TA, std::map<TAC, Tensor<Tdata>>>> &&Ds_add,
71+
std::vector<std::map<TA, std::map<TAC, Tensor<Tdata>>>> &Ds_result)
72+
{
73+
assert(Ds_add.size()==Ds_result.size());
74+
for(std::size_t i=0; i<Ds_result.size(); ++i)
75+
for(auto &&Ds_add_A : Ds_add[i])
76+
for(auto &&Ds_add_B : Ds_add_A.second)
77+
{
78+
Tensor<Tdata> &D_result = Ds_result[i][Ds_add_A.first][Ds_add_B.first];
79+
if(D_result.empty())
80+
D_result = std::move(Ds_add_B.second);
81+
else
82+
D_result = D_result + Ds_add_B.second;
83+
}
84+
Ds_add.clear();
85+
Ds_add.resize(Ds_result.size());
86+
}
6587

6688
template<typename T>
6789
inline bool judge_Ds_empty(const std::vector<T> &Ds)

0 commit comments

Comments
 (0)