/* Several of the async/wait combinations invoked here are no-ops -- they don't effect anything, but are still valid. This doesn't verify that the asynchronous operations synchronize correctly, but just verifies that we don't refuse any variants. */ #undef NDEBUG #include #include int values[] = { acc_async_sync, acc_async_noval, 0, 1, 2, 36, 1982, }; const size_t values_n = sizeof values / sizeof values[0]; int main () { /* Explicitly initialize: it's not clear whether the following OpenACC runtime library calls implicitly initialize; . */ acc_device_t d; #if defined ACC_DEVICE_TYPE_nvidia d = acc_device_nvidia; #elif defined ACC_DEVICE_TYPE_host d = acc_device_host; #else # error Not ported to this ACC_DEVICE_TYPE #endif acc_init (d); for (size_t i = 0; i < values_n; ++i) assert (acc_async_test (values[i]) == 1); for (size_t i = 0; i < values_n; ++i) { #pragma acc parallel wait (values[i]) ; #pragma acc wait (values[i]) acc_wait (values[i]); } for (size_t i = 0; i < values_n; ++i) { for (size_t j = 0; j < values_n; ++j) { #pragma acc parallel wait (values[i]) async (values[j]) ; #pragma acc wait (values[i]) async (values[j]) acc_wait_async (values[i], values[j]); } } for (size_t i = 0; i < values_n; ++i) { #pragma acc parallel wait async (values[i]) ; #pragma acc wait async (values[i]) acc_wait_all_async (values[i]); } /* Clean up. */ acc_wait_all (); return 0; }