Skip to content

Commit

Permalink
Merge pull request #2920 from vicentebolea/zfp-enable-cuda
Browse files Browse the repository at this point in the history
ZFP: enable cuda
  • Loading branch information
JasonRuonanWang authored Oct 25, 2021
2 parents 35b9cf1 + 5545873 commit 1d90987
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 15 deletions.
8 changes: 8 additions & 0 deletions source/adios2/common/ADIOSTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
48 changes: 39 additions & 9 deletions source/adios2/operator/compress/CompressZFP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@
#include "adios2/helper/adiosFunctions.h"
#include <sstream>

/* 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
Expand Down Expand Up @@ -256,6 +261,7 @@ zfp_stream *CompressZFP::GetZFPStream(const Dims &dimensions, DataType type,
const Params &parameters) 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();
Expand All @@ -266,14 +272,38 @@ zfp_stream *CompressZFP::GetZFPStream(const Dims &dimensions, DataType type,
auto itPrecision = parameters.find("precision");
const bool hasPrecision = itPrecision != parameters.end();

if ((hasAccuracy && hasRate) || (hasAccuracy && hasPrecision) ||
(hasRate && hasPrecision) || !(hasAccuracy || hasRate || hasPrecision))
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 && hasPrecision) || (hasAccuracy && hasRate) ||
(hasPrecision && hasRate))
{
std::ostringstream oss;
oss << "\nError: Requisite parameters to zfp not found.";
oss << " The key must be one and only one of 'accuracy', 'rate', "
"or 'precision'.";
oss << " The key and value provided are ";
oss << std::endl
<< "ERROR: ZFP:"
" 'accuracy'|'rate'|'precision' params are mutualy exclusive: ";

for (auto &p : parameters)
{
oss << "(" << p.first << ", " << p.second << ").";
Expand All @@ -284,14 +314,14 @@ zfp_stream *CompressZFP::GetZFPStream(const Dims &dimensions, DataType type,
if (hasAccuracy)
{
const double accuracy = helper::StringTo<double>(
itAccuracy->second, "setting accuracy in call to CompressZfp\n");
itAccuracy->second, "setting 'accuracy' in call to CompressZfp\n");

zfp_stream_set_accuracy(stream, accuracy);
}
else if (hasRate)
{
const double rate = helper::StringTo<double>(
itRate->second, "setting Rate in call to CompressZfp\n");
itRate->second, "setting 'rate' in call to CompressZfp\n");
// TODO support last argument write random access?
zfp_stream_set_rate(stream, rate, GetZfpType(type),
static_cast<unsigned int>(dimensions.size()), 0);
Expand All @@ -301,7 +331,7 @@ zfp_stream *CompressZFP::GetZFPStream(const Dims &dimensions, DataType type,
const unsigned int precision =
static_cast<unsigned int>(helper::StringTo<uint32_t>(
itPrecision->second,
"setting Precision in call to CompressZfp\n"));
"setting 'precision' in call to CompressZfp\n"));
zfp_stream_set_precision(stream, precision);
}

Expand Down
9 changes: 5 additions & 4 deletions testing/adios2/engine/bp/operations/TestBPWriteReadZfp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -201,8 +201,8 @@ void ZFPRate2D(const std::string rate)
adios2::Operator szOp =
adios.DefineOperator("ZFPCompressor", adios2::ops::LossyZFP);

var_r32.AddOperation(szOp, {{"Accuracy", rate}});
var_r64.AddOperation(szOp, {{"accuracy", rate}});
var_r32.AddOperation(szOp, {{"rate", rate}});
var_r64.AddOperation(szOp, {{"rate", rate}});

adios2::Engine bpWriter = io.Open(fname, adios2::Mode::Write);

Expand Down Expand Up @@ -600,8 +600,8 @@ void ZFPRate2DSel(const std::string rate)
adios2::Operator szOp =
adios.DefineOperator("ZFPCompressor", adios2::ops::LossyZFP);

var_r32.AddOperation(szOp, {{"accuracy", rate}});
var_r64.AddOperation(szOp, {{"accuracy", rate}});
var_r32.AddOperation(szOp, {{"rate", rate}});
var_r64.AddOperation(szOp, {{"rate", rate}});

adios2::Engine bpWriter = io.Open(fname, adios2::Mode::Write);

Expand Down Expand Up @@ -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}});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,9 +149,9 @@ void ZfpRate2D(const double rate)
for (size_t step = 0; step < NSteps; ++step)
{
fw.write("r32", r32s.data(), shape, start, count,
{{"zfp", {{"accuracy", std::to_string(rate)}}}});
{{"zfp", {{"rate", std::to_string(rate)}}}});
fw.write("r64", r64s.data(), shape, start, count,
{{"zfp", {{"accuracy", std::to_string(rate)}}}},
{{"zfp", {{"rate", std::to_string(rate)}}}},
adios2::end_step);
}
fw.close();
Expand Down

0 comments on commit 1d90987

Please sign in to comment.