Commit edfe96f0 authored by Joel E. Denny's avatar Joel E. Denny
Browse files

[Clacc][OpenACC] Add activity queue support to libacc2omp

Specifically, implement `acc_get_default_async`,
`acc_set_default_async`, and `acc2omp_async2dep`.  In future patches,
the last will be used by Clacc's OpenMP translation of OpenACC
directives and by libacc2omp's implementation of OpenACC runtime
library routines.  It maps an OpenACC async-argument to an OpenMP
`depend` clause argument.
parent b99fa02d
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -839,6 +839,12 @@ OpenACC Runtime Library API and Preprocessor
          first device included by `dev_type`.
        * OpenACC 3.1 does not mention how `dev_type` affects the
          result.
* Async/wait management routines supported on the host are:
    * `int acc_get_default_async(void)`
    * `void acc_set_default_async(async_arg)`
        * Produces a runtime error if `async_arg` is neither a non-negative
          integer nor the value of `acc_async_sync`, `acc_async_noval`, or
          `acc_async_default`.
* `acc_on_device` is supported on the host and on offloading devices:
    * The result is always false if the argument is `acc_device_none`.
      This behavior appears to follow nvc 20.9-0's behavior.  OpenACC
+68 −0
Original line number Diff line number Diff line
@@ -60,6 +60,17 @@

#include "internal.h"

/*****************************************************************************
 * Runtime state.
 *
 * FIXME: Access is not thread-safe.  Does it need to be?
 ****************************************************************************/

namespace {
  const unsigned accDefaultAsyncVarInit = 0;
  unsigned accDefaultAsyncVar = accDefaultAsyncVarInit;
}

/*****************************************************************************
 * Internal helper definitions.
 ****************************************************************************/
@@ -526,6 +537,30 @@ int acc_get_device_num(acc_device_t dev_type) {
  return -1;
}

/*****************************************************************************
 * OpenACC async/wait management routines.
 ****************************************************************************/

int acc_get_default_async(void) { return accDefaultAsyncVar; }

void acc_set_default_async(int async_arg) {
  switch (async_arg) {
  case acc_async_sync:
    accDefaultAsyncVar = async_arg;
    return;
  case acc_async_noval:
    return;
  case acc_async_default:
    accDefaultAsyncVar = accDefaultAsyncVarInit;
    return;
  }
  if (async_arg < 0) {
    acc2omp_fatal(ACC2OMP_MSG(set_default_async_invalid), async_arg);
    return;
  }
  accDefaultAsyncVar = async_arg;
}

/*****************************************************************************
 * Data and memory management routines.
 *
@@ -1407,3 +1442,36 @@ extern "C" void acc2omp_set_omp_default_device() {
  setDeviceNumAndType(DevNum, DevType, SetOmpDefaultDevice, !DevNumEnv,
                      !DevTypeEnv);
}

/*****************************************************************************
 * libacc2omp-provided declarations used in Clang's OpenMP translation of
 * OpenACC directives and in libacc2omp's implementation of OpenACC runtime
 * library routines.
 ****************************************************************************/

char *acc2omp_async2dep(int async_arg) {
  // sync must precede async so that &sync != &async + async_arg, assuming
  // 0 <= async_arg.
  static char sync, async;
  switch (async_arg) {
  case acc_async_sync:
    return &sync;
  case acc_async_noval:
    if (accDefaultAsyncVar == acc_async_sync)
      return &sync;
    ACC2OMP_ASSERT(0 <= accDefaultAsyncVar,
                   "expected current default activity queue to be "
                   "acc_async_sync or non-negative");
    return &async + accDefaultAsyncVar;
  case acc_async_default:
    ACC2OMP_ASSERT(0 <= accDefaultAsyncVarInit,
                   "expected initial default activity queue to be "
                   "non-negative");
    return &async + accDefaultAsyncVarInit;
  }
  if (async_arg < 0) {
    acc2omp_fatal(ACC2OMP_MSG(async2dep_invalid), async_arg);
    return 0;
  }
  return &async + async_arg;
}
+6 −0
Original line number Diff line number Diff line
@@ -90,6 +90,9 @@ acc2omp_msg_t acc2omp_msg(acc2omp_msgid_t MsgId) {
  case acc2omp_msg_get_device_num_invalid_type:
    Msg.DefaultFmt = "acc_get_device_num called for invalid device type %d";
    break;
  case acc2omp_msg_set_default_async_invalid:
    Msg.DefaultFmt = "acc_set_default_async called with invalid async-arg %d";
    break;
  case acc2omp_msg_map_data_host_pointer_null:
    Msg.DefaultFmt = "acc_map_data called with null host pointer";
    break;
@@ -167,6 +170,9 @@ acc2omp_msg_t acc2omp_msg(acc2omp_msgid_t MsgId) {
  case acc2omp_msg_memcpy_d2d_fail:
    Msg.DefaultFmt = "acc_memcpy_d2d failed";
    break;
  case acc2omp_msg_async2dep_invalid:
    Msg.DefaultFmt = "acc2omp_async2dep called with invalid async-arg %d";
    break;
  }
  assert(Msg.DefaultFmt && "expected acc2omp_msg_t to be handled in switch");
  return Msg;
+3 −0
Original line number Diff line number Diff line
@@ -8,6 +8,8 @@ VERS1.0 {
    acc_get_device_type;
    acc_set_device_num;
    acc_get_device_num;
    acc_get_default_async;
    acc_set_default_async;
    acc_malloc;
    acc_free;
    acc_copyin;
@@ -31,6 +33,7 @@ VERS1.0 {
    acc_memcpy_from_device;
    acc_memcpy_device;
    acc_memcpy_d2d;
    acc2omp_async2dep;
  local:
    *;
};
+2 −0
Original line number Diff line number Diff line
@@ -113,6 +113,7 @@ typedef enum {
  acc2omp_msg_set_device_num_invalid_type,
  acc2omp_msg_set_device_num_invalid_num,
  acc2omp_msg_get_device_num_invalid_type,
  acc2omp_msg_set_default_async_invalid,
  acc2omp_msg_map_data_host_pointer_null,
  acc2omp_msg_map_data_device_pointer_null,
  acc2omp_msg_map_data_shared_memory,
@@ -137,6 +138,7 @@ typedef enum {
  acc2omp_msg_memcpy_d2d_dest_data_inaccessible,
  acc2omp_msg_memcpy_d2d_src_data_inaccessible,
  acc2omp_msg_memcpy_d2d_fail,
  acc2omp_msg_async2dep_invalid,
} acc2omp_msgid_t;

/// A wrapper around an \c acc2omp_msgid_t and its default printf-style format
Loading