CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
140 lines
4.8 KiB
C
140 lines
4.8 KiB
C
//===--------------- offload/DeviceRTL/include/EmissaryMPI.h --------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// EmissaryMPI.h This include must be included by MPI application
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#include "EmissaryIds.h"
|
|
#include <mpi.h>
|
|
#include <stdarg.h>
|
|
|
|
typedef enum {
|
|
_MPI_INVALID,
|
|
_MPI_Send_idx,
|
|
_MPI_Recv_idx,
|
|
_MPI_Allreduce_idx,
|
|
_MPI_Reduce_idx,
|
|
} offload_emis_mpi_t;
|
|
|
|
/// Device stubs that call _emissary_exec using identical host API interface
|
|
#if defined(__NVPTX__) || defined(__AMDGCN__)
|
|
extern "C" int MPI_Send(const void *buf, int count, MPI_Datatype datatype,
|
|
int dest, int tag, MPI_Comm comm) {
|
|
return (int)_emissary_exec(_PACK_EMIS_IDS(EMIS_ID_MPI, _MPI_Send_idx),
|
|
buf, count, datatype, dest, tag, comm);
|
|
}
|
|
extern "C" int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source,
|
|
int tag, MPI_Comm comm, MPI_Status *st) {
|
|
return (int)_emissary_exec(_PACK_EMIS_IDS(EMIS_ID_MPI, _MPI_Recv_idx), buf,
|
|
count, datatype, source, tag, comm, st);
|
|
}
|
|
extern "C" int MPI_Allreduce(const void *sendbuf, void *recvbuf, int count,
|
|
MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) {
|
|
return (int)_emissary_exec(_PACK_EMIS_IDS(EMIS_ID_MPI, _MPI_Allreduce_idx),
|
|
sendbuf, recvbuf, count, datatype, op, comm);
|
|
}
|
|
extern "C" int MPI_Reduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
|
|
MPI_Op op, int root, MPI_Comm comm) {
|
|
return (int)_emissary_exec(_PACK_EMIS_IDS(EMIS_ID_MPI, _MPI_Reduce_idx),
|
|
sendbuf, recvbuf, count, datatype, op, root, comm);
|
|
}
|
|
#endif
|
|
|
|
/// Host variadic wrapper functions.
|
|
extern "C" {
|
|
extern int V_MPI_Send(void *fnptr, ...) {
|
|
va_list args;
|
|
va_start(args, fnptr);
|
|
void *v0 = va_arg(args, void *);
|
|
int v1 = va_arg(args, int);
|
|
MPI_Datatype v2 = va_arg(args, MPI_Datatype);
|
|
int v3 = va_arg(args, int);
|
|
int v4 = va_arg(args, int);
|
|
MPI_Comm v5 = va_arg(args, MPI_Comm);
|
|
va_end(args);
|
|
int rval = MPI_Send(v0, v1, v2, v3, v4, v5);
|
|
return rval;
|
|
}
|
|
extern int V_MPI_Recv(void *fnptr, ...) {
|
|
va_list args;
|
|
va_start(args, fnptr);
|
|
void *v0 = va_arg(args, void *);
|
|
int v1 = va_arg(args, int);
|
|
MPI_Datatype v2 = va_arg(args, MPI_Datatype);
|
|
int v3 = va_arg(args, int);
|
|
int v4 = va_arg(args, int);
|
|
MPI_Comm v5 = va_arg(args, MPI_Comm);
|
|
MPI_Status *v6 = va_arg(args, MPI_Status *);
|
|
va_end(args);
|
|
int rval = MPI_Recv(v0, v1, v2, v3, v4, v5, v6);
|
|
return rval;
|
|
}
|
|
extern int V_MPI_Allreduce(void *fnptr, ...) {
|
|
va_list args;
|
|
va_start(args, fnptr);
|
|
void *buf = va_arg(args, void *);
|
|
void *recvbuf = va_arg(args, void *);
|
|
int count = va_arg(args, int);
|
|
MPI_Datatype datatype = va_arg(args, MPI_Datatype);
|
|
MPI_Op op = va_arg(args, MPI_Op);
|
|
MPI_Comm comm = va_arg(args, MPI_Comm);
|
|
va_end(args);
|
|
int rval = MPI_Allreduce(
|
|
buf, recvbuf, count, datatype, op, comm);
|
|
return rval;
|
|
}
|
|
extern int V_MPI_Reduce(void *fnptr, ...) {
|
|
va_list args;
|
|
va_start(args, fnptr);
|
|
void *buf = va_arg(args, void *);
|
|
void *recvbuf = va_arg(args, void *);
|
|
int count = va_arg(args, int);
|
|
MPI_Datatype datatype = va_arg(args, MPI_Datatype);
|
|
MPI_Op op = va_arg(args, MPI_Op);
|
|
int root = va_arg(args, int);
|
|
MPI_Comm comm = va_arg(args, MPI_Comm);
|
|
va_end(args);
|
|
int rval = MPI_Reduce(
|
|
buf, recvbuf, count, datatype, op, root, comm);
|
|
return rval;
|
|
}
|
|
|
|
/// EmissaryMPI function selector
|
|
emis_return_t EmissaryMPI(char *data, emisArgBuf_t *ab, emis_argptr_t *a[]) {
|
|
|
|
switch (ab->emisfnid) {
|
|
case _MPI_Send_idx: {
|
|
void *fnptr = (void *)V_MPI_Send;
|
|
int return_value_int =
|
|
V_MPI_Send(fnptr, a[0], a[1], a[2], a[3], a[4], a[5]);
|
|
return (emis_return_t)return_value_int;
|
|
}
|
|
case _MPI_Recv_idx: {
|
|
void *fnptr = (void *)V_MPI_Recv;
|
|
int return_value_int =
|
|
V_MPI_Recv(fnptr, a[0], a[1], a[2], a[3], a[4], a[5], a[6]);
|
|
return (emis_return_t)return_value_int;
|
|
}
|
|
case _MPI_Allreduce_idx: {
|
|
void *fnptr = (void *)V_MPI_Allreduce;
|
|
int return_value_int =
|
|
V_MPI_Allreduce(fnptr, a[0], a[1], a[2], a[3], a[4], a[5]);
|
|
return (emis_return_t) return_value_int;
|
|
}
|
|
case _MPI_Reduce_idx: {
|
|
void *fnptr = (void *)V_MPI_Reduce;
|
|
int return_value_int =
|
|
V_MPI_Reduce(fnptr, a[0], a[1], a[2], a[3], a[4], a[5], a[6]);
|
|
return (emis_return_t) return_value_int;
|
|
}
|
|
}
|
|
return (emis_return_t)0;
|
|
}
|
|
|
|
} // end extern "C"
|