@@ -54,6 +54,14 @@ k = 13
54
54
end
55
55
@test inv (P)* dL* dU ≈ inv (C. P) * C. L * C. U
56
56
end
57
+ # generate bad matrices
58
+ A_bad = vcat ([rand (elty,m,m) for i in 1 : 9 ], [rand (elty, m, m+ 1 )])
59
+ # move to device
60
+ d_A_bad = CuArray{elty, 2 }[]
61
+ for i in 1 : length (A)
62
+ push! (d_A_bad,CuArray (A_bad[i]))
63
+ end
64
+ @test_throws DimensionMismatch CUBLAS. getrf_batched! (d_A_bad, true )
57
65
end
58
66
59
67
@testset " getrf_batched" begin
@@ -128,6 +136,11 @@ k = 13
128
136
end
129
137
@test inv (P)* dL* dU ≈ inv (C. P) * C. L * C. U
130
138
end
139
+ # generate bad strided matrix
140
+ A = rand (elty,m,m+ 1 ,10 )
141
+ # move to device
142
+ d_A = CuArray (A)
143
+ @test_throws DimensionMismatch CUBLAS. getrf_strided_batched! (d_A, true )
131
144
end
132
145
133
146
@testset " getrf_strided_batched" begin
@@ -168,24 +181,41 @@ k = 13
168
181
for (opchar,opfun) in ((' N' ,identity), (' T' ,transpose), (' C' ,adjoint))
169
182
170
183
@testset " getrs_batched!" begin
171
- A = [rand (elty,n,n) for _ in 1 : k];
172
- d_A = [CuArray (a) for a in A];
173
- d_A2 = deepcopy (d_A);
174
- d_pivot, info, d_LU = CUDA. CUBLAS. getrf_batched! (d_A, true );
184
+ A = [rand (elty,n,n) for _ in 1 : k]
185
+ d_A = [CuArray (a) for a in A]
186
+ d_A2 = deepcopy (d_A)
187
+ d_pivot, info, d_LU = CUDA. CUBLAS. getrf_batched! (d_A, true )
175
188
@test d_LU == d_A
176
- d_pivot2 = similar (d_pivot);
177
- info2 = similar (info);
178
- CUDA. CUBLAS. getrf_batched! (d_A2, d_pivot2, info2);
189
+ d_pivot2 = similar (d_pivot)
190
+ info2 = similar (info)
191
+ CUDA. CUBLAS. getrf_batched! (d_A2, d_pivot2, info2)
179
192
@test isapprox (d_pivot, d_pivot2)
180
193
@test isapprox (info, info2)
181
- B = [rand (elty,n,m) for _ in 1 : k];
182
- d_B = [CuArray (b) for b in B];
183
- info2, d_Bhat = CUDA. CUBLAS. getrs_batched! (opchar, d_LU, d_B, d_pivot);
194
+ B = [rand (elty,n,m) for _ in 1 : k]
195
+ d_B = [CuArray (b) for b in B]
196
+ info2, d_Bhat = CUDA. CUBLAS. getrs_batched! (opchar, d_LU, d_B, d_pivot)
184
197
@test d_Bhat == d_B
185
- h_Bhat = [collect (bh) for bh in d_Bhat];
198
+ h_Bhat = [collect (bh) for bh in d_Bhat]
186
199
for i in 1 : k
187
200
@test h_Bhat[i] ≈ opfun (A[i]) \ B[i]
188
201
end
202
+
203
+ # generate bad matrices
204
+ A_bad = vcat ([rand (elty,m,m) for i in 1 : 9 ], [rand (elty, m, m+ 1 )])
205
+ # move to device
206
+ d_A_bad = CuArray{elty, 2 }[]
207
+ for i in 1 : length (A_bad)
208
+ push! (d_A_bad,CuArray (A_bad[i]))
209
+ end
210
+ @test_throws DimensionMismatch CUBLAS. getrs_batched! (opchar, d_A_bad, d_B, d_pivot)
211
+ # generate bad matrices
212
+ A_bad = [rand (elty,m+ 1 ,m+ 1 ) for i in 1 : 10 ]
213
+ # move to device
214
+ d_A_bad = CuArray{elty, 2 }[]
215
+ for i in 1 : length (A_bad)
216
+ push! (d_A_bad,CuArray (A_bad[i]))
217
+ end
218
+ @test_throws DimensionMismatch CUBLAS. getrs_batched! (opchar, d_A_bad, d_B, d_pivot)
189
219
end
190
220
191
221
@testset " getrs_batched" begin
@@ -210,24 +240,31 @@ k = 13
210
240
end
211
241
212
242
@testset " getrs_strided_batched!" begin
213
- A = rand (elty,n,n,k);
214
- d_A = CuArray (A);
215
- d_A2 = copy (d_A);
216
- d_pivot, info, d_LU = CUDA. CUBLAS. getrf_strided_batched! (d_A, true );
243
+ A = rand (elty,n,n,k)
244
+ d_A = CuArray (A)
245
+ d_A2 = copy (d_A)
246
+ d_pivot, info, d_LU = CUDA. CUBLAS. getrf_strided_batched! (d_A, true )
217
247
@test d_LU == d_A
218
- d_pivot2 = similar (d_pivot);
219
- info2 = similar (info);
220
- CUDA. CUBLAS. getrf_strided_batched! (d_A2, d_pivot2, info2);
248
+ d_pivot2 = similar (d_pivot)
249
+ info2 = similar (info)
250
+ CUDA. CUBLAS. getrf_strided_batched! (d_A2, d_pivot2, info2)
221
251
@test isapprox (d_pivot, d_pivot2)
222
252
@test isapprox (info, info2)
223
- B = rand (elty,n,m,k);
224
- d_B = CuArray (B);
225
- info2, d_Bhat = CUDA. CUBLAS. getrs_strided_batched! (opchar, d_LU, d_B, d_pivot);
253
+ B = rand (elty,n,m,k)
254
+ d_B = CuArray (B)
255
+ info2, d_Bhat = CUDA. CUBLAS. getrs_strided_batched! (opchar, d_LU, d_B, d_pivot)
226
256
@test d_Bhat == d_B
227
- h_Bhat = collect (d_Bhat);
257
+ h_Bhat = collect (d_Bhat)
228
258
for i in 1 : k
229
259
@test h_Bhat[:,:,i] ≈ opfun (A[:,:,i]) \ B[:,:,i]
230
260
end
261
+
262
+ A_bad = rand (elty,n+ 1 ,n,k)
263
+ d_A_bad = CuArray (A_bad)
264
+ @test_throws DimensionMismatch CUDA. CUBLAS. getrs_strided_batched! (opchar, d_A_bad, d_B, d_pivot)
265
+ A_bad = rand (elty,n+ 1 ,n+ 1 ,k)
266
+ d_A_bad = CuArray (A_bad)
267
+ @test_throws DimensionMismatch CUDA. CUBLAS. getrs_strided_batched! (opchar, d_A_bad, d_B, d_pivot)
231
268
end
232
269
233
270
@testset " getrs_strided_batched" begin
@@ -267,6 +304,12 @@ k = 13
267
304
@test h_info[Cs] == 0
268
305
@test B ≈ Array (d_B[:,:,Cs]) rtol= 1e-3
269
306
end
307
+
308
+ A_bad = rand (elty,m+ 1 ,m,10 )
309
+ d_A_bad = CuArray (A_bad)
310
+ d_B = similar (d_A)
311
+ pivot, info = CUBLAS. getrf_strided_batched! (d_A, true )
312
+ @test_throws DimensionMismatch CUBLAS. getri_strided_batched! (d_A_bad, d_B, pivot)
270
313
end
271
314
272
315
@testset " getri_batched" begin
@@ -290,6 +333,32 @@ k = 13
290
333
@test h_info[Cs] == 0
291
334
@test C ≈ h_C rtol= 1e-2
292
335
end
336
+
337
+ d_A = CuArray{elty, 2 }[]
338
+ for i in 1 : length (A)
339
+ push! (d_A,CuArray (A[i]))
340
+ end
341
+ pivot, info = CUBLAS. getrf_batched! (d_A, true )
342
+ h_info = Array (info)
343
+ for Cs in 1 : length (h_info)
344
+ @test h_info[Cs] == 0
345
+ end
346
+ d_C = CuMatrix{elty}[similar (d_A[1 ]) for i in 1 : length (d_A)]
347
+ info = CUBLAS. getri_batched! (d_A, d_C, pivot)
348
+ h_info = Array (info)
349
+ for Cs in 1 : length (d_C)
350
+ C = inv (A[Cs])
351
+ h_C = Array (d_C[Cs])
352
+ @test h_info[Cs] == 0
353
+ @test C ≈ h_C rtol= 1e-2
354
+ end
355
+
356
+ A_bad = [rand (elty,m+ 1 ,m) for i in 1 : 10 ]
357
+ d_A_bad = CuArray{elty, 2 }[]
358
+ for i in 1 : length (A)
359
+ push! (d_A_bad,CuArray (A_bad[i]))
360
+ end
361
+ @test_throws DimensionMismatch CUBLAS. getri_batched (d_A_bad, pivot)
293
362
end
294
363
295
364
@testset " matinv_batched" begin
@@ -308,6 +377,15 @@ k = 13
308
377
end
309
378
push! (d_A, CUDA. rand (elty, m, m+ 1 ))
310
379
@test_throws DimensionMismatch CUBLAS. matinv_batched (d_A)
380
+
381
+ # matinv_batched only supports matrices smaller than 32x32
382
+ A = [rand (elty,64 ,64 ) for i in 1 : 10 ]
383
+ # move to device
384
+ d_A_too_big = CuArray{elty, 2 }[]
385
+ for i in 1 : length (A)
386
+ push! (d_A_too_big,CuArray (A[i]))
387
+ end
388
+ @test_throws ArgumentError (" matinv requires all matrices be smaller than 32 x 32" ) CUBLAS. matinv_batched (d_A_too_big)
311
389
end
312
390
313
391
@testset " geqrf_batched!" begin
@@ -343,7 +421,7 @@ k = 13
343
421
for i in 1 : length (A)
344
422
push! (d_A,CuArray (A[i]))
345
423
end
346
- tau, d_B = CUBLAS. geqrf_batched! (d_A)
424
+ tau, d_B = CUBLAS. geqrf_batched (d_A)
347
425
for Bs in 1 : length (d_B)
348
426
C = qr (A[Bs])
349
427
h_B = Array (d_B[Bs])
@@ -392,6 +470,18 @@ k = 13
392
470
end
393
471
# system is now not overdetermined
394
472
@test_throws ArgumentError CUBLAS. gels_batched! (' N' ,d_A, d_C)
473
+
474
+ # generate bad matrices
475
+ A = [rand (elty,n,k) for i in 1 : 10 ]
476
+ C = [rand (elty,n+ 1 ,k) for i in 1 : 10 ]
477
+ # move to device
478
+ d_A = CuArray{elty, 2 }[]
479
+ d_C = CuArray{elty, 2 }[]
480
+ for i in 1 : length (A)
481
+ push! (d_A,CuArray (A[i]))
482
+ push! (d_C,CuArray (C[i]))
483
+ end
484
+ @test_throws DimensionMismatch CUBLAS. gels_batched! (' N' ,d_A, d_C)
395
485
end
396
486
397
487
@testset " gels_batched" begin
0 commit comments