Skip to content

Commit 1918508

Browse files
authored
Fix matrix data offset for large matrices (#4823)
* Fix matrix data offset for large matrices * Fix overflow in cudamatrix too
1 parent 9a8588a commit 1918508

File tree

2 files changed

+13
-13
lines changed

2 files changed

+13
-13
lines changed

src/cudamatrix/cu-matrix.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ class CuMatrixBase {
231231
bool ApproxEqual(const CuMatrixBase<Real> &other, float tol = 0.01) const;
232232

233233
/// Get size of matrix in bytes
234-
MatrixIndexT SizeInBytes() const { return num_rows_*stride_*sizeof(Real); }
234+
size_t SizeInBytes() const { return static_cast<size_t>(num_rows_)*static_cast<size_t>(stride_)*sizeof(Real); }
235235

236236
// Copy functions. These do not resize.
237237
template<typename OtherReal>
@@ -670,29 +670,29 @@ class CuMatrixBase {
670670
inline const CuSubVector<Real> Row(MatrixIndexT i) const {
671671
KALDI_ASSERT(static_cast<UnsignedMatrixIndexT>(i) <
672672
static_cast<UnsignedMatrixIndexT>(num_rows_));
673-
return CuSubVector<Real>(data_ + (i * stride_), NumCols());
673+
return CuSubVector<Real>(data_ + (static_cast<size_t>(i) * static_cast<size_t>(stride_)), NumCols());
674674
}
675675

676676
inline CuSubVector<Real> Row(MatrixIndexT i) {
677677
KALDI_ASSERT(static_cast<UnsignedMatrixIndexT>(i) <
678678
static_cast<UnsignedMatrixIndexT>(num_rows_));
679-
return CuSubVector<Real>(data_ + (i * stride_), NumCols());
679+
return CuSubVector<Real>(data_ + (static_cast<size_t>(i) * static_cast<size_t>(stride_)), NumCols());
680680
}
681681

682682
inline CuValue<Real> operator() (MatrixIndexT r, MatrixIndexT c) {
683683
KALDI_PARANOID_ASSERT(static_cast<UnsignedMatrixIndexT>(r) <
684684
static_cast<UnsignedMatrixIndexT>(num_rows_) &&
685685
static_cast<UnsignedMatrixIndexT>(c) <
686686
static_cast<UnsignedMatrixIndexT>(num_cols_));
687-
return CuValue<Real>(data_ + r * stride_ + c);
687+
return CuValue<Real>(data_ + static_cast<size_t>(r) * static_cast<size_t>(stride_) + c);
688688
}
689689

690690
inline Real operator() (MatrixIndexT r, MatrixIndexT c) const {
691691
KALDI_PARANOID_ASSERT(static_cast<UnsignedMatrixIndexT>(r) <
692692
static_cast<UnsignedMatrixIndexT>(num_rows_) &&
693693
static_cast<UnsignedMatrixIndexT>(c) <
694694
static_cast<UnsignedMatrixIndexT>(num_cols_));
695-
return CuValue<Real>(data_ + r * stride_ + c); // will be casted to Real.
695+
return CuValue<Real>(data_ + static_cast<size_t>(r) * static_cast<size_t>(stride_) + c); // will be casted to Real.
696696
}
697697

698698
Real Sum() const;
@@ -737,10 +737,10 @@ class CuMatrixBase {
737737

738738
/// Get raw row pointer (const). Warning: may return a pointer to GPU memory. Use at
739739
/// your own risk.
740-
inline const Real* RowData(MatrixIndexT r) const { return data_ + r * stride_; }
740+
inline const Real* RowData(MatrixIndexT r) const { return data_ + static_cast<size_t>(r) * static_cast<size_t>(stride_); }
741741
/// Get raw row pointer. Warning: may return a pointer to GPU memory. Use at
742742
/// your own risk.
743-
inline Real* RowData(MatrixIndexT r) { return data_ + r * stride_; }
743+
inline Real* RowData(MatrixIndexT r) { return data_ + static_cast<size_t>(r) * static_cast<size_t>(stride_); }
744744
/// Return data pointer (const). Warning: may return a pointer to GPU memory.
745745
/// Use at your own risk.
746746
inline const Real *Data() const { return data_; }

src/matrix/kaldi-matrix.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,14 @@ class MatrixBase {
8787
inline Real* RowData(MatrixIndexT i) {
8888
KALDI_ASSERT(static_cast<UnsignedMatrixIndexT>(i) <
8989
static_cast<UnsignedMatrixIndexT>(num_rows_));
90-
return data_ + i * stride_;
90+
return data_ + static_cast<size_t>(i) * static_cast<size_t>(stride_);
9191
}
9292

9393
/// Returns pointer to data for one row (const)
9494
inline const Real* RowData(MatrixIndexT i) const {
9595
KALDI_ASSERT(static_cast<UnsignedMatrixIndexT>(i) <
9696
static_cast<UnsignedMatrixIndexT>(num_rows_));
97-
return data_ + i * stride_;
97+
return data_ + static_cast<size_t>(i) * static_cast<size_t>(stride_);
9898
}
9999

100100
/// Indexing operator, non-const
@@ -104,7 +104,7 @@ class MatrixBase {
104104
static_cast<UnsignedMatrixIndexT>(num_rows_) &&
105105
static_cast<UnsignedMatrixIndexT>(c) <
106106
static_cast<UnsignedMatrixIndexT>(num_cols_));
107-
return *(data_ + r * stride_ + c);
107+
return *(data_ + static_cast<size_t>(r) * static_cast<size_t>(stride_) + c);
108108
}
109109
/// Indexing operator, provided for ease of debugging (gdb doesn't work
110110
/// with parenthesis operator).
@@ -117,7 +117,7 @@ class MatrixBase {
117117
static_cast<UnsignedMatrixIndexT>(num_rows_) &&
118118
static_cast<UnsignedMatrixIndexT>(c) <
119119
static_cast<UnsignedMatrixIndexT>(num_cols_));
120-
return *(data_ + r * stride_ + c);
120+
return *(data_ + static_cast<size_t>(r) * static_cast<size_t>(stride_) + c);
121121
}
122122

123123
/* Basic setting-to-special values functions. */
@@ -188,14 +188,14 @@ class MatrixBase {
188188
inline const SubVector<Real> Row(MatrixIndexT i) const {
189189
KALDI_ASSERT(static_cast<UnsignedMatrixIndexT>(i) <
190190
static_cast<UnsignedMatrixIndexT>(num_rows_));
191-
return SubVector<Real>(data_ + (i * stride_), NumCols());
191+
return SubVector<Real>(data_ + (static_cast<size_t>(i) * static_cast<size_t>(stride_)), NumCols());
192192
}
193193

194194
/// Return specific row of matrix.
195195
inline SubVector<Real> Row(MatrixIndexT i) {
196196
KALDI_ASSERT(static_cast<UnsignedMatrixIndexT>(i) <
197197
static_cast<UnsignedMatrixIndexT>(num_rows_));
198-
return SubVector<Real>(data_ + (i * stride_), NumCols());
198+
return SubVector<Real>(data_ + (static_cast<size_t>(i) * static_cast<size_t>(stride_)), NumCols());
199199
}
200200

201201
/// Return a sub-part of matrix.

0 commit comments

Comments
 (0)