Skip to content

Commit d6959e4

Browse files
author
kswirydo
committed
working Cuda functionality test
1 parent 0a459c0 commit d6959e4

File tree

4 files changed

+194
-6
lines changed

4 files changed

+194
-6
lines changed

resolve/LinSolverIterativeRandFGMRES.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ namespace ReSolve
155155
{
156156
using namespace constants;
157157

158-
io::Logger::setVerbosity(io::Logger::EVERYTHING);
158+
//io::Logger::setVerbosity(io::Logger::EVERYTHING);
159159

160160
int outer_flag = 1;
161161
int notconv = 1;

tests/functionality/CMakeLists.txt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ if(RESOLVE_USE_CUDA)
2323
# Build KLU+GLU test
2424
add_executable(klu_glu_test.exe testKLU_GLU.cpp)
2525
target_link_libraries(klu_glu_test.exe PRIVATE ReSolve)
26+
27+
#rand solver test
28+
add_executable(randGMRES_cuda_test.exe testRandGMRES_Cuda.cpp)
29+
target_link_libraries(randGMRES_cuda_test.exe PRIVATE ReSolve)
2630

2731
endif(RESOLVE_USE_CUDA)
2832

@@ -49,7 +53,8 @@ if(RESOLVE_USE_CUDA)
4953
set(installable_tests ${installable_tests}
5054
klu_rf_test.exe
5155
klu_rf_fgmres_test.exe
52-
klu_glu_test.exe)
56+
klu_glu_test.exe
57+
randGMRES_cuda_test.exe)
5358
endif(RESOLVE_USE_CUDA)
5459

5560
if(RESOLVE_USE_HIP)
@@ -72,6 +77,7 @@ if(RESOLVE_USE_CUDA)
7277
add_test(NAME klu_rf_test COMMAND $<TARGET_FILE:klu_rf_test.exe> "${test_data_dir}")
7378
add_test(NAME klu_rf_fgmres_test COMMAND $<TARGET_FILE:klu_rf_fgmres_test.exe> "${test_data_dir}")
7479
add_test(NAME klu_glu_test COMMAND $<TARGET_FILE:klu_glu_test.exe> "${test_data_dir}")
80+
add_test(NAME randGMRES_cuda_test COMMAND $<TARGET_FILE:randGMRES_cuda_test.exe> "${test_data_dir}")
7581
endif(RESOLVE_USE_CUDA)
7682

