Newer
Older
/***************************************************************************
array-operations.h - description
-------------------
begin : Dec 30, 2015
copyright : (C) 2015 by Tomas Oberhuber et al.
email : tomas.oberhuber@fjfi.cvut.cz
***************************************************************************/
/* See Copyright Notice in tnl/Copyright */
// Implemented by: Jakub Klinkovsky
Jakub Klinkovský
committed
#pragma once
#include "benchmarks.h"
Jakub Klinkovský
committed
Jakub Klinkovský
committed
{
namespace benchmarks
{
template< typename Real = double,
typename Index = int >
bool
benchmarkArrayOperations( Benchmark & benchmark,
const int & loops,
Jakub Klinkovský
committed
{
typedef Containers::Array< Real, Devices::Host, Index > HostArray;
typedef Containers::Array< Real, Devices::Cuda, Index > CudaArray;
Jakub Klinkovský
committed
using namespace std;
double datasetSize = ( double ) ( loops * size ) * sizeof( Real ) / oneGB;
HostArray hostArray, hostArray2;
CudaArray deviceArray, deviceArray2;
if( ! hostArray.setSize( size ) ||
! hostArray2.setSize( size )
#ifdef HAVE_CUDA
||
! deviceArray.setSize( size ) ||
! deviceArray2.setSize( size )
#endif
)
{
const char* msg = "error: allocation of arrays failed";
benchmark.addErrorMessage( msg );
Jakub Klinkovský
committed
return false;
Jakub Klinkovský
committed
Real resultHost, resultDevice;
// reset functions
auto reset1 = [&]() {
hostArray.setValue( 1.0 );
Jakub Klinkovský
committed
deviceArray.setValue( 1.0 );
Jakub Klinkovský
committed
};
auto reset2 = [&]() {
hostArray2.setValue( 1.0 );
Jakub Klinkovský
committed
deviceArray2.setValue( 1.0 );
Jakub Klinkovský
committed
};
auto reset12 = [&]() {
reset1();
reset2();
};
reset12();
auto compareHost = [&]() {
resultHost = (int) hostArray == hostArray2;
};
auto compareCuda = [&]() {
resultDevice = (int) deviceArray == deviceArray2;
};
benchmark.setOperation( "comparison (operator==)", 2 * datasetSize );
benchmark.time( reset1, "CPU", compareHost );
#ifdef HAVE_CUDA
benchmark.time( reset1, "GPU", compareCuda );
#endif
Jakub Klinkovský
committed
auto copyAssignHostHost = [&]() {
hostArray = hostArray2;
};
auto copyAssignCudaCuda = [&]() {
deviceArray = deviceArray2;
};
benchmark.setOperation( "copy (operator=)", 2 * datasetSize );
benchmark.time( reset1, "CPU", copyAssignHostHost );
#ifdef HAVE_CUDA
benchmark.time( reset1, "GPU", copyAssignCudaCuda );
#endif
Jakub Klinkovský
committed
auto copyAssignHostCuda = [&]() {
deviceArray = hostArray;
};
auto copyAssignCudaHost = [&]() {
hostArray = deviceArray;
};
benchmark.setOperation( "copy (operator=)", datasetSize );
Jakub Klinkovský
committed
benchmark.time( reset1,
"CPU->GPU", copyAssignHostCuda,
"GPU->CPU", copyAssignCudaHost );
auto setValueHost = [&]() {
hostArray.setValue( 3.0 );
};
auto setValueCuda = [&]() {
deviceArray.setValue( 3.0 );
};
benchmark.setOperation( "setValue", datasetSize );
benchmark.time( reset1, "CPU", setValueHost );
#ifdef HAVE_CUDA
benchmark.time( reset1, "GPU", setValueCuda );
#endif
auto setSizeHost = [&]() {
hostArray.setSize( size );
};
auto setSizeCuda = [&]() {
deviceArray.setSize( size );
};
auto resetSize1 = [&]() {
hostArray.reset();
deviceArray.reset();
};
benchmark.setOperation( "allocation (setSize)", datasetSize );
benchmark.time( resetSize1, "CPU", setSizeHost );
#ifdef HAVE_CUDA
benchmark.time( resetSize1, "GPU", setSizeCuda );
#endif
auto resetSizeHost = [&]() {
hostArray.reset();
};
auto resetSizeCuda = [&]() {
deviceArray.reset();
};
auto setSize1 = [&]() {
hostArray.setSize( size );
deviceArray.setSize( size );
};
benchmark.setOperation( "deallocation (reset)", datasetSize );
benchmark.time( setSize1, "CPU", resetSizeHost );
#ifdef HAVE_CUDA
benchmark.time( setSize1, "GPU", resetSizeCuda );
#endif
Jakub Klinkovský
committed
}
} // namespace benchmarks
} // namespace tnl