1 static char help[]= "Test VecScatterCreateToZero, VecScatterCreateToAll\n\n"; 2 3 #include <petscvec.h> 4 int main(int argc,char **argv) 5 { 6 PetscErrorCode ierr; 7 PetscInt i,N=10,low,high; 8 PetscMPIInt size,rank; 9 Vec x,y; 10 VecScatter vscat; 11 12 ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; 13 ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 14 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 15 16 ierr = VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr); 17 ierr = VecSetFromOptions(x);CHKERRQ(ierr); 18 ierr = VecSetSizes(x,PETSC_DECIDE,N);CHKERRQ(ierr); 19 ierr = VecGetOwnershipRange(x,&low,&high);CHKERRQ(ierr); 20 ierr = PetscObjectSetName((PetscObject)x,"x");CHKERRQ(ierr); 21 22 /*-------------------------------------*/ 23 /* VecScatterCreateToZero */ 24 /*-------------------------------------*/ 25 26 /* MPI vec x = [0, 1, 2, .., N-1] */ 27 for (i=low; i<high; i++) {ierr = VecSetValue(x,i,(PetscScalar)i,INSERT_VALUES);CHKERRQ(ierr);} 28 ierr = VecAssemblyBegin(x);CHKERRQ(ierr); 29 ierr = VecAssemblyEnd(x);CHKERRQ(ierr); 30 31 ierr = PetscPrintf(PETSC_COMM_WORLD,"\nTesting VecScatterCreateToZero\n");CHKERRQ(ierr); 32 ierr = VecScatterCreateToZero(x,&vscat,&y);CHKERRQ(ierr); 33 ierr = PetscObjectSetName((PetscObject)y,"y");CHKERRQ(ierr); 34 35 /* Test PetscSFBcastAndOp with op = MPI_REPLACE, which does y = x on rank 0 */ 36 ierr = VecScatterBegin(vscat,x,y,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 37 ierr = VecScatterEnd(vscat,x,y,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 38 if (!rank) {ierr = VecView(y,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr);} 39 40 /* Test PetscSFBcastAndOp with op = MPI_SUM, which does y += x */ 41 ierr = VecScatterBegin(vscat,x,y,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 42 ierr = VecScatterEnd(vscat,x,y,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 43 if (!rank) {ierr = VecView(y,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr);} 44 45 /* Test PetscSFReduce with op = MPI_REPLACE, which does x = y */ 46 ierr = VecScatterBegin(vscat,y,x,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); 47 ierr = VecScatterEnd(vscat,y,x,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); 48 ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 49 50 /* Test PetscSFReduce with op = MPI_SUM, which does x += y on x's local part on rank 0*/ 51 ierr = VecScatterBegin(vscat,y,x,ADD_VALUES,SCATTER_REVERSE_LOCAL);CHKERRQ(ierr); 52 ierr = VecScatterEnd(vscat,y,x,ADD_VALUES,SCATTER_REVERSE_LOCAL);CHKERRQ(ierr); 53 ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 54 55 ierr = VecDestroy(&y);CHKERRQ(ierr); 56 ierr = VecScatterDestroy(&vscat);CHKERRQ(ierr); 57 58 /*-------------------------------------*/ 59 /* VecScatterCreateToAll */ 60 /*-------------------------------------*/ 61 for (i=low; i<high; i++) {ierr = VecSetValue(x,i,(PetscScalar)i,INSERT_VALUES);CHKERRQ(ierr);} 62 ierr = VecAssemblyBegin(x);CHKERRQ(ierr); 63 ierr = VecAssemblyEnd(x);CHKERRQ(ierr); 64 65 ierr = PetscPrintf(PETSC_COMM_WORLD,"\nTesting VecScatterCreateToAll\n");CHKERRQ(ierr); 66 67 ierr = VecScatterCreateToAll(x,&vscat,&y);CHKERRQ(ierr); 68 ierr = PetscObjectSetName((PetscObject)y,"y");CHKERRQ(ierr); 69 70 /* Test PetscSFBcastAndOp with op = MPI_REPLACE, which does y = x on all ranks */ 71 ierr = VecScatterBegin(vscat,x,y,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 72 ierr = VecScatterEnd(vscat,x,y,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 73 if (!rank) {ierr = VecView(y,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr);} 74 75 /* Test PetscSFBcastAndOp with op = MPI_SUM, which does y += x */ 76 ierr = VecScatterBegin(vscat,x,y,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 77 ierr = VecScatterEnd(vscat,x,y,ADD_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); 78 if (!rank) {ierr = VecView(y,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr);} 79 80 /* Test PetscSFReduce with op = MPI_REPLACE, which does x = y */ 81 ierr = VecScatterBegin(vscat,y,x,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); 82 ierr = VecScatterEnd(vscat,y,x,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); 83 ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 84 85 /* Test PetscSFReduce with op = MPI_SUM, which does x += size*y */ 86 ierr = VecScatterBegin(vscat,y,x,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); 87 ierr = VecScatterEnd(vscat,y,x,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); 88 ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 89 ierr = VecDestroy(&x);CHKERRQ(ierr); 90 ierr = VecDestroy(&y);CHKERRQ(ierr); 91 ierr = VecScatterDestroy(&vscat);CHKERRQ(ierr); 92 93 ierr = PetscFinalize(); 94 return ierr; 95 } 96 97 /*TEST 98 99 testset: 100 # N=10 is divisible by nsize, to trigger Allgather/Gather in SF 101 nsize: 2 102 filter: grep -v "type" 103 output_file: output/ex8_1.out 104 105 test: 106 suffix: 1_standard 107 108 test: 109 suffix: 1_cuda 110 args: -vec_type cuda -vecscatter_packongpu true 111 requires: cuda 112 113 test: 114 suffix: 1_cuda_aware_mpi 115 args: -vec_type cuda -vecscatter_packongpu false 116 requires: cuda define(PETSC_HAVE_MPI_GPU_AWARE) 117 118 testset: 119 # N=10 is not divisible by nsize, to trigger Allgatherv/Gatherv in SF 120 suffix: 2 121 nsize: 3 122 filter: grep -v "type" 123 output_file: output/ex8_2.out 124 125 test: 126 suffix: 2_standard 127 128 test: 129 suffix: 2_cuda 130 args: -vec_type cuda -vecscatter_packongpu true 131 requires: cuda 132 133 test: 134 suffix: 2_cuda_aware_mpi 135 args: -vec_type cuda -vecscatter_packongpu false 136 requires: cuda define(PETSC_HAVE_MPI_GPU_AWARE) 137 138 TEST*/ 139 140