mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-07-16 10:01:49 +08:00
Fix computeProductBlockingSizes with m==0, and add respective unit test.
This commit is contained in:
parent
bd76d837e6
commit
ae01c05e18
@ -249,10 +249,9 @@ void evaluateProductBlockingSizesHeuristic(Index& k, Index& m, Index& n, Index n
|
|||||||
actual_lm = l2;
|
actual_lm = l2;
|
||||||
max_mc = 576;
|
max_mc = 576;
|
||||||
}
|
}
|
||||||
|
|
||||||
Index mc = (std::min<Index>)(actual_lm/(3*k*sizeof(LhsScalar)), max_mc);
|
Index mc = (std::min<Index>)(actual_lm/(3*k*sizeof(LhsScalar)), max_mc);
|
||||||
if (mc > Traits::mr) mc -= mc % Traits::mr;
|
if (mc > Traits::mr) mc -= mc % Traits::mr;
|
||||||
|
else if (mc==0) return;
|
||||||
m = (m%mc)==0 ? mc
|
m = (m%mc)==0 ? mc
|
||||||
: (mc - Traits::mr * ((mc/*-1*/-(m%mc))/(Traits::mr*(m/mc+1))));
|
: (mc - Traits::mr * ((mc/*-1*/-(m%mc))/(Traits::mr*(m/mc+1))));
|
||||||
}
|
}
|
||||||
|
@ -134,7 +134,7 @@ void zero_sized_objects(const MatrixType& m)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<int>
|
||||||
void bug_127()
|
void bug_127()
|
||||||
{
|
{
|
||||||
// Bug 127
|
// Bug 127
|
||||||
@ -159,6 +159,7 @@ void bug_127()
|
|||||||
a*b;
|
a*b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<int>
|
||||||
void unaligned_objects()
|
void unaligned_objects()
|
||||||
{
|
{
|
||||||
// Regression test for the bug reported here:
|
// Regression test for the bug reported here:
|
||||||
@ -188,6 +189,29 @@ void unaligned_objects()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
EIGEN_DONT_INLINE
|
||||||
|
Index test_compute_block_size(Index m, Index n, Index k)
|
||||||
|
{
|
||||||
|
Index mc(m), nc(n), kc(k);
|
||||||
|
internal::computeProductBlockingSizes<T,T>(kc, mc, nc);
|
||||||
|
return kc+mc+nc;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
Index compute_block_size()
|
||||||
|
{
|
||||||
|
Index ret = 0;
|
||||||
|
ret += test_compute_block_size<T>(0,1,1);
|
||||||
|
ret += test_compute_block_size<T>(1,0,1);
|
||||||
|
ret += test_compute_block_size<T>(1,1,0);
|
||||||
|
ret += test_compute_block_size<T>(0,0,1);
|
||||||
|
ret += test_compute_block_size<T>(0,1,0);
|
||||||
|
ret += test_compute_block_size<T>(1,0,0);
|
||||||
|
ret += test_compute_block_size<T>(0,0,0);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
void test_product_extra()
|
void test_product_extra()
|
||||||
{
|
{
|
||||||
for(int i = 0; i < g_repeat; i++) {
|
for(int i = 0; i < g_repeat; i++) {
|
||||||
@ -198,6 +222,9 @@ void test_product_extra()
|
|||||||
CALL_SUBTEST_4( product_extra(MatrixXcd(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2), internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2))) );
|
CALL_SUBTEST_4( product_extra(MatrixXcd(internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2), internal::random<int>(1,EIGEN_TEST_MAX_SIZE/2))) );
|
||||||
CALL_SUBTEST_1( zero_sized_objects(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
CALL_SUBTEST_1( zero_sized_objects(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
||||||
}
|
}
|
||||||
CALL_SUBTEST_5( bug_127() );
|
CALL_SUBTEST_5( bug_127<0>() );
|
||||||
CALL_SUBTEST_6( unaligned_objects() );
|
CALL_SUBTEST_6( unaligned_objects<0>() );
|
||||||
|
CALL_SUBTEST_7( compute_block_size<float>() );
|
||||||
|
CALL_SUBTEST_7( compute_block_size<double>() );
|
||||||
|
CALL_SUBTEST_7( compute_block_size<std::complex<double> >() );
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user