@@ -48,11 +48,44 @@ void MatVec(Matrix<T>& A, Matrix<T>& x, Matrix<T>& y) {
48
48
size_t n = A.rows ;
49
49
MatVecMainLoop (&A, &x, &y, n, 0 , n);
50
50
}
51
+
52
+ template <typename T>
53
+ void MatVecWrongLoop2 (Matrix<T>* A, Matrix<T>* x, Matrix<T>* y, size_t n,
54
+ size_t i, size_t j1, size_t j2) {
55
+ if (j1 == j2 - 1 )
56
+ (*y)[i][0 ] += (*A)[i][j1] * (*x)[j1][0 ];
57
+ else {
58
+ size_t mid = (j1 + j2) / 2 ;
59
+ std::thread t1 (MatVecWrongLoop2<T>, A, x, y, n, i, j1, mid);
60
+ MatVecWrongLoop2 (A, x, y, n, i, mid, j2);
61
+ t1.join ();
62
+ }
63
+ }
64
+
65
+ template <typename T>
66
+ void MatVecWrongLoop1 (Matrix<T>* A, Matrix<T>* x, Matrix<T>* y, size_t n,
67
+ size_t i1, size_t i2) {
68
+ if (i1 == i2 - 1 )
69
+ MatVecWrongLoop2 (A, x, y, n, i1, 0 , n);
70
+ else {
71
+ size_t mid = (i1 + i2) / 2 ;
72
+ std::thread t1 (MatVecWrongLoop1<T>, A, x, y, n, i1, mid);
73
+ MatVecWrongLoop1 (A, x, y, n, mid, i2);
74
+ t1.join ();
75
+ }
76
+ }
77
+
78
+ template <typename T>
79
+ void MatVecWrong (Matrix<T>& A, Matrix<T>& x, Matrix<T>& y) {
80
+ size_t n = A.rows ;
81
+ MatVecWrongLoop1 (&A, &x, &y, n, 0 , n);
82
+ }
51
83
#endif
52
84
53
85
#ifdef MAIN_MatVec
54
86
int main (int argc, char *argv[]) {
55
87
size_t n = get_argv (argc, argv, 1 , 10 );
88
+ size_t compute = get_argv (argc, argv, 2 , 1 );
56
89
std::vector<int > buf_A, buf_x;
57
90
random_integers (buf_A, 0 , n, n * n);
58
91
random_integers (buf_x, 0 , n, n);
@@ -63,6 +96,12 @@ int main(int argc, char *argv[]) {
63
96
std::cout << A << std::endl;
64
97
std::cout << x << std::endl;
65
98
std::cout << y << std::endl;
99
+ if (compute) {
100
+ Matrix<int > yw (n, 1 , 0 );
101
+ MatVecWrong (A, x, yw);
102
+ std::cout << yw << std::endl;
103
+ std::cout << std::boolalpha << (y == yw) << std::endl;
104
+ }
66
105
return 0 ;
67
106
}
68
107
#endif
0 commit comments