diff --git a/flang/include/flang/Runtime/CUDA/memory.h b/flang/include/flang/Runtime/CUDA/memory.h new file mode 100644 index 0000000000000..8fd51129e81fe --- /dev/null +++ b/flang/include/flang/Runtime/CUDA/memory.h @@ -0,0 +1,47 @@ +//===-- include/flang/Runtime/CUDA/memory.h ---------------------*- C++ -*-===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_RUNTIME_CUDA_MEMORY_H_ +#define FORTRAN_RUNTIME_CUDA_MEMORY_H_ + +#include "flang/Runtime/descriptor.h" +#include "flang/Runtime/entry-names.h" +#include + +static constexpr unsigned kHostToDevice = 0; +static constexpr unsigned kDeviceToHost = 1; +static constexpr unsigned kDeviceToDevice = 2; + +namespace Fortran::runtime::cuda { + +extern "C" { + +/// Set value to the data hold by a descriptor. The \p value pointer must be +/// addressable to the same amount of bytes specified by the element size of +/// the descriptor \p desc. +void RTDECL(CUFMemsetDescriptor)(const Descriptor &desc, void *value, + const char *sourceFile = nullptr, int sourceLine = 0); + +/// Data transfer from a pointer to a descriptor. +void RTDECL(CUFDataTransferDescPtr)(const Descriptor &dst, void *src, + std::size_t bytes, unsigned mode, const char *sourceFile = nullptr, + int sourceLine = 0); + +/// Data transfer from a descriptor to a pointer. +void RTDECL(CUFDataTransferPtrDesc)(void *dst, const Descriptor &src, + std::size_t bytes, unsigned mode, const char *sourceFile = nullptr, + int sourceLine = 0); + +/// Data transfer from a descriptor to a descriptor. +void RTDECL(CUFDataTransferDescDesc)(const Descriptor &dst, + const Descriptor &src, unsigned mode, const char *sourceFile = nullptr, + int sourceLine = 0); + +} // extern "C" +} // namespace Fortran::runtime::cuda +#endif // FORTRAN_RUNTIME_CUDA_MEMORY_H_ diff --git a/flang/lib/Optimizer/Dialect/FIRType.cpp b/flang/lib/Optimizer/Dialect/FIRType.cpp index c1debf28d0033..05f644654efe1 100644 --- a/flang/lib/Optimizer/Dialect/FIRType.cpp +++ b/flang/lib/Optimizer/Dialect/FIRType.cpp @@ -1467,4 +1467,4 @@ fir::getTypeSizeAndAlignmentOrCrash(mlir::Location loc, mlir::Type ty, if (result) return *result; TODO(loc, "computing size of a component"); -} \ No newline at end of file +} diff --git a/flang/runtime/CUDA/CMakeLists.txt b/flang/runtime/CUDA/CMakeLists.txt index 81055b2737c0f..490bb369b572f 100644 --- a/flang/runtime/CUDA/CMakeLists.txt +++ b/flang/runtime/CUDA/CMakeLists.txt @@ -16,6 +16,7 @@ set(CUFRT_LIBNAME CufRuntime_cuda_${CUDAToolkit_VERSION_MAJOR}) add_flang_library(${CUFRT_LIBNAME} allocator.cpp descriptor.cpp + memory.cpp ) if (BUILD_SHARED_LIBS) diff --git a/flang/runtime/CUDA/memory.cpp b/flang/runtime/CUDA/memory.cpp new file mode 100644 index 0000000000000..a287fa14a4878 --- /dev/null +++ b/flang/runtime/CUDA/memory.cpp @@ -0,0 +1,46 @@ +//===-- runtime/CUDA/memory.cpp -------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "flang/Runtime/CUDA/memory.h" +#include "../terminator.h" + +#include "cuda_runtime.h" + +namespace Fortran::runtime::cuda { +extern "C" { + +void RTDEF(CUFMemsetDescriptor)(const Descriptor &desc, void *value, + const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + terminator.Crash("not yet implemented: CUDA data transfer from a scalar " + "value to a descriptor"); +} + +void RTDEF(CUFDataTransferDescPtr)(const Descriptor &desc, void *addr, + std::size_t bytes, unsigned mode, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + terminator.Crash( + "not yet implemented: CUDA data transfer from a pointer to a descriptor"); +} + +void RTDEF(CUFDataTransferPtrDesc)(void *addr, const Descriptor &desc, + std::size_t bytes, unsigned mode, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + terminator.Crash( + "not yet implemented: CUDA data transfer from a descriptor to a pointer"); +} + +void RTDECL(CUFDataTransferDescDesc)(const Descriptor &dstDesc, + const Descriptor &srcDesc, unsigned mode, const char *sourceFile, + int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + terminator.Crash( + "not yet implemented: CUDA data transfer between two descriptors"); +} +} +} // namespace Fortran::runtime::cuda