@@ -70,6 +70,9 @@ object JvmDoubleMatrix:
7070
7171 // inline def *:*=(d: Double): Unit = m.raw.multInPlace(d)
7272
73+
74+ // TODO: Dim check
75+
7376 inline def * (vec : Array [Double ])(using inline boundsCheck : BoundsCheck ): Array [Double ] =
7477 val newArr = Array .ofDim[Double ](m.rows)
7578 blas.dgemv(
@@ -112,46 +115,64 @@ object JvmDoubleMatrix:
112115 import vecxt .BoundsCheck .DoBoundsCheck .no
113116 if m.hasSimpleContiguousMemoryLayout then vecxt.arrays.+= (m.raw)(n)
114117 else
118+ println(s " .offset: ${m.offset}, m.rowStride: ${m.rowStride}, m.colStride: ${m.colStride}" )
115119 // Cache-friendly fallback: iterate with smallest stride in inner loop
116120 // (m.offset + row * m.rowStride + col * m.colStride
117121 if m.rowStride <= m.colStride then
118122 // Row stride is smaller, so iterate rows in inner loop
119123 val rowStrides = IntVector .zero(sp_int_doubleLanes).addIndex(m.rowStride).toArray
124+ // println(m.offset)
125+ // println(s"colStrides: ${rowStrides.mkString(", ")}")
126+ // println(s"m.raw: ${m.raw.mkString(", ")}")
127+ // println(s"m.rows: ${m.rows}, m.cols: ${m.cols}")
128+ // println(s"m.rowStride: ${m.rowStride}, m.colStride: ${m.colStride}")
120129 var j = 0
121130 while j < m.cols do
122131 var i = 0
123132 var blockIndex = m.offset + j * m.colStride
124133 val upperBound = sp_int_doubleLanes.loopBound(m.rows)
125134 while i < upperBound do
135+ val iBlockIndex = blockIndex + i * m.rowStride
126136 DoubleVector
127- .fromArray(vecxt.arrays.spd, m.raw, blockIndex , rowStrides, 0 )
128- .mul (n)
129- .intoArray(m.raw, blockIndex , rowStrides, 0 )
137+ .fromArray(vecxt.arrays.spd, m.raw, iBlockIndex , rowStrides, 0 )
138+ .add (n)
139+ .intoArray(m.raw, iBlockIndex , rowStrides, 0 )
130140 i += sp_int_doubleLanes.length
131141 end while
132142 while i < m.rows do
143+ m.elementIndex(i, j)(using BoundsCheck .DoBoundsCheck .yes)
133144 m(i, j) = n + m(i, j)
134145 i += 1
135146 end while
147+
136148 j += 1
137149 end while
138150 else
139151 // Column stride is smaller, so iterate columns in inner loop
140152 val colStrides = IntVector .zero(sp_int_doubleLanes).addIndex(m.colStride).toArray
153+ // println(m.offset)
154+ // println(s"colStrides: ${colStrides.mkString(", ")}")
155+ // println(s"m.raw: ${m.raw.mkString(", ")}")
156+ // println(s"m.rows: ${m.rows}, m.cols: ${m.cols}")
157+ // println(s"m.rowStride: ${m.rowStride}, m.colStride: ${m.colStride}")
141158 var i = 0
142159 while i < m.rows do
143160 var j = 0
144161 val upperBound = sp_int_doubleLanes.loopBound(m.cols)
145- val blockIndex = m.offset + i * m.rowStride
146- while j < upperBound do
147162
163+ var blockIndex = m.offset + i * m.rowStride
164+ while j < upperBound do
165+ val jblockIndex = blockIndex + j * m.colStride
148166 DoubleVector
149- .fromArray(vecxt.arrays.spd, m.raw, blockIndex , colStrides, 0 )
167+ .fromArray(vecxt.arrays.spd, m.raw, jblockIndex , colStrides, 0 )
150168 .add(n)
151- .intoArray(m.raw, blockIndex, colStrides, 0 )
169+ .intoArray(m.raw, jblockIndex, colStrides, 0 )
170+
152171 j += sp_int_doubleLanes.length
153172 end while
173+
154174 while j < m.cols do
175+ m.elementIndex(i, j)(using BoundsCheck .DoBoundsCheck .yes)
155176 m(i, j) = n + m(i, j)
156177 j += 1
157178 end while
0 commit comments