1dfcd79e9SJacob Faibussowitsch static const char help[] = "Tests PetscDeviceContextQueryIdle.\n\n"; 2dfcd79e9SJacob Faibussowitsch 3dfcd79e9SJacob Faibussowitsch #include "petscdevicetestcommon.h" 4dfcd79e9SJacob Faibussowitsch 5dfcd79e9SJacob Faibussowitsch static PetscErrorCode CheckIdle(PetscDeviceContext dctx, const char operation[]) 6dfcd79e9SJacob Faibussowitsch { 7dfcd79e9SJacob Faibussowitsch PetscBool idle = PETSC_FALSE; 8dfcd79e9SJacob Faibussowitsch 9dfcd79e9SJacob Faibussowitsch PetscFunctionBegin; 10dfcd79e9SJacob Faibussowitsch PetscCall(PetscDeviceContextQueryIdle(dctx, &idle)); 11dfcd79e9SJacob Faibussowitsch if (!idle) { 12dfcd79e9SJacob Faibussowitsch PetscCall(PetscDeviceContextView(dctx, NULL)); 13dfcd79e9SJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDeviceContext was not idle after %s!", operation); 14dfcd79e9SJacob Faibussowitsch } 153ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 16dfcd79e9SJacob Faibussowitsch } 17dfcd79e9SJacob Faibussowitsch 18dfcd79e9SJacob Faibussowitsch static PetscErrorCode TestQueryIdle(PetscDeviceContext dctx) 19dfcd79e9SJacob Faibussowitsch { 20dfcd79e9SJacob Faibussowitsch PetscDeviceContext other = NULL; 21dfcd79e9SJacob Faibussowitsch 22dfcd79e9SJacob Faibussowitsch PetscFunctionBegin; 23dfcd79e9SJacob Faibussowitsch // Should of course be idle after synchronization 24dfcd79e9SJacob Faibussowitsch PetscCall(PetscDeviceContextSynchronize(dctx)); 25dfcd79e9SJacob Faibussowitsch PetscCall(CheckIdle(dctx, "synchronization")); 26dfcd79e9SJacob Faibussowitsch 27dfcd79e9SJacob Faibussowitsch // Creating an unrelated device context should leave it idle 28dfcd79e9SJacob Faibussowitsch PetscCall(PetscDeviceContextCreate(&other)); 29dfcd79e9SJacob Faibussowitsch PetscCall(CheckIdle(dctx, "creating unrelated dctx")); 30dfcd79e9SJacob Faibussowitsch 31dfcd79e9SJacob Faibussowitsch // Destroying an unrelated device context shouldn't change things either 32dfcd79e9SJacob Faibussowitsch PetscCall(PetscDeviceContextDestroy(&other)); 33dfcd79e9SJacob Faibussowitsch PetscCall(CheckIdle(dctx, "destroying unrelated dctx")); 34dfcd79e9SJacob Faibussowitsch 35dfcd79e9SJacob Faibussowitsch // Duplicating shouldn't change it either 36dfcd79e9SJacob Faibussowitsch PetscCall(PetscDeviceContextDuplicate(dctx, &other)); 37dfcd79e9SJacob Faibussowitsch PetscCall(CheckIdle(dctx, "duplication")); 38dfcd79e9SJacob Faibussowitsch 39dfcd79e9SJacob Faibussowitsch // Another ctx waiting on it (which may make the other ctx non-idle) should not make the 40dfcd79e9SJacob Faibussowitsch // current one non-idle... 41dfcd79e9SJacob Faibussowitsch PetscCall(PetscDeviceContextWaitForContext(other, dctx)); 42dfcd79e9SJacob Faibussowitsch // ...unless it is the null ctx, in which case it being "idle" is equivalent to asking 43dfcd79e9SJacob Faibussowitsch // whether the whole device (which includes other streams) is idle. Since the other ctx might 44dfcd79e9SJacob Faibussowitsch // be busy, we should explicitly synchronize on the null ctx 45dfcd79e9SJacob Faibussowitsch PetscCall(PetscDeviceContextSynchronize(NULL /* equivalently dctx if dctx = NULL */)); 46dfcd79e9SJacob Faibussowitsch PetscCall(CheckIdle(dctx, "other context waited on it, and synchronizing the NULL context")); 47dfcd79e9SJacob Faibussowitsch // both contexts should be idle 48dfcd79e9SJacob Faibussowitsch PetscCall(CheckIdle(other, "waiting on other context, and synchronizing the NULL context")); 49dfcd79e9SJacob Faibussowitsch 50dfcd79e9SJacob Faibussowitsch PetscCall(PetscDeviceContextDestroy(&other)); 513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 52dfcd79e9SJacob Faibussowitsch } 53dfcd79e9SJacob Faibussowitsch 54dfcd79e9SJacob Faibussowitsch int main(int argc, char *argv[]) 55dfcd79e9SJacob Faibussowitsch { 56dfcd79e9SJacob Faibussowitsch PetscDeviceContext dctx = NULL; 57dfcd79e9SJacob Faibussowitsch 58dfcd79e9SJacob Faibussowitsch PetscFunctionBeginUser; 59dfcd79e9SJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 60dfcd79e9SJacob Faibussowitsch 61dfcd79e9SJacob Faibussowitsch PetscCall(PetscDeviceContextCreate(&dctx)); 62*d9acb416SHong Zhang PetscCall(PetscDeviceContextSetStreamType(dctx, PETSC_STREAM_NONBLOCKING)); 63dfcd79e9SJacob Faibussowitsch PetscCall(PetscDeviceContextSetUp(dctx)); 64dfcd79e9SJacob Faibussowitsch PetscCall(TestQueryIdle(dctx)); 65dfcd79e9SJacob Faibussowitsch PetscCall(PetscDeviceContextDestroy(&dctx)); 66dfcd79e9SJacob Faibussowitsch 67dfcd79e9SJacob Faibussowitsch PetscCall(TestQueryIdle(NULL)); 68dfcd79e9SJacob Faibussowitsch 69dfcd79e9SJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "EXIT_SUCCESS\n")); 70dfcd79e9SJacob Faibussowitsch PetscCall(PetscFinalize()); 71dfcd79e9SJacob Faibussowitsch return 0; 72dfcd79e9SJacob Faibussowitsch } 73dfcd79e9SJacob Faibussowitsch 74dfcd79e9SJacob Faibussowitsch /*TEST 75dfcd79e9SJacob Faibussowitsch 76dfcd79e9SJacob Faibussowitsch testset: 77667ab0feSJacob Faibussowitsch requires: cxx 78dfcd79e9SJacob Faibussowitsch output_file: ./output/ExitSuccess.out 79dfcd79e9SJacob Faibussowitsch args: -device_enable {{lazy eager}} 80dfcd79e9SJacob Faibussowitsch test: 81dfcd79e9SJacob Faibussowitsch requires: !device 82dfcd79e9SJacob Faibussowitsch suffix: host_no_device 83dfcd79e9SJacob Faibussowitsch test: 84dfcd79e9SJacob Faibussowitsch requires: device 85dfcd79e9SJacob Faibussowitsch args: -default_device_type host 86dfcd79e9SJacob Faibussowitsch suffix: host_with_device 87dfcd79e9SJacob Faibussowitsch test: 88dfcd79e9SJacob Faibussowitsch requires: cuda 89dfcd79e9SJacob Faibussowitsch args: -default_device_type cuda 90dfcd79e9SJacob Faibussowitsch suffix: cuda 91dfcd79e9SJacob Faibussowitsch test: 92dfcd79e9SJacob Faibussowitsch requires: hip 93dfcd79e9SJacob Faibussowitsch args: -default_device_type hip 94dfcd79e9SJacob Faibussowitsch suffix: hip 95dfcd79e9SJacob Faibussowitsch test: 96dfcd79e9SJacob Faibussowitsch requires: sycl 97dfcd79e9SJacob Faibussowitsch args: -default_device_type sycl 98dfcd79e9SJacob Faibussowitsch suffix: sycl 99dfcd79e9SJacob Faibussowitsch 100667ab0feSJacob Faibussowitsch test: 101667ab0feSJacob Faibussowitsch requires: !cxx 102667ab0feSJacob Faibussowitsch output_file: ./output/ExitSuccess.out 103667ab0feSJacob Faibussowitsch suffix: no_cxx 104667ab0feSJacob Faibussowitsch 105dfcd79e9SJacob Faibussowitsch TEST*/ 106