@@ -74,7 +74,6 @@ function CuSparseMatrixCSR{T}(S::Adjoint{T, <:CuSparseMatrixCSC{T}}) where {T <:
74
74
return CuSparseMatrixCSR {T} (csc. colPtr, csc. rowVal, conj .(csc. nzVal), size (csc))
75
75
end
76
76
77
-
78
77
# by flipping rows and columns, we can use that to get CSC to CSR too
79
78
for (fname,elty) in ((:cusparseScsr2csc , :Float32 ),
80
79
(:cusparseDcsr2csc , :Float64 ),
@@ -141,6 +140,8 @@ for (fname,elty) in ((:cusparseScsr2csc, :Float32),
141
140
end
142
141
end
143
142
143
+ # implement Float16 conversions using wider types
144
+ # TODO : Float16 is sometimes natively supported
144
145
for (elty, welty) in ((:Float16 , :Float32 ),
145
146
(:ComplexF16 , :ComplexF32 ))
146
147
@eval begin
@@ -204,6 +205,46 @@ for (elty, welty) in ((:Float16, :Float32),
204
205
end
205
206
end
206
207
208
+ # implement Int conversions using reinterpreted Float
209
+ for (elty, felty) in ((:Int16 , :Float16 ),
210
+ (:Int32 , :Float32 ),
211
+ (:Int64 , :Float64 ),
212
+ (:Int128 , :ComplexF64 ))
213
+ @eval begin
214
+ function CuSparseMatrixCSR {$elty} (csc:: CuSparseMatrixCSC{$elty} )
215
+ csc_compat = CuSparseMatrixCSC (
216
+ csc. colPtr,
217
+ csc. rowVal,
218
+ reinterpret ($ felty, csc. nzVal),
219
+ size (csc)
220
+ )
221
+ csr_compat = CuSparseMatrixCSR (csc_compat)
222
+ CuSparseMatrixCSR (
223
+ csr_compat. rowPtr,
224
+ csr_compat. colVal,
225
+ reinterpret ($ elty, csr_compat. nzVal),
226
+ size (csr_compat)
227
+ )
228
+ end
229
+
230
+ function CuSparseMatrixCSC {$elty} (csr:: CuSparseMatrixCSR{$elty} )
231
+ csr_compat = CuSparseMatrixCSR (
232
+ csr. rowPtr,
233
+ csr. colVal,
234
+ reinterpret ($ felty, csr. nzVal),
235
+ size (csr)
236
+ )
237
+ csc_compat = CuSparseMatrixCSC (csr_compat)
238
+ CuSparseMatrixCSC (
239
+ csc_compat. colPtr,
240
+ csc_compat. rowVal,
241
+ reinterpret ($ elty, csc_compat. nzVal),
242
+ size (csc_compat)
243
+ )
244
+ end
245
+ end
246
+ end
247
+
207
248
# # CSR to BSR and vice-versa
208
249
209
250
for (fname,elty) in ((:cusparseScsr2bsr , :Float32 ),
@@ -260,6 +301,52 @@ for (fname,elty) in ((:cusparseSbsr2csr, :Float32),
260
301
end
261
302
end
262
303
304
+ # implement Int conversions using reinterpreted Float
305
+ for (elty, felty) in ((:Int16 , :Float16 ),
306
+ (:Int32 , :Float32 ),
307
+ (:Int64 , :Float64 ),
308
+ (:Int128 , :ComplexF64 ))
309
+ @eval begin
310
+ function CuSparseMatrixCSR {$elty} (bsr:: CuSparseMatrixBSR{$elty} )
311
+ bsr_compat = CuSparseMatrixBSR (
312
+ bsr. rowPtr,
313
+ bsr. colVal,
314
+ reinterpret ($ felty, bsr. nzVal),
315
+ bsr. blockDim,
316
+ bsr. dir,
317
+ bsr. nnzb,
318
+ size (bsr)
319
+ )
320
+ csr_compat = CuSparseMatrixCSR (bsr_compat)
321
+ CuSparseMatrixCSR (
322
+ csr_compat. rowPtr,
323
+ csr_compat. colVal,
324
+ reinterpret ($ elty, csr_compat. nzVal),
325
+ size (csr_compat)
326
+ )
327
+ end
328
+
329
+ function CuSparseMatrixBSR {$elty} (csr:: CuSparseMatrixCSR{$elty} , blockDim)
330
+ csr_compat = CuSparseMatrixCSR (
331
+ csr. rowPtr,
332
+ csr. colVal,
333
+ reinterpret ($ felty, csr. nzVal),
334
+ size (csr)
335
+ )
336
+ bsr_compat = CuSparseMatrixBSR (csr_compat, blockDim)
337
+ CuSparseMatrixBSR (
338
+ bsr_compat. rowPtr,
339
+ bsr_compat. colVal,
340
+ reinterpret ($ elty, bsr_compat. nzVal),
341
+ bsr_compat. blockDim,
342
+ bsr_compat. dir,
343
+ bsr_compat. nnzb,
344
+ size (bsr_compat)
345
+ )
346
+ end
347
+ end
348
+ end
349
+
263
350
# # CSR to COO and vice-versa
264
351
265
352
function CuSparseMatrixCSR (coo:: CuSparseMatrixCOO{Tv} , ind:: SparseChar = ' O' ) where {Tv}
0 commit comments