22 Designed to run with n processes
33 $ mpiexec -n 10 pytest test_derivative.py --with-mpi
44"""
5- import numpy as np
5+ import os
6+
7+ if int (os .environ .get ("TEST_CUPY_PYLOPS" , 0 )):
8+ import cupy as np
9+ from cupy .testing import assert_allclose
10+
11+ backend = "cupy"
12+ else :
13+ import numpy as np
14+ from numpy .testing import assert_allclose
15+
16+ backend = "numpy"
17+ import numpy as npp
618from mpi4py import MPI
7- from numpy .testing import assert_allclose
819import pytest
920
1021import pylops
1425np .random .seed (42 )
1526rank = MPI .COMM_WORLD .Get_rank ()
1627size = MPI .COMM_WORLD .Get_size ()
28+ if backend == "cupy" :
29+ device_id = rank % np .cuda .runtime .getDeviceCount ()
30+ np .cuda .Device (device_id ).use ()
31+
1732
1833par1 = {
1934 "nz" : 600 ,
@@ -189,8 +204,8 @@ def test_first_derivative_forward(par):
189204 Fop_MPI = pylops_mpi .MPIFirstDerivative (dims = par ['nz' ], sampling = par ['dz' ],
190205 kind = "forward" , edge = par ['edge' ],
191206 dtype = par ['dtype' ])
192- x = pylops_mpi .DistributedArray (global_shape = np .prod (par ['nz' ]), dtype = par ['dtype' ],
193- partition = par ['partition' ])
207+ x = pylops_mpi .DistributedArray (global_shape = npp .prod (par ['nz' ]), dtype = par ['dtype' ],
208+ partition = par ['partition' ], engine = backend )
194209 x [:] = np .random .normal (rank , 10 , x .local_shape )
195210 x_global = x .asarray ()
196211 # Forward
@@ -200,7 +215,7 @@ def test_first_derivative_forward(par):
200215 y_adj_dist = Fop_MPI .H @ x
201216 y_adj = y_adj_dist .asarray ()
202217 # Dot test
203- dottest (Fop_MPI , x , y_dist , np .prod (par ['nz' ]), np .prod (par ['nz' ]))
218+ dottest (Fop_MPI , x , y_dist , npp .prod (par ['nz' ]), npp .prod (par ['nz' ]))
204219
205220 if rank == 0 :
206221 Fop = pylops .FirstDerivative (dims = par ['nz' ], axis = 0 ,
@@ -223,8 +238,8 @@ def test_first_derivative_backward(par):
223238 Fop_MPI = pylops_mpi .MPIFirstDerivative (dims = par ['nz' ], sampling = par ['dz' ],
224239 kind = "backward" , edge = par ['edge' ],
225240 dtype = par ['dtype' ])
226- x = pylops_mpi .DistributedArray (global_shape = np .prod (par ['nz' ]), dtype = par ['dtype' ],
227- partition = par ['partition' ])
241+ x = pylops_mpi .DistributedArray (global_shape = npp .prod (par ['nz' ]), dtype = par ['dtype' ],
242+ partition = par ['partition' ], engine = backend )
228243 x [:] = np .random .normal (rank , 10 , x .local_shape )
229244 x_global = x .asarray ()
230245 # Forward
@@ -234,7 +249,7 @@ def test_first_derivative_backward(par):
234249 y_adj_dist = Fop_MPI .H @ x
235250 y_adj = y_adj_dist .asarray ()
236251 # Dot test
237- dottest (Fop_MPI , x , y_dist , np .prod (par ['nz' ]), np .prod (par ['nz' ]))
252+ dottest (Fop_MPI , x , y_dist , npp .prod (par ['nz' ]), npp .prod (par ['nz' ]))
238253
239254 if rank == 0 :
240255 Fop = pylops .FirstDerivative (dims = par ['nz' ], axis = 0 ,
@@ -258,8 +273,8 @@ def test_first_derivative_centered(par):
258273 Fop_MPI = pylops_mpi .MPIFirstDerivative (dims = par ['nz' ], sampling = par ['dz' ],
259274 kind = "centered" , edge = par ['edge' ],
260275 order = order , dtype = par ['dtype' ])
261- x = pylops_mpi .DistributedArray (global_shape = np .prod (par ['nz' ]), dtype = par ['dtype' ],
262- partition = par ['partition' ])
276+ x = pylops_mpi .DistributedArray (global_shape = npp .prod (par ['nz' ]), dtype = par ['dtype' ],
277+ partition = par ['partition' ], engine = backend )
263278 x [:] = np .random .normal (rank , 10 , x .local_shape )
264279 x_global = x .asarray ()
265280 # Forward
@@ -269,7 +284,7 @@ def test_first_derivative_centered(par):
269284 y_adj_dist = Fop_MPI .H @ x
270285 y_adj = y_adj_dist .asarray ()
271286 # Dot test
272- dottest (Fop_MPI , x , y_dist , np .prod (par ['nz' ]), np .prod (par ['nz' ]))
287+ dottest (Fop_MPI , x , y_dist , npp .prod (par ['nz' ]), npp .prod (par ['nz' ]))
273288
274289 if rank == 0 :
275290 Fop = pylops .FirstDerivative (dims = par ['nz' ], axis = 0 ,
@@ -292,8 +307,8 @@ def test_second_derivative_forward(par):
292307 Sop_MPI = pylops_mpi .basicoperators .MPISecondDerivative (dims = par ['nz' ], sampling = par ['dz' ],
293308 kind = "forward" , edge = par ['edge' ],
294309 dtype = par ['dtype' ])
295- x = pylops_mpi .DistributedArray (global_shape = np .prod (par ['nz' ]), dtype = par ['dtype' ],
296- partition = par ['partition' ])
310+ x = pylops_mpi .DistributedArray (global_shape = npp .prod (par ['nz' ]), dtype = par ['dtype' ],
311+ partition = par ['partition' ], engine = backend )
297312 x [:] = np .random .normal (rank , 10 , x .local_shape )
298313 x_global = x .asarray ()
299314 # Forward
@@ -303,7 +318,7 @@ def test_second_derivative_forward(par):
303318 y_adj_dist = Sop_MPI .H @ x
304319 y_adj = y_adj_dist .asarray ()
305320 # Dot test
306- dottest (Sop_MPI , x , y_dist , np .prod (par ['nz' ]), np .prod (par ['nz' ]))
321+ dottest (Sop_MPI , x , y_dist , npp .prod (par ['nz' ]), npp .prod (par ['nz' ]))
307322
308323 if rank == 0 :
309324 Sop = pylops .SecondDerivative (dims = par ['nz' ], axis = 0 ,
@@ -326,8 +341,8 @@ def test_second_derivative_backward(par):
326341 Sop_MPI = pylops_mpi .basicoperators .MPISecondDerivative (dims = par ['nz' ], sampling = par ['dz' ],
327342 kind = "backward" , edge = par ['edge' ],
328343 dtype = par ['dtype' ])
329- x = pylops_mpi .DistributedArray (global_shape = np .prod (par ['nz' ]), dtype = par ['dtype' ],
330- partition = par ['partition' ])
344+ x = pylops_mpi .DistributedArray (global_shape = npp .prod (par ['nz' ]), dtype = par ['dtype' ],
345+ partition = par ['partition' ], engine = backend )
331346 x [:] = np .random .normal (rank , 10 , x .local_shape )
332347 x_global = x .asarray ()
333348 # Forward
@@ -337,7 +352,7 @@ def test_second_derivative_backward(par):
337352 y_adj_dist = Sop_MPI .H @ x
338353 y_adj = y_adj_dist .asarray ()
339354 # Dot test
340- dottest (Sop_MPI , x , y_dist , np .prod (par ['nz' ]), np .prod (par ['nz' ]))
355+ dottest (Sop_MPI , x , y_dist , npp .prod (par ['nz' ]), npp .prod (par ['nz' ]))
341356
342357 if rank == 0 :
343358 Sop = pylops .SecondDerivative (dims = par ['nz' ], axis = 0 ,
@@ -360,8 +375,8 @@ def test_second_derivative_centered(par):
360375 Sop_MPI = pylops_mpi .basicoperators .MPISecondDerivative (dims = par ['nz' ], sampling = par ['dz' ],
361376 kind = "centered" , edge = par ['edge' ],
362377 dtype = par ['dtype' ])
363- x = pylops_mpi .DistributedArray (global_shape = np .prod (par ['nz' ]), dtype = par ['dtype' ],
364- partition = par ['partition' ])
378+ x = pylops_mpi .DistributedArray (global_shape = npp .prod (par ['nz' ]), dtype = par ['dtype' ],
379+ partition = par ['partition' ], engine = backend )
365380 x [:] = np .random .normal (rank , 10 , x .local_shape )
366381 x_global = x .asarray ()
367382 # Forward
@@ -371,7 +386,7 @@ def test_second_derivative_centered(par):
371386 y_adj_dist = Sop_MPI .H @ x
372387 y_adj = y_adj_dist .asarray ()
373388 # Dot test
374- dottest (Sop_MPI , x , y_dist , np .prod (par ['nz' ]), np .prod (par ['nz' ]))
389+ dottest (Sop_MPI , x , y_dist , npp .prod (par ['nz' ]), npp .prod (par ['nz' ]))
375390
376391 if rank == 0 :
377392 Sop = pylops .SecondDerivative (dims = par ['nz' ], axis = 0 ,
@@ -394,7 +409,7 @@ def test_laplacian(par):
394409 weights = par ['weights' ], sampling = par ['sampling' ],
395410 kind = kind , edge = par ['edge' ],
396411 dtype = par ['dtype' ])
397- x = pylops_mpi .DistributedArray (global_shape = np .prod (par ['n' ]), dtype = par ['dtype' ])
412+ x = pylops_mpi .DistributedArray (global_shape = npp .prod (par ['n' ]), dtype = par ['dtype' ], engine = backend )
398413 x [:] = np .random .normal (rank , 10 , x .local_shape )
399414 x_global = x .asarray ()
400415 # Forward
@@ -404,7 +419,7 @@ def test_laplacian(par):
404419 y_adj_dist = Lop_MPI .H @ x
405420 y_adj = y_adj_dist .asarray ()
406421 # Dot test
407- dottest (Lop_MPI , x , y_dist , np .prod (par ['n' ]), np .prod (par ['n' ]))
422+ dottest (Lop_MPI , x , y_dist , npp .prod (par ['n' ]), npp .prod (par ['n' ]))
408423
409424 if rank == 0 :
410425 Lop = pylops .Laplacian (dims = par ['n' ], axes = par ['axes' ],
@@ -426,7 +441,7 @@ def test_gradient(par):
426441 Gop_MPI = pylops_mpi .basicoperators .MPIGradient (dims = par ['n' ], sampling = par ['sampling' ],
427442 kind = kind , edge = par ['edge' ],
428443 dtype = par ['dtype' ])
429- x_fwd = pylops_mpi .DistributedArray (global_shape = np .prod (par ['n' ]), dtype = par ['dtype' ])
444+ x_fwd = pylops_mpi .DistributedArray (global_shape = npp .prod (par ['n' ]), dtype = par ['dtype' ], engine = backend )
430445 x_fwd [:] = np .random .normal (rank , 10 , x_fwd .local_shape )
431446 x_global = x_fwd .asarray ()
432447
@@ -436,11 +451,11 @@ def test_gradient(par):
436451 y = y_dist .asarray ()
437452
438453 # Adjoint
439- x_adj_dist1 = pylops_mpi .DistributedArray (global_shape = int (np .prod (par ['n' ])), dtype = par ['dtype' ])
454+ x_adj_dist1 = pylops_mpi .DistributedArray (global_shape = int (npp .prod (par ['n' ])), dtype = par ['dtype' ], engine = backend )
440455 x_adj_dist1 [:] = np .random .normal (rank , 10 , x_adj_dist1 .local_shape )
441- x_adj_dist2 = pylops_mpi .DistributedArray (global_shape = int (np .prod (par ['n' ])), dtype = par ['dtype' ])
456+ x_adj_dist2 = pylops_mpi .DistributedArray (global_shape = int (npp .prod (par ['n' ])), dtype = par ['dtype' ], engine = backend )
442457 x_adj_dist2 [:] = np .random .normal (rank , 20 , x_adj_dist2 .local_shape )
443- x_adj_dist3 = pylops_mpi .DistributedArray (global_shape = int (np .prod (par ['n' ])), dtype = par ['dtype' ])
458+ x_adj_dist3 = pylops_mpi .DistributedArray (global_shape = int (npp .prod (par ['n' ])), dtype = par ['dtype' ], engine = backend )
444459 x_adj_dist3 [:] = np .random .normal (rank , 30 , x_adj_dist3 .local_shape )
445460 x_adj = pylops_mpi .StackedDistributedArray (distarrays = [x_adj_dist1 , x_adj_dist2 , x_adj_dist3 ])
446461 x_adj_global = x_adj .asarray ()
@@ -449,7 +464,7 @@ def test_gradient(par):
449464 y_adj = y_adj_dist .asarray ()
450465
451466 # Dot test
452- dottest (Gop_MPI , x_fwd , y_dist , len (par ['n' ]) * np .prod (par ['n' ]), np .prod (par ['n' ]))
467+ dottest (Gop_MPI , x_fwd , y_dist , len (par ['n' ]) * npp .prod (par ['n' ]), npp .prod (par ['n' ]))
453468
454469 if rank == 0 :
455470 Gop = pylops .Gradient (dims = par ['n' ], sampling = par ['sampling' ],
0 commit comments