Mentions légales du service

Skip to content
Snippets Groups Projects
Commit 8ba17fa5 authored by hhakim's avatar hhakim
Browse files

Implement MatBSR<FPP,GPU2>::multiply(Vect<FPP, GPU2>&) and add a unit test.

Update to gpu_mod@d7028468.
parent b8f56d2b
Branches
Tags
No related merge requests found
Subproject commit 4645c7f2182c9378cc685eaa82a321af91d26109
Subproject commit d7028468307d50e9fc403412217af6fe515de382
......@@ -62,11 +62,38 @@ void test_gpu_mul_dense()
std::cout << "OK" << std::endl;
}
void test_gpu_mul_vec()
{
std::cout << "test_gpu_mul_vec" << std::endl;
// gen a cpu random dense matrix
Vect<FPP, Cpu> *cpu_vec = Vect<FPP, Cpu>::rand(15);
// convert it to gpu
Vect<FPP, GPU2> gpu_vec(*cpu_vec);
// idem for bsr mats
auto cpu_bmat = MatBSR<double, Cpu>::randMat(10, 15, 5, 5, 2);
MatBSR<FPP, GPU2> gpu_bmat(*cpu_bmat);
// multiply on cpu
cpu_bmat->multiply(*cpu_vec, 'N');
gpu_bmat.multiply(gpu_vec, 'N');
// cpu_vec->Display();
// gpu_vec.Display();
auto gpu_vec_cpu = gpu_vec.tocpu();
// gpu_vec_cpu.Display();
std::cout << gpu_vec_cpu.mean_relative_error(*cpu_vec) << std::endl;
assert(gpu_vec_cpu.mean_relative_error(*cpu_vec) < 1e-1);
delete cpu_bmat;
delete cpu_vec;
std::cout << "OK" << std::endl;
}
int main()
{
Faust::enable_gpu_mod();
test_gpu_ctor_and_tocpu();
test_gpu_mul_dense();
test_gpu_mul_vec();
}
......@@ -36,6 +36,19 @@ namespace Faust
M.gpu_mat = gpu_dmat;
}
template<>
void MatBSR<@FAUST_SCALAR_FOR_GM@,GPU2>::multiply(Vect<@FAUST_SCALAR_FOR_GM@,GPU2>& vec, char opThis/*='N'*/) const
{
gm_Op gop_this;
char2gm_Op(opThis, gop_this);
auto bsr_funcs = GPUModHandler::get_singleton()->bsr_funcs((@FAUST_SCALAR_FOR_GM@)(0));
auto dsm_funcs = GPUModHandler::get_singleton()->dsm_funcs((@FAUST_SCALAR_FOR_GM@)(0));
// the backend code is specialized for vector (the number of columns is tested to call another function, see gpu_mod)
auto gpu_dmat = bsr_funcs->mul_gpu_dsm_ext(gpu_mat, vec.gpu_mat, nullptr, gop_this, OP_NOTRANSP);
dsm_funcs->free(vec.get_gpu_mat_ptr());
vec.gpu_mat = gpu_dmat;
}
template<>
void MatBSR<@FAUST_SCALAR_FOR_GM@,GPU2>::tocpu(int32_t* browptr, int32_t* bcolinds, @FAUST_SCALAR_FOR_GM@* bdata, int32_t* nrows/*=nullptr*/, int32_t* ncols/*=nullptr*/, int32_t *bnrows/*=nullptr*/, int32_t *bncols/*=nullptr*/, int32_t* bnnz/*=nullptr*/) const
{
......
......@@ -66,6 +66,7 @@ namespace Faust
virtual void set_gpu_mat_ptr(void*);
/*********** own member functions **************/
void multiply(MatDense<FPP,GPU2>& M, char opThis='N') const;
void multiply(Vect<FPP,GPU2>& vec, char opThis='N') const;
void tocpu(int32_t* browptr, int32_t* bcolinds, FPP* bdata, int32_t* nrows=nullptr, int32_t* ncols=nullptr, int32_t *bnrows=nullptr, int32_t *bncol=nullptr, int32_t* bnnz=nullptr) const;
void tocpu(MatBSR<FPP, Cpu> &cpu_mat) const;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment