Skip to content

Commit b478c93

Browse files
committed
why there will be 3 threads during the unittest???
1 parent 9a6e94a commit b478c93

File tree

9 files changed

+131
-104
lines changed

9 files changed

+131
-104
lines changed

source/module_base/module_mixing/broyden_mixing.cpp

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ void Broyden_Mixing::tem_push_data(Mixing_Data& mdata,
3131
{
3232
const size_t length = mdata.length;
3333
std::vector<FPTYPE> F_tmp(length);
34-
#ifdef _OPENMP
35-
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
36-
#endif
34+
35+
// to use omp, do not need to enclose with #ifdef ... #endif
36+
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
3737
for (int i = 0; i < length; ++i)
3838
{
3939
F_tmp[i] = data_out[i] - data_in[i];
@@ -73,9 +73,8 @@ void Broyden_Mixing::tem_push_data(Mixing_Data& mdata,
7373
}
7474
dF = malloc(sizeof(FPTYPE) * length * mixing_ndim);
7575
FP_dF = static_cast<FPTYPE*>(dF);
76-
#ifdef _OPENMP
77-
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
78-
#endif
76+
77+
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
7978
for (int i = 0; i < length; ++i)
8079
{
8180
FP_F[i] = F_tmp[i];
@@ -85,9 +84,8 @@ void Broyden_Mixing::tem_push_data(Mixing_Data& mdata,
8584
{
8685
this->ndim_cal_dF = std::min(this->ndim_cal_dF + 1, this->mixing_ndim);
8786
start_dF = (this->start_dF + 1) % this->mixing_ndim;
88-
#ifdef _OPENMP
89-
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
90-
#endif
87+
88+
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
9189
for (int i = 0; i < length; ++i)
9290
{
9391
FP_F[i] = F_tmp[i];
@@ -175,9 +173,8 @@ void Broyden_Mixing::tem_cal_coef(const Mixing_Data& mdata, std::function<double
175173
}
176174

177175
FPTYPE* dFnext = FP_dF + dFindex_move(1) * length;
178-
#ifdef _OPENMP
179-
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
180-
#endif
176+
177+
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
181178
for (int i = 0; i < length; ++i)
182179
{
183180
dFnext[i] = FP_F[i];

source/module_base/module_mixing/mixing.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@ void Mixing::push_data(Mixing_Data& mdata,
1717
data_out,
1818
screen,
1919
[this, length](double* out, const double* in, const double* sres) {
20-
#ifdef _OPENMP
21-
#pragma omp parallel for schedule(static, 512)
22-
#endif
20+
21+
#pragma omp parallel for schedule(static, 512)
2322
for (int i = 0; i < length; ++i)
2423
{
2524
out[i] = in[i] + this->mixing_beta * sres[i];
@@ -42,9 +41,8 @@ void Mixing::push_data(Mixing_Data& mdata,
4241
data_out,
4342
screen,
4443
[this, length](std::complex<double>* out, const std::complex<double>* in, const std::complex<double>* sres) {
45-
#ifdef _OPENMP
46-
#pragma omp parallel for schedule(static, 256)
47-
#endif
44+
45+
#pragma omp parallel for schedule(static, 256)
4846
for (int i = 0; i < length; ++i)
4947
{
5048
out[i] = in[i] + this->mixing_beta * sres[i];

source/module_base/module_mixing/mixing_data.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,20 @@ Mixing_Data::Mixing_Data(const int& ndim, const int& length, const size_t& type_
1515

1616
Mixing_Data::~Mixing_Data()
1717
{
18-
if (this->data != nullptr)
18+
if (this->data != nullptr) {
1919
free(this->data);
20+
this->data = nullptr;
21+
}
2022
}
2123

2224
void Mixing_Data::resize(const int& ndim, const int& length, const size_t& type_size)
2325
{
2426
this->ndim_tot = ndim;
2527
this->length = length;
26-
if (this->data != nullptr)
28+
if (this->data != nullptr) {
2729
free(this->data);
30+
this->data = nullptr;
31+
}
2832
if (ndim * length > 0)
2933
{
3034
this->data = malloc(ndim * length * type_size);

source/module_base/module_mixing/plain_mixing.cpp

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,8 @@ void Plain_Mixing::tem_push_data(Mixing_Data& mdata,
2929
{
3030
const size_t length = mdata.length;
3131
std::vector<FPTYPE> F_tmp(length);
32-
#ifdef _OPENMP
33-
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
34-
#endif
32+
33+
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
3534
for (int i = 0; i < length; ++i)
3635
{
3736
F_tmp[i] = data_out[i] - data_in[i];
@@ -67,9 +66,8 @@ void Plain_Mixing::simple_mix(FPTYPE* data_new,
6766
{
6867
if (screen == nullptr)
6968
{
70-
#ifdef _OPENMP
71-
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
72-
#endif
69+
70+
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
7371
for (int ig = 0; ig < length; ig++)
7472
{
7573
data_new[ig] = data_in[ig] + this->mixing_beta * (data_out[ig] - data_in[ig]);
@@ -78,17 +76,15 @@ void Plain_Mixing::simple_mix(FPTYPE* data_new,
7876
else
7977
{
8078
std::vector<FPTYPE> F_tmp(length);
81-
#ifdef _OPENMP
82-
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
83-
#endif
79+
80+
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
8481
for (int i = 0; i < length; ++i)
8582
{
8683
F_tmp[i] = data_out[i] - data_in[i];
8784
}
8885
screen(F_tmp.data());
89-
#ifdef _OPENMP
90-
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
91-
#endif
86+
87+
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
9288
for (int i = 0; i < length; ++i)
9389
{
9490
data_new[i] = data_in[i] + this->mixing_beta * F_tmp[i];

source/module_base/module_mixing/pulay_mixing.cpp

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,44 +31,46 @@ void Pulay_Mixing::tem_push_data(Mixing_Data& mdata,
3131
const size_t length = mdata.length;
3232
std::vector<FPTYPE> F_tmp(length);
3333

34-
#ifdef _OPENMP
35-
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
36-
#endif
34+
35+
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
3736
for (int i = 0; i < length; ++i)
3837
{
3938
F_tmp[i] = data_out[i] - data_in[i];
4039
}
4140

4241
// get screened F
43-
if (screen != nullptr)
42+
if (screen != nullptr) {
4443
screen(F_tmp.data());
44+
}
4545

4646
// container::Tensor data = data_in + mixing_beta * F;
4747
std::vector<FPTYPE> data(length);
4848
mix(data.data(), data_in, F_tmp.data());
4949

5050
mdata.push(data.data());
5151

52-
if (!need_calcoef)
52+
if (!need_calcoef) {
5353
return;
54+
}
5455

55-
if (address != &mdata && address != nullptr)
56+
if (address != &mdata && address != nullptr) {
5657
ModuleBase::WARNING_QUIT(
5758
"Pulay_Mixing",
5859
"One Pulay_Mixing object can only bind one Mixing_Data object to calculate coefficients");
60+
}
5961

6062
FPTYPE* FP_F = static_cast<FPTYPE*>(F);
6163
if (mdata.ndim_use == 1)
6264
{
6365
address = &mdata;
6466
// allocate
65-
if (F != nullptr)
67+
if (F != nullptr) {
6668
free(F);
69+
}
6770
F = malloc(sizeof(FPTYPE) * length * mixing_ndim);
6871
FP_F = static_cast<FPTYPE*>(F);
69-
#ifdef _OPENMP
70-
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
71-
#endif
72+
73+
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
7274
for (int i = 0; i < length; ++i)
7375
{
7476
FP_F[i] = F_tmp[i];
@@ -78,9 +80,8 @@ void Pulay_Mixing::tem_push_data(Mixing_Data& mdata,
7880
{
7981
start_F = (this->start_F + 1) % this->mixing_ndim;
8082
FPTYPE* FP_startF = FP_F + start_F * length;
81-
#ifdef _OPENMP
82-
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
83-
#endif
83+
84+
#pragma omp parallel for schedule(static, 4096 / sizeof(FPTYPE))
8485
for (int i = 0; i < length; ++i)
8586
{
8687
FP_startF[i] = F_tmp[i];
@@ -99,10 +100,11 @@ void Pulay_Mixing::tem_cal_coef(const Mixing_Data& mdata, std::function<double(F
99100
{
100101
ModuleBase::TITLE("Charge_Mixing", "Pulay_mixing");
101102
ModuleBase::timer::tick("Charge", "Pulay_mixing");
102-
if (address != &mdata && address != nullptr)
103+
if (address != &mdata && address != nullptr) {
103104
ModuleBase::WARNING_QUIT(
104105
"Pulay_mixing",
105106
"One Pulay_Mixing object can only bind one Mixing_Data object to calculate coefficients");
107+
}
106108
const int length = mdata.length;
107109
FPTYPE* FP_F = static_cast<FPTYPE*>(F);
108110

@@ -137,11 +139,13 @@ void Pulay_Mixing::tem_cal_coef(const Mixing_Data& mdata, std::function<double(F
137139
char uu = 'U';
138140
int info;
139141
dsytrf_(&uu, &ndim_use, beta_tmp.c, &ndim_use, iwork, work, &ndim_use, &info);
140-
if (info != 0)
142+
if (info != 0) {
141143
ModuleBase::WARNING_QUIT("Charge_Mixing", "Error when factorizing beta.");
144+
}
142145
dsytri_(&uu, &ndim_use, beta_tmp.c, &ndim_use, iwork, work, &info);
143-
if (info != 0)
146+
if (info != 0) {
144147
ModuleBase::WARNING_QUIT("Charge_Mixing", "Error when DSYTRI beta.");
148+
}
145149
for (int i = 0; i < ndim_use; ++i)
146150
{
147151
for (int j = i + 1; j < ndim_use; ++j)
Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
1-
# it is nonsence to disable MPI for so-called simplicitly of unittest
2-
AddTest(
3-
TARGET test_mixing
4-
LIBS parameter base device ${math_libs}
5-
SOURCES mixing_test.cpp
6-
)
1+
# the following test should be run with only one omp thread
2+
# use googletest
3+
4+
add_executable(test_mixing mixing_test.cpp)
5+
target_link_libraries(test_mixing parameter base device ${math_libs} Threads::Threads
6+
GTest::gtest_main GTest::gmock_main)
7+
8+
9+
add_test(
10+
NAME test_mixing
11+
COMMAND OMP_NUM_THREADS=1 mpirun -np 1 test_mixing
12+
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
13+
)
14+
15+
# AddTest(
16+
# TARGET test_mixing
17+
# LIBS parameter base device ${math_libs}
18+
# SOURCES mixing_test.cpp
19+
# )

source/module_base/module_mixing/test/mixing_test.cpp

Lines changed: 47 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,6 @@ TEST_F(Mixing_Test, BroydenSolveLinearEq)
183183
this->mixing->init_mixing_data(testdata, 3, sizeof(double));
184184

185185
// testing::internal::CaptureStdout();
186-
// EXPECT_DEATH(this->mixing->push_data(testdata, x_in.data(), x_out.data(), nullptr, true), "");
187186
EXPECT_EXIT(this->mixing->push_data(testdata, x_in.data(), x_out.data(), nullptr, true),
188187
::testing::ExitedWithCode(0),
189188
"");
@@ -193,7 +192,6 @@ TEST_F(Mixing_Test, BroydenSolveLinearEq)
193192
// testing::HasSubstr("One Broyden_Mixing object can only bind one Mixing_Data object to calculate coefficients"));
194193

195194
// testing::internal::CaptureStdout();
196-
// EXPECT_DEATH(this->mixing->cal_coef(testdata, ext_inner_product_mock), "");
197195
EXPECT_EXIT(this->mixing->cal_coef(testdata, ext_inner_product_mock), ::testing::ExitedWithCode(0), "");
198196
// output = testing::internal::GetCapturedStdout();
199197
// EXPECT_THAT(
@@ -203,53 +201,53 @@ TEST_F(Mixing_Test, BroydenSolveLinearEq)
203201
clear();
204202
}
205203

206-
// TEST_F(Mixing_Test, PulaySolveLinearEq)
207-
// {
208-
// omp_set_num_threads(1);
209-
// init_method("pulay");
210-
// std::vector<double> x_in = xd_ref;
211-
// std::vector<double> x_out(3);
212-
// solve_linear_eq<double>(x_in.data(), x_out.data());
213-
// EXPECT_NEAR(x_out[0], 2.9999959638248037, DOUBLETHRESHOLD);
214-
// EXPECT_NEAR(x_out[1], 2.0000002552633349, DOUBLETHRESHOLD);
215-
// EXPECT_NEAR(x_out[2], 1.0000019542717642, DOUBLETHRESHOLD);
216-
// ASSERT_EQ(niter, 6);
217-
218-
// this->mixing->reset();
219-
// xdata.reset();
220-
221-
// std::vector<std::complex<double>> xc_in = xc_ref;
222-
// std::vector<std::complex<double>> xc_out(3);
223-
// solve_linear_eq<std::complex<double>>(xc_in.data(), xc_out.data());
224-
// EXPECT_NEAR(xc_out[0].real(), 3.0000063220482565, DOUBLETHRESHOLD);
225-
// EXPECT_NEAR(xc_out[1].real(), 1.9999939191147462, DOUBLETHRESHOLD);
226-
// EXPECT_NEAR(xc_out[2].real(), 0.99999835919718549, DOUBLETHRESHOLD);
227-
// ASSERT_EQ(niter, 6);
228-
229-
// std::string output;
230-
// Base_Mixing::Mixing_Data testdata;
231-
// this->mixing->init_mixing_data(testdata, 3, sizeof(double));
232-
233-
// testing::internal::CaptureStdout();
234-
// EXPECT_DEATH(this->mixing->push_data(testdata, x_in.data(), x_out.data(), nullptr, true), "");
235-
// // EXPECT_EXIT(this->mixing->push_data(testdata, x_in.data(), x_out.data(), nullptr, true),
236-
// // ::testing::ExitedWithCode(0),
237-
// // "");
238-
// output = testing::internal::GetCapturedStdout();
239-
// EXPECT_THAT(
240-
// output,
241-
// testing::HasSubstr("One Pulay_Mixing object can only bind one Mixing_Data object to calculate coefficients"));
242-
243-
// testing::internal::CaptureStdout();
244-
// EXPECT_DEATH(this->mixing->cal_coef(testdata, ext_inner_product_mock), "");
245-
// // EXPECT_EXIT(this->mixing->cal_coef(testdata, ext_inner_product_mock), ::testing::ExitedWithCode(0), "");
246-
// output = testing::internal::GetCapturedStdout();
247-
// EXPECT_THAT(
248-
// output,
249-
// testing::HasSubstr("One Pulay_Mixing object can only bind one Mixing_Data object to calculate coefficients"));
250-
251-
// clear();
252-
// }
204+
TEST_F(Mixing_Test, PulaySolveLinearEq)
205+
{
206+
#ifdef _OPENMP
207+
omp_set_num_threads(1);
208+
#endif
209+
init_method("pulay");
210+
std::vector<double> x_in = xd_ref;
211+
std::vector<double> x_out(3);
212+
solve_linear_eq<double>(x_in.data(), x_out.data());
213+
EXPECT_NEAR(x_out[0], 2.9999959638248037, DOUBLETHRESHOLD);
214+
EXPECT_NEAR(x_out[1], 2.0000002552633349, DOUBLETHRESHOLD);
215+
EXPECT_NEAR(x_out[2], 1.0000019542717642, DOUBLETHRESHOLD);
216+
EXPECT_EQ(niter, 6);
217+
218+
this->mixing->reset();
219+
xdata.reset();
220+
221+
std::vector<std::complex<double>> xc_in = xc_ref;
222+
std::vector<std::complex<double>> xc_out(3);
223+
solve_linear_eq<std::complex<double>>(xc_in.data(), xc_out.data());
224+
EXPECT_NEAR(xc_out[0].real(), 3.0000063220482565, DOUBLETHRESHOLD);
225+
EXPECT_NEAR(xc_out[1].real(), 1.9999939191147462, DOUBLETHRESHOLD);
226+
EXPECT_NEAR(xc_out[2].real(), 0.99999835919718549, DOUBLETHRESHOLD);
227+
ASSERT_EQ(niter, 6);
228+
229+
std::string output;
230+
Base_Mixing::Mixing_Data testdata;
231+
this->mixing->init_mixing_data(testdata, 3, sizeof(double));
232+
233+
// testing::internal::CaptureStdout();
234+
EXPECT_EXIT(this->mixing->push_data(testdata, x_in.data(), x_out.data(), nullptr, true),
235+
::testing::ExitedWithCode(0),
236+
"");
237+
// output = testing::internal::GetCapturedStdout();
238+
// EXPECT_THAT(
239+
// output,
240+
// testing::HasSubstr("One Pulay_Mixing object can only bind one Mixing_Data object to calculate coefficients"));
241+
242+
// testing::internal::CaptureStdout();
243+
EXPECT_EXIT(this->mixing->cal_coef(testdata, ext_inner_product_mock), ::testing::ExitedWithCode(0), "");
244+
// output = testing::internal::GetCapturedStdout();
245+
// EXPECT_THAT(
246+
// output,
247+
// testing::HasSubstr("One Pulay_Mixing object can only bind one Mixing_Data object to calculate coefficients"));
248+
249+
clear();
250+
}
253251

254252
TEST_F(Mixing_Test, PlainSolveLinearEq)
255253
{

0 commit comments

Comments
 (0)