Mentions légales du service

Skip to content
Snippets Groups Projects
Commit 22149efa authored by hhakim's avatar hhakim
Browse files

Implement MatButterfly::transpose with a cache mechanism.

parent 1ddbb4cc
No related branches found
No related tags found
No related merge requests found
...@@ -43,6 +43,7 @@ namespace Faust ...@@ -43,6 +43,7 @@ namespace Faust
long *subdiag_ids_ptr; long *subdiag_ids_ptr;
#endif #endif
int level; int level;
bool is_transp;
public: public:
......
...@@ -43,6 +43,7 @@ namespace Faust ...@@ -43,6 +43,7 @@ namespace Faust
copy(subdiag_ids.begin(), subdiag_ids.end(),subdiag_ids_ptr); copy(subdiag_ids.begin(), subdiag_ids.end(),subdiag_ids_ptr);
#endif #endif
this->level = level; this->level = level;
this->is_transp = false;
} }
template<typename FPP> template<typename FPP>
...@@ -64,6 +65,7 @@ namespace Faust ...@@ -64,6 +65,7 @@ namespace Faust
copy(src.subdiag_ids_ptr, src.subdiag_ids_ptr + src.getNbRow(), subdiag_ids_ptr); copy(src.subdiag_ids_ptr, src.subdiag_ids_ptr + src.getNbRow(), subdiag_ids_ptr);
#endif #endif
level = src.level; level = src.level;
is_transp = src.is_transp;
return *this; return *this;
} }
...@@ -92,23 +94,22 @@ namespace Faust ...@@ -92,23 +94,22 @@ namespace Faust
{ {
//TODO: simplify in case of symmetric matrix (it happens for the FFT) //TODO: simplify in case of symmetric matrix (it happens for the FFT)
auto size = D2.rows(); auto size = D2.rows();
if(D2T.size() != 0) if(D2T.size() == 0)
// already done
return;
FPP *d1_ptr, *d2_ptr, *d2t_ptr;
d1_ptr = D1.diagonal().data();
d2_ptr = D2.diagonal().data();
D2T.resize(size);
d2t_ptr = D2T.diagonal().data();
auto d_offset = size >> (level+1);
// D1 doesn't change
// swap every pair of D2 contiguous blocks to form D2T
for(int i = 0;i < size; i += d_offset * 2)
{ {
// swap two next blocks of size d_offset into d2t_ptr FPP *d2_ptr, *d2t_ptr;
copy(d2_ptr + i, d2_ptr + i + d_offset, d2t_ptr + i + d_offset); d2_ptr = D2.diagonal().data();
copy(d2_ptr + i + d_offset, d2_ptr + i + 2 * d_offset, d2t_ptr + i); D2T.resize(size);
d2t_ptr = D2T.diagonal().data();
auto d_offset = size >> (level+1);
// D1 doesn't change
// swap every pair of D2 contiguous blocks to form D2T
for(int i = 0;i < size; i += d_offset * 2)
{
// swap two next blocks of size d_offset into d2t_ptr
copy(d2_ptr + i, d2_ptr + i + d_offset, d2t_ptr + i + d_offset);
copy(d2_ptr + i + d_offset, d2_ptr + i + 2 * d_offset, d2t_ptr + i);
}
} }
} }
...@@ -165,7 +166,7 @@ namespace Faust ...@@ -165,7 +166,7 @@ namespace Faust
DiagMat &D2 = this->D2; DiagMat &D2 = this->D2;
const FPP *d1_ptr, *d2_ptr; const FPP *d1_ptr, *d2_ptr;
d1_ptr = D1.diagonal().data(); d1_ptr = D1.diagonal().data();
if(transpose) if(transpose ^ is_transp)
{ {
init_transpose(); // no cost if already initialized init_transpose(); // no cost if already initialized
d2_ptr = D2T.diagonal().data(); d2_ptr = D2T.diagonal().data();
...@@ -206,7 +207,7 @@ namespace Faust ...@@ -206,7 +207,7 @@ namespace Faust
DiagMat &D2 = this->D2; DiagMat &D2 = this->D2;
const FPP *d1_ptr, *d2_ptr; const FPP *d1_ptr, *d2_ptr;
d1_ptr = D1.diagonal().data(); d1_ptr = D1.diagonal().data();
if(transpose) if(transpose ^ is_transp)
{ {
init_transpose(); // no cost if already initialized init_transpose(); // no cost if already initialized
d2_ptr = D2T.diagonal().data(); d2_ptr = D2T.diagonal().data();
...@@ -236,7 +237,8 @@ namespace Faust ...@@ -236,7 +237,8 @@ namespace Faust
template<typename FPP> template<typename FPP>
void MatButterfly<FPP, Cpu>::transpose() void MatButterfly<FPP, Cpu>::transpose()
{ {
//TODO init_transpose(); // free cost if already called once
is_transp = ! is_transp;
} }
template<typename FPP> template<typename FPP>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment