vtk-m/vtkm/worklet/zfp/ZFPTools.h
2018-12-13 14:49:37 -05:00

129 lines
3.8 KiB
C++

//============================================================================
// Copyright (c) Kitware, Inc.
// All rights reserved.
// See LICENSE.txt for details.
// This software is distributed WITHOUT ANY WARRANTY; without even
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the above copyright notice for more information.
//
// Copyright 2014 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
// Copyright 2014 UT-Battelle, LLC.
// Copyright 2014 Los Alamos National Security.
//
// Under the terms of Contract DE-NA0003525 with NTESS,
// the U.S. Government retains certain rights in this software.
//
// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
// Laboratory (LANL), the U.S. Government retains certain rights in
// this software.
//============================================================================
#ifndef vtk_m_worklet_zfp_tool_h
#define vtk_m_worklet_zfp_tool_h
#include <vtkm/Math.h>
#include <vtkm/cont/Algorithm.h>
#include <vtkm/cont/ArrayHandle.h>
#include <vtkm/cont/ArrayHandleConstant.h>
#include <vtkm/cont/ArrayHandleCounting.h>
#include <vtkm/cont/AtomicArray.h>
#include <vtkm/cont/Timer.h>
#include <vtkm/worklet/DispatcherMapField.h>
#include <vtkm/worklet/zfp/ZFPEncode3.h>
using ZFPWord = vtkm::UInt64;
#include <stdio.h>
namespace vtkm
{
namespace worklet
{
namespace detail
{
class MemTransfer : public vtkm::worklet::WorkletMapField
{
public:
VTKM_CONT
MemTransfer() {}
using ControlSignature = void(FieldIn<>, WholeArrayInOut<>);
using ExecutionSignature = void(_1, _2);
template <typename PortalType>
VTKM_EXEC void operator()(const vtkm::Id id, PortalType& outValue) const
{
(void)id;
(void)outValue;
}
}; //class MemTransfer
size_t CalcMem3d(const vtkm::Id3 dims, const int bits_per_block)
{
const size_t vals_per_block = 64;
const size_t size = dims[0] * dims[1] * dims[2];
size_t total_blocks = size / vals_per_block;
const size_t bits_per_word = sizeof(ZFPWord) * 8;
const size_t total_bits = bits_per_block * total_blocks;
const size_t alloc_size = total_bits / bits_per_word;
return alloc_size * sizeof(ZFPWord);
}
size_t CalcMem2d(const vtkm::Id2 dims, const int bits_per_block)
{
constexpr size_t vals_per_block = 16;
const size_t size = dims[0] * dims[1];
size_t total_blocks = size / vals_per_block;
constexpr size_t bits_per_word = sizeof(ZFPWord) * 8;
const size_t total_bits = bits_per_block * total_blocks;
const size_t alloc_size = total_bits / bits_per_word;
return alloc_size * sizeof(ZFPWord);
}
size_t CalcMem1d(const vtkm::Id2 dims, const int bits_per_block)
{
constexpr size_t vals_per_block = 4;
const size_t size = dims[0];
size_t total_blocks = size / vals_per_block;
constexpr size_t bits_per_word = sizeof(ZFPWord) * 8;
const size_t total_bits = bits_per_block * total_blocks;
const size_t alloc_size = total_bits / bits_per_word;
return alloc_size * sizeof(ZFPWord);
}
} // namespace detail
template <typename T>
T* GetVTKMPointer(vtkm::cont::ArrayHandle<T>& handle)
{
typedef typename vtkm::cont::ArrayHandle<T> HandleType;
typedef typename HandleType::template ExecutionTypes<vtkm::cont::DeviceAdapterTagSerial>::Portal
PortalType;
typedef typename vtkm::cont::ArrayPortalToIterators<PortalType>::IteratorType IteratorType;
IteratorType iter =
vtkm::cont::ArrayPortalToIterators<PortalType>(handle.GetPortalControl()).GetBegin();
return &(*iter);
}
template <typename T>
void DataDump(vtkm::cont::ArrayHandle<T> handle, std::string fileName)
{
T* ptr = GetVTKMPointer(handle);
vtkm::Id osize = handle.GetNumberOfValues();
FILE* fp = fopen(fileName.c_str(), "wb");
;
if (fp != NULL)
{
fwrite(ptr, sizeof(T), osize, fp);
}
fclose(fp);
}
} // namespace worklet
} // namespace vtkm
#endif // vtk_m_worklet_zfp_tools_h