7783
if(RESOLVE_USE_HIP)
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
#include <string>
2+
#include <iostream>
3+
#include <iomanip>
4+
5+
#include <resolve/matrix/Coo.hpp>
6+
#include <resolve/matrix/Csr.hpp>
7+
#include <resolve/matrix/Csc.hpp>
8+
#include <resolve/vector/Vector.hpp>
9+
#include <resolve/matrix/io.hpp>
10+
#include <resolve/matrix/MatrixHandler.hpp>
11+
#include <resolve/vector/VectorHandler.hpp>
12+
#include <resolve/LinSolverDirectKLU.hpp>
13+
#include <resolve/LinSolverDirectCuSparseILU0.hpp>
14+
#include <resolve/LinSolverIterativeRandFGMRES.hpp>
15+
#include <resolve/workspace/LinAlgWorkspace.hpp>
16+
17+
using namespace ReSolve::constants;
18+
19+
int main(int argc, char *argv[])
20+
{
21+
// Use the same data types as those you specified in ReSolve build.
22+
using real_type = ReSolve::real_type;
23+
using vector_type = ReSolve::vector::Vector;
24+
25+
26+
//we want error sum to be 0 at the end
27+
//that means PASS.
28+
//otheriwse it is a FAIL.
29+
int error_sum = 0;
30+
int status;
31+
const std::string data_path = (argc == 2) ? argv[1] : "./";
32+
33+
34+
std::string matrixFileName = data_path + "data/SiO2.mtx";
35+
std::string rhsFileName = data_path + "data/SiO2_rhs.mtx";
36+
37+
38+
ReSolve::matrix::Coo* A_coo;
39+
ReSolve::matrix::Csr* A;
40+
41+
ReSolve::LinAlgWorkspaceCUDA* workspace_CUDA = new ReSolve::LinAlgWorkspaceCUDA();
42+
workspace_CUDA->initializeHandles();
43+
ReSolve::MatrixHandler* matrix_handler = new ReSolve::MatrixHandler(workspace_CUDA);
44+
ReSolve::VectorHandler* vector_handler = new ReSolve::VectorHandler(workspace_CUDA);
45+
real_type* rhs = nullptr;
46+
real_type* x = nullptr;
47+
48+
vector_type* vec_rhs;
49+
vector_type* vec_x;
50+
51+
ReSolve::GramSchmidt* GS = new ReSolve::GramSchmidt(vector_handler, ReSolve::GramSchmidt::cgs2);
52+
53+
ReSolve::LinSolverDirectCuSparseILU0* Rf = new ReSolve::LinSolverDirectCuSparseILU0(workspace_CUDA);
54+
ReSolve::LinSolverIterativeRandFGMRES* FGMRES = new ReSolve::LinSolverIterativeRandFGMRES(matrix_handler, vector_handler,ReSolve::LinSolverIterativeRandFGMRES::cs, GS, "cuda");
55+
56+
std::ifstream mat_file(matrixFileName);
57+
if(!mat_file.is_open())
58+
{
59+
std::cout << "Failed to open file " << matrixFileName << "\n";
60+
return -1;
61+
}
62+
63+
std::ifstream rhs_file(rhsFileName);
64+
if(!rhs_file.is_open())
65+
{
66+
std::cout << "Failed to open file " << rhsFileName << "\n";
67+
return -1;
68+
}
69+
A_coo = ReSolve::io::readMatrixFromFile(mat_file);
70+
A = new ReSolve::matrix::Csr(A_coo->getNumRows(),
71+
A_coo->getNumColumns(),
72+
A_coo->getNnz(),
73+
A_coo->symmetric(),
74+
A_coo->expanded());
75+
76+
rhs = ReSolve::io::readRhsFromFile(rhs_file);
77+
78+
x = new real_type[A->getNumRows()];
79+
vec_rhs = new vector_type(A->getNumRows());
80+
vec_x = new vector_type(A->getNumRows());
81+
vec_x->allocate(ReSolve::memory::HOST);
82+
83+
//iinit guess is 0
84+
vec_x->allocate(ReSolve::memory::DEVICE);
85+
vec_x->setToZero(ReSolve::memory::DEVICE);
86+
87+
mat_file.close();
88+
rhs_file.close();
89+
90+
matrix_handler->coo2csr(A_coo,A, "cuda");
91+
vec_rhs->update(rhs, ReSolve::memory::HOST, ReSolve::memory::DEVICE);
92+
93+
real_type norm_b;
94+
matrix_handler->setValuesChanged(true, "cuda");
95+
96+
status = Rf->setup(A);
97+
error_sum += status;
98+
99+
FGMRES->setRestart(150);
100+
FGMRES->setMaxit(2500);
101+
FGMRES->setTol(1e-12);
102+
FGMRES->setup(A);
103+
104+
status = GS->setup(FGMRES->getKrand(), FGMRES->getRestart());
105+
error_sum += status;
106+
107+
//matrix_handler->setValuesChanged(true, "cuda");
108+
status = FGMRES->resetMatrix(A);
109+
error_sum += status;
110+
111+
status = FGMRES->setupPreconditioner("LU", Rf);
112+
error_sum += status;
113+
114+
FGMRES->setFlexible(1);
115+
116+
vec_rhs->update(rhs, ReSolve::memory::HOST, ReSolve::memory::DEVICE);
117+
FGMRES->solve(vec_rhs, vec_x);
118+
119+
norm_b = vector_handler->dot(vec_rhs, vec_rhs, "cuda");
120+
norm_b = std::sqrt(norm_b);
121+
real_type final_norm_first = FGMRES->getFinalResidualNorm();
122+
std::cout << "Randomized FGMRES results (first run): \n"
123+
<< "\t Sketching method: : CountSketch\n"
124+
<< "\t Initial residual norm: ||b-Ax_0||_2 : "
125+
<< std::scientific << std::setprecision(16)
126+
<< FGMRES->getInitResidualNorm()<<" \n"
127+
<< "\t Initial relative residual norm: ||b-Ax_0||_2/||b||_2 : "
128+
<< FGMRES->getInitResidualNorm()/norm_b<<" \n"
129+
<< "\t Final residual norm: ||b-Ax||_2 : "
130+
<< FGMRES->getFinalResidualNorm() <<" \n"
131+
<< "\t Final relative residual norm: ||b-Ax||_2/||b||_2 : "
132+
<< FGMRES->getFinalResidualNorm()/norm_b <<" \n"
133+
<< "\t Number of iterations : " << FGMRES->getNumIter() << "\n";
134+
135+
delete FGMRES;
136+
delete GS;
137+
GS = new ReSolve::GramSchmidt(vector_handler, ReSolve::GramSchmidt::cgs2);
138+
FGMRES = new ReSolve::LinSolverIterativeRandFGMRES(matrix_handler, vector_handler,ReSolve::LinSolverIterativeRandFGMRES::fwht, GS, "cuda");
139+
140+
141+
FGMRES->setRestart(150);
142+
FGMRES->setMaxit(2500);
143+
FGMRES->setTol(1e-12);
144+
FGMRES->setup(A);
145+
146+
status = GS->setup(FGMRES->getKrand(), FGMRES->getRestart());
147+
error_sum += status;
148+
149+
status = FGMRES->setupPreconditioner("LU", Rf);
150+
error_sum += status;
151+
152+
vec_x->setToZero(ReSolve::memory::DEVICE);
153+
FGMRES->solve(vec_rhs, vec_x);
154+
155+
156+
std::cout << "Randomized FGMRES results (second run): \n"
157+
<< "\t Sketching method: : FWHT\n"
158+
<< "\t Initial residual norm: ||b-Ax_0||_2 : "
159+
<< std::scientific << std::setprecision(16)
160+
<< FGMRES->getInitResidualNorm()<<" \n"
161+
<< "\t Initial relative residual norm: ||b-Ax_0||_2/||b||_2 : "
162+
<< FGMRES->getInitResidualNorm()/norm_b<<" \n"
163+
<< "\t Final residual norm: ||b-Ax||_2 : "
164+
<< FGMRES->getFinalResidualNorm() <<" \n"
165+
<< "\t Final relative residual norm: ||b-Ax||_2/||b||_2 : "
166+
<< FGMRES->getFinalResidualNorm()/norm_b <<" \n"
167+
<< "\t Number of iterations : " << FGMRES->getNumIter() << "\n";
168+
169+
if ((error_sum == 0) && (final_norm_first/norm_b < 1e-11) && (FGMRES->getFinalResidualNorm()/norm_b < 1e-11 )) {
170+
std::cout<<"Test 5 (randomized GMRES) PASSED"<<std::endl<<std::endl;;
171+
} else {
172+
std::cout<<"Test 5 (randomized GMRES) FAILED, error sum: "<<error_sum<<std::endl<<std::endl;;
173+
}
174+
delete A;
175+
delete A_coo;
176+
delete Rf;
177+
delete [] x;
178+
delete [] rhs;
179+
delete vec_x;
180+
delete workspace_CUDA;
181+
delete matrix_handler;
182+
delete vector_handler;
183+
184+
return error_sum;
185+
}

