aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/cuda_basic.cu
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2014-01-24 12:50:29 +0100
committerGravatar Gael Guennebaud <g.gael@free.fr>2014-01-24 12:50:29 +0100
commitdeab937d4526c4542d13aa2654e8d898aab9a28b (patch)
treecba601bfc4d737a7e0bd28bd127870a70e743dcb /test/cuda_basic.cu
parent66f1c56aabc4ec4789405d11f544806312d49cd6 (diff)
NVCC: fix closed-form eigenvalue decomposition, workaround gcc4.7/nvcc5.5 issue
Diffstat (limited to 'test/cuda_basic.cu')
-rw-r--r--test/cuda_basic.cu31
1 files changed, 26 insertions, 5 deletions
diff --git a/test/cuda_basic.cu b/test/cuda_basic.cu
index a062947a8..aa7f7a599 100644
--- a/test/cuda_basic.cu
+++ b/test/cuda_basic.cu
@@ -1,8 +1,16 @@
+// workaround issue between gcc >= 4.7 and cuda 5.5
+#if (defined __GNUC__) && (__GNUC__>4 || __GNUC_MINOR__>=7)
+ #undef _GLIBCXX_ATOMIC_BUILTINS
+ #undef _GLIBCXX_USE_INT128
+#endif
+
#define EIGEN_TEST_NO_LONGDOUBLE
#define EIGEN_TEST_NO_COMPLEX
#define EIGEN_TEST_FUNC cuda_basic
+#define EIGEN_DEFAULT_DENSE_INDEX_TYPE int
+
#include "main.h"
#include "cuda_common.h"
@@ -70,6 +78,17 @@ struct prod {
}
};
+template<typename T1, typename T2>
+struct diagonal {
+ EIGEN_DEVICE_FUNC
+ void operator()(int i, const typename T1::Scalar* in, typename T1::Scalar* out) const
+ {
+ using namespace Eigen;
+ T1 x1(in+i);
+ Map<T2> res(out+i*T2::MaxSizeAtCompileTime);
+ res += x1.diagonal();
+ }
+};
template<typename T>
struct eigenvalues {
@@ -82,12 +101,11 @@ struct eigenvalues {
Map<Vec> res(out+i*Vec::MaxSizeAtCompileTime);
T A = M*M.adjoint();
SelfAdjointEigenSolver<T> eig;
- eig.computeDirect(A);
- res = A.eigenvalues();
+ eig.computeDirect(M);
+ res = eig.eigenvalues();
}
};
-
void test_cuda_basic()
{
ei_test_init_cuda();
@@ -110,7 +128,10 @@ void test_cuda_basic()
CALL_SUBTEST( run_and_compare_to_cuda(prod<Matrix3f,Matrix3f>(), nthreads, in, out) );
CALL_SUBTEST( run_and_compare_to_cuda(prod<Matrix4f,Vector4f>(), nthreads, in, out) );
-// CALL_SUBTEST( run_and_compare_to_cuda(eigenvalues<Matrix3f>(), nthreads, in, out) );
-// CALL_SUBTEST( run_and_compare_to_cuda(eigenvalues<Matrix2f>(), nthreads, in, out) );
+ CALL_SUBTEST( run_and_compare_to_cuda(diagonal<Matrix3f,Vector3f>(), nthreads, in, out) );
+ CALL_SUBTEST( run_and_compare_to_c<uda(diagonal<Matrix4f,Vector4f>(), nthreads, in, out) );
+
+ CALL_SUBTEST( run_and_compare_to_cuda(eigenvalues<Matrix3f>(), nthreads, in, out) );
+ CALL_SUBTEST( run_and_compare_to_cuda(eigenvalues<Matrix2f>(), nthreads, in, out) );
}