From 8bfd956922df1d64a0316d67bf200d47844dd820 Mon Sep 17 00:00:00 2001 From: Ahmad Nawab Date: Tue, 28 Jan 2025 18:46:16 +0000 Subject: [PATCH] WIP: python macros adapted for host only functionality --- cmake/field_api_get_offload_model.cmake | 2 +- python_utils/offload_backends/__init__.py | 1 + python_utils/offload_backends/host_only.py | 18 ++++++++ python_utils/offload_macros.py | 53 +++++++++++++++++----- 4 files changed, 62 insertions(+), 12 deletions(-) create mode 100644 python_utils/offload_backends/host_only.py diff --git a/cmake/field_api_get_offload_model.cmake b/cmake/field_api_get_offload_model.cmake index 898e95e..7408aa4 100644 --- a/cmake/field_api_get_offload_model.cmake +++ b/cmake/field_api_get_offload_model.cmake @@ -47,7 +47,7 @@ macro( field_api_get_offload_model ) DESCRIPTION "CUDA" DEFAULT ON CONDITION CMAKE_CUDA_COMPILER AND HAVE_ACC ) - set(FIELD_API_OFFLOAD_MODEL "None") + set(FIELD_API_OFFLOAD_MODEL "HostOnly") if( HAVE_CUDA ) set(FIELD_API_OFFLOAD_MODEL "NvidiaOpenACCCUDA") elseif( HAVE_ACC ) diff --git a/python_utils/offload_backends/__init__.py b/python_utils/offload_backends/__init__.py index 3619665..7e3ccd1 100644 --- a/python_utils/offload_backends/__init__.py +++ b/python_utils/offload_backends/__init__.py @@ -8,3 +8,4 @@ # nor does it submit to any jurisdiction. from offload_backends.nvidia import * +from offload_backends.host_only import * diff --git a/python_utils/offload_backends/host_only.py b/python_utils/offload_backends/host_only.py new file mode 100644 index 0000000..51d003b --- /dev/null +++ b/python_utils/offload_backends/host_only.py @@ -0,0 +1,18 @@ +# (C) Copyright 2022- ECMWF. +# (C) Copyright 2022- Meteo-France. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# In applying this licence, ECMWF does not waive the privileges and immunities +# granted to it by virtue of its status as an intergovernmental organisation +# nor does it submit to any jurisdiction. + + +__all__ = ['HostOnly'] + +class HostOnly(): + """ + A dummy class only to be used if GPU offload is disabled. + """ + + pragma = '' diff --git a/python_utils/offload_macros.py b/python_utils/offload_macros.py index d2150a6..d03bd8f 100644 --- a/python_utils/offload_macros.py +++ b/python_utils/offload_macros.py @@ -8,14 +8,15 @@ # nor does it submit to any jurisdiction. import fypp -from offload_backends import NvidiaOpenACC +from offload_backends import NvidiaOpenACC, HostOnly """ A common entry point for retrieving macros from the various GPU offload backends. """ _offload_map = { - 'NvidiaOpenACC': NvidiaOpenACC + 'NvidiaOpenACC': NvidiaOpenACC, + 'HostOnly': HostOnly } def _wrap_lines(input_str, ref_len, pragma='', indent=0): @@ -92,14 +93,29 @@ def _get_offload_backend(): return _offload_map[offload_model] +def _empty_string(*args, **kwargs): + """Simple method to return an empty string.""" + return "" + +def _get_method(backend, method): + """ + Retrieve the appropriate method from the given backend. + """ + + try: + return getattr(backend, method) + except AttributeError: + return _empty_string + def RuntimeApiImport(indent=0): """ Import the runtime API. """ backend = _get_offload_backend() + method = _get_method(backend, 'runtime_api_import') - return _format_lines(backend.runtime_api_import()) + return _format_lines(method()) def CDevptrDecl(symbols, indent=0): """ @@ -107,8 +123,9 @@ def CDevptrDecl(symbols, indent=0): """ backend = _get_offload_backend() + method = _get_method(backend, 'c_devptr_declaration') - return _format_lines(backend.c_devptr_declaration(symbols)) + return _format_lines(method(symbols)) def HostDataStart(symbols, indent=0): """ @@ -116,7 +133,9 @@ def HostDataStart(symbols, indent=0): """ backend = _get_offload_backend() - return _format_lines(backend.host_data_start(symbols), indent=indent, pragma=backend.pragma) + method = _get_method(backend, 'host_data_start') + + return _format_lines(method(symbols), indent=indent, pragma=backend.pragma) def HostDataEnd(indent=0): """ @@ -124,7 +143,9 @@ def HostDataEnd(indent=0): """ backend = _get_offload_backend() - return _format_lines(backend.host_data_end(), indent=indent) + method = _get_method(backend, 'host_data_end') + + return _format_lines(method(), indent=indent) def DevptrCLOC(symbol, indent=0): """ @@ -132,7 +153,9 @@ def DevptrCLOC(symbol, indent=0): """ backend = _get_offload_backend() - return _format_lines(backend.devptr_c_loc(symbol)) + method = _get_method(backend, 'devptr_c_loc') + + return _format_lines(method(symbol)) def CopyToDevice1D(dev, host, size, indent=0): """ @@ -140,7 +163,9 @@ def CopyToDevice1D(dev, host, size, indent=0): """ backend = _get_offload_backend() - return _format_lines(backend.copy_to_device_1D(dev, host, size), indent=indent) + method = _get_method(backend, 'copy_to_device_1D') + + return _format_lines(method(dev, host, size), indent=indent) def CopyToDevice1DAsync(dev, host, size, queue, indent=0): """ @@ -148,7 +173,9 @@ def CopyToDevice1DAsync(dev, host, size, queue, indent=0): """ backend = _get_offload_backend() - return _format_lines(backend.copy_to_device_1D_async(dev, host, size, queue), indent=indent) + method = _get_method(backend, 'copy_to_device_1D_async') + + return _format_lines(method(dev, host, size, queue), indent=indent) def CopyFromDevice1D(dev, host, size, indent=0): """ @@ -156,7 +183,9 @@ def CopyFromDevice1D(dev, host, size, indent=0): """ backend = _get_offload_backend() - return _format_lines(backend.copy_from_device_1D(dev, host, size), indent=indent) + method = _get_method(backend, 'copy_from_device_1D') + + return _format_lines(method(dev, host, size), indent=indent) def CopyFromDevice1DAsync(dev, host, size, queue, indent=0): """ @@ -164,4 +193,6 @@ def CopyFromDevice1DAsync(dev, host, size, queue, indent=0): """ backend = _get_offload_backend() - return _format_lines(backend.copy_from_device_1D_async(dev, host, size, queue), indent=indent) + method = _get_method(backend, 'copy_from_device_1D_async') + + return _format_lines(method(dev, host, size, queue), indent=indent)