tests/functionality/testRandGMRES_Rocm.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@ int main(int argc, char *argv[])
135135
delete FGMRES;
136136
delete GS;
137137
GS = new ReSolve::GramSchmidt(vector_handler, ReSolve::GramSchmidt::cgs2);
138-
printf("deleted\n");
139138
FGMRES = new ReSolve::LinSolverIterativeRandFGMRES(matrix_handler, vector_handler,ReSolve::LinSolverIterativeRandFGMRES::fwht, GS, "hip");
140139

141140

@@ -150,9 +149,7 @@ int main(int argc, char *argv[])
150149
status = FGMRES->setupPreconditioner("LU", Rf);
151150
error_sum += status;
152151

153-
printf("created\n");
154152
vec_x->setToZero(ReSolve::memory::DEVICE);
155-
printf("zeroed out\n");
156153
FGMRES->solve(vec_rhs, vec_x);
157154

158155

@@ -170,7 +167,7 @@ int main(int argc, char *argv[])
170167
<< "\t Number of iterations : " << FGMRES->getNumIter() << "\n";
171168

172169
if ((error_sum == 0) && (final_norm_first/norm_b < 1e-11) && (FGMRES->getFinalResidualNorm()/norm_b < 1e-11 )) {
173-
std::cout<<"Test 5 (randomized GMRES)) PASSED"<<std::endl<<std::endl;;
170+
std::cout<<"Test 5 (randomized GMRES) PASSED"<<std::endl<<std::endl;;
174171
} else {
175172
std::cout<<"Test 5 (randomized GMRES) FAILED, error sum: "<<error_sum<<std::endl<<std::endl;;
176173
}

0 commit comments

Comments
 (0)