diff --git a/source/adios2/common/ADIOSTypes.h b/source/adios2/common/ADIOSTypes.h index 9cb4e95394..c7c6d7fc85 100644 --- a/source/adios2/common/ADIOSTypes.h +++ b/source/adios2/common/ADIOSTypes.h @@ -305,9 +305,17 @@ namespace zfp namespace key { constexpr char accuracy[] = "accuracy"; +constexpr char backend[] = "backend"; constexpr char rate[] = "rate"; constexpr char precision[] = "precision"; } + +namespace value +{ +constexpr char backend_cuda[] = "cuda"; +constexpr char backend_omp[] = "omp"; +constexpr char backend_serial[] = "serial"; +} } #endif diff --git a/source/adios2/operator/compress/CompressZFP.cpp b/source/adios2/operator/compress/CompressZFP.cpp index 1ed8d5c312..10a431e97b 100644 --- a/source/adios2/operator/compress/CompressZFP.cpp +++ b/source/adios2/operator/compress/CompressZFP.cpp @@ -11,6 +11,11 @@ #include "adios2/helper/adiosFunctions.h" #include +/* ZFP will default to SERIAL if CUDA is not available */ +#ifndef ZFP_DEFAULT_EXECUTION_POLICY +#define ZFP_DEFAULT_EXECUTION_POLICY zfp_exec_cuda +#endif + namespace adios2 { namespace core @@ -256,6 +261,7 @@ zfp_stream *CompressZFP::GetZFPStream(const Dims &dimensions, DataType type, const Params ¶meters) const { zfp_stream *stream = zfp_stream_open(NULL); + zfp_stream_set_execution(stream, ZFP_DEFAULT_EXECUTION_POLICY); auto itAccuracy = parameters.find("accuracy"); const bool hasAccuracy = itAccuracy != parameters.end(); @@ -266,6 +272,30 @@ zfp_stream *CompressZFP::GetZFPStream(const Dims &dimensions, DataType type, auto itPrecision = parameters.find("precision"); const bool hasPrecision = itPrecision != parameters.end(); + auto itBackend = parameters.find("backend"); + const bool hasBackend = itBackend != parameters.end(); + + if (hasBackend) + { + auto policy = ZFP_DEFAULT_EXECUTION_POLICY; + const auto backend = itBackend->second; + + if (backend == "cuda") + { + policy = zfp_exec_cuda; + } + else if (backend == "omp") + { + policy = zfp_exec_omp; + } + else if (backend == "serial") + { + policy = zfp_exec_serial; + } + + zfp_stream_set_execution(stream, policy); + } + if ((hasAccuracy && hasRate) || (hasAccuracy && hasPrecision) || (hasRate && hasPrecision) || !(hasAccuracy || hasRate || hasPrecision)) { diff --git a/testing/adios2/engine/bp/operations/TestBPWriteReadZfp.cpp b/testing/adios2/engine/bp/operations/TestBPWriteReadZfp.cpp index c8dae762c9..90dda78608 100644 --- a/testing/adios2/engine/bp/operations/TestBPWriteReadZfp.cpp +++ b/testing/adios2/engine/bp/operations/TestBPWriteReadZfp.cpp @@ -866,6 +866,7 @@ void ZFPRate2DSmallSel(const std::string rate) // add operations adios2::Operator szOp = adios.DefineOperator("ZFPCompressor", adios2::ops::LossyZFP); + szOp.SetParameter("backend", "serial"); var_r32.AddOperation(szOp, {{adios2::ops::zfp::key::rate, rate}}); var_r64.AddOperation(szOp, {{adios2::ops::zfp::key::rate, rate}});