Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

extended benchmark #11

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ string(TOUPPER "${CMAKE_BUILD_TYPE}" U_CMAKE_BUILD_TYPE)
# =====================

option(BENCHMARK_XTENSOR "benchmark against xtensor" ON)
option(BENCHMARK_CLIKE "benchmark against a C-like reference" OFF)
option(BENCHMARK_VIGRA "benchmark against Vigra" OFF)
option(BENCHMARK_EIGEN "benchmark against eigen" OFF)
option(BENCHMARK_BLITZ "benchmark against Blitz" OFF)
option(BENCHMARK_ARMADILLO "benchmark agains Armadillo" OFF)
Expand All @@ -29,6 +31,8 @@ option(BUILD_EXTERNAL_GOOGLEBENCHMARK "Download and build google benchmark" OFF)

if(BENCHMARK_ALL)
set(BENCHMARK_XTENSOR ON)
set(BENCHMARK_CLIKE ON)
set(BENCHMARK_VIGRA ON)
set(BENCHMARK_EIGEN ON)
set(BENCHMARK_BLITZ ON)
set(BENCHMARK_ARMADILLO ON)
Expand Down Expand Up @@ -87,6 +91,8 @@ set(XTENSOR_BENCHMARK
src/benchmark_constructor.hpp
src/benchmark_scalar_assignment.hpp
src/benchmark_iterators.hpp
src/benchmark_lazy_evaluation.hpp
src/benchmark_padding.hpp
src/main.cpp
)

Expand All @@ -112,12 +118,22 @@ if(BENCHMARK_XTENSOR)
target_compile_definitions(${XTENSOR_BENCHMARK_TARGET} PRIVATE HAS_XTENSOR=1)
endif()

if(BENCHMARK_CLIKE)
target_compile_definitions(${XTENSOR_BENCHMARK_TARGET} PRIVATE HAS_CLIKE=1)
endif()

if(BENCHMARK_EIGEN)
find_package(Eigen3 REQUIRED NO_MODULE)
target_compile_definitions(${XTENSOR_BENCHMARK_TARGET} PRIVATE HAS_EIGEN=1 EIGEN_FAST_MATH=1)
target_link_libraries(${XTENSOR_BENCHMARK_TARGET} Eigen3::Eigen)
endif()

if(BENCHMARK_VIGRA)
find_package(Vigra 1.11.1 REQUIRED NO_MODULE)
target_compile_definitions(${XTENSOR_BENCHMARK_TARGET} PRIVATE HAS_VIGRA=1)
target_link_libraries(${XTENSOR_BENCHMARK_TARGET} vigraimpex)
endif()

if(BENCHMARK_BLITZ)
find_package(Blitz REQUIRED)
target_compile_definitions(${XTENSOR_BENCHMARK_TARGET} PRIVATE HAS_BLITZ=1)
Expand Down Expand Up @@ -153,9 +169,15 @@ if(BENCHMARK_XTENSOR)
message("Found xtensor : ${xtensor_INCLUDE_DIRS}")
message("Found xsimd : ${xsimd_INCLUDE_DIRS}\n\n")
endif()
if(BENCHMARK_CLIKE)
message("Will use C-Like : yes")
endif()
if(BENCHMARK_EIGEN)
message("Found eigen : ${EIGEN3_INCLUDE_DIR}")
endif()
if(BENCHMARK_VIGRA)
message("Found Vigra : ${Vigra_INCLUDES}")
endif()
if(BENCHMARK_BLITZ)
message("Found Blitz : ${BLITZ_INCLUDES} | ${BLITZ_LIBRARIES}")
endif()
Expand Down
23 changes: 22 additions & 1 deletion src/benchmark_add_1d.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,12 @@ static_assert(false, "NOT VECTORIZING");
#include <pythonic/numpy/random/rand.hpp>
#endif

#define RANGE 3, 1000
#ifdef HAS_VIGRA
#include "vigra/multi_array.hxx"
#include "vigra/multi_math.hxx"
#endif

#define RANGE 16, 128*128
#define MULTIPLIER 8


Expand Down Expand Up @@ -90,6 +95,22 @@ void Add1D_Blitz(benchmark::State& state)
BENCHMARK(Add1D_Blitz)->RangeMultiplier(MULTIPLIER)->Range(RANGE);
#endif

#ifdef HAS_VIGRA
void Add1D_Vigra(benchmark::State& state)
{
using namespace vigra::multi_math;
vigra::MultiArray<1, double> vA(state.range(0));
vigra::MultiArray<1, double> vB(state.range(0));
for (auto _ : state)
{
vigra::MultiArray<1, double> vRes(state.range(0));
vRes = vA + vB;
benchmark::DoNotOptimize(vRes.data());
}
}
BENCHMARK(Add1D_Vigra)->RangeMultiplier(MULTIPLIER)->Range(RANGE);
#endif

#ifdef HAS_ARMADILLO
void Add1D_Arma(benchmark::State& state)
{
Expand Down
23 changes: 22 additions & 1 deletion src/benchmark_add_2d.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,12 @@
#include <pythonic/numpy/random/rand.hpp>
#endif

#define RANGE 3, 1000
#ifdef HAS_VIGRA
#include "vigra/multi_array.hxx"
#include "vigra/multi_math.hxx"
#endif

#define RANGE 16, 1024
#define MULTIPLIER 8


Expand Down Expand Up @@ -118,6 +123,22 @@ void Add2D_Pythonic(benchmark::State& state)
BENCHMARK(Add2D_Pythonic)->RangeMultiplier(MULTIPLIER)->Range(RANGE);
#endif

#ifdef HAS_VIGRA
void Add2D_Vigra(benchmark::State& state)
{
using namespace vigra::multi_math;
vigra::MultiArray<2, double> vA(state.range(0), state.range(0));
vigra::MultiArray<2, double> vB(state.range(0), state.range(0));
for (auto _ : state)
{
vigra::MultiArray<2, double> vRes(state.range(0), state.range(0));
vRes = vA + vB;
benchmark::DoNotOptimize(vRes.data());
}
}
BENCHMARK(Add2D_Vigra)->RangeMultiplier(MULTIPLIER)->Range(RANGE);
#endif

#undef RANGE
#undef MULTIPLIER

32 changes: 32 additions & 0 deletions src/benchmark_constructor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@
#include <blitz/array.h>
#endif

#ifdef HAS_VIGRA
#include "vigra/multi_array.hxx"
#include "vigra/multi_math.hxx"
#endif

#define RANGE 3, 1000
#define MULTIPLIER 8

Expand Down Expand Up @@ -66,6 +71,19 @@ void Construct2D_Blitz(benchmark::State& state)
BENCHMARK(Construct2D_Blitz)->RangeMultiplier(MULTIPLIER)->Range(RANGE);
#endif

#ifdef HAS_VIGRA
void Construct2D_Vigra(benchmark::State& state)
{
using namespace vigra::multi_math;
for (auto _ : state)
{
vigra::MultiArray<2, double> vArray(state.range(0), state.range(0));
benchmark::DoNotOptimize(vArray);
}
}
BENCHMARK(Construct2D_Vigra)->RangeMultiplier(MULTIPLIER)->Range(RANGE);
#endif

#ifdef HAS_XTENSOR
void ConstructRandom2D_XTensor(benchmark::State& state)
{
Expand Down Expand Up @@ -108,6 +126,20 @@ void ConstructView2d_XTensor(benchmark::State& state)
BENCHMARK(ConstructView2d_XTensor)->RangeMultiplier(MULTIPLIER)->Range(RANGE);
#endif

#ifdef HAS_VIGRA
void ConstructView2d_Vigra(benchmark::State& state)
{
vigra::MultiArray<2,double> vA(state.range(0), state.range(0));

for (auto _ : state)
{
vigra::MultiArrayView<2,double> vAView = vA.subarray({0, 0}, {state.range(0), state.range(0)});
benchmark::DoNotOptimize(vAView);
}
}
BENCHMARK(ConstructView2d_Vigra)->RangeMultiplier(MULTIPLIER)->Range(RANGE);
#endif

#ifdef HAS_EIGEN
void ConstructView2d_Eigen(benchmark::State& state)
{
Expand Down
77 changes: 75 additions & 2 deletions src/benchmark_iterators.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@
#include "xtensor/xarray.hpp"
#endif

#ifdef HAS_CLIKE
#include <vector>
#endif

#ifdef HAS_EIGEN
#include <Eigen/Dense>
#include <Eigen/Core>
Expand All @@ -25,9 +29,13 @@
#include <blitz/array.h>
#endif

#define RANGE 3, 1000
#define MULTIPLIER 8
#ifdef HAS_VIGRA
#include "vigra/multi_array.hxx"
#include "vigra/multi_math.hxx"
#endif

#define RANGE 16, 1024
#define MULTIPLIER 8

#ifdef HAS_XTENSOR
void IterateWhole2D_XTensor(benchmark::State& state)
Expand All @@ -43,6 +51,54 @@ void IterateWhole2D_XTensor(benchmark::State& state)
}
}
BENCHMARK(IterateWhole2D_XTensor)->RangeMultiplier(MULTIPLIER)->Range(RANGE);

void IterateWhole2DView_XTensor(benchmark::State& state)
{
xt::xtensor<double, 2> vTensor({state.range(0), state.range(0)});
auto vView = xt::view(vTensor, xt::all());
for (auto _ : state)
{
double vTmp = 0.0;
for (auto it = vView.begin(); it != vView.end(); ++it) {
vTmp += *it;
}
benchmark::DoNotOptimize(vTmp);
}
}
BENCHMARK(IterateWhole2DView_XTensor)->RangeMultiplier(MULTIPLIER)->Range(RANGE);

void IterateWhole2DStridedView_XTensor(benchmark::State& state)
{
xt::xtensor<double, 2> vTensor({state.range(0), state.range(0)});
auto vView = xt::strided_view(vTensor, {xt::all()});
for (auto _ : state)
{
double vTmp = 0.0;
for (auto it = vView.begin(); it != vView.end(); ++it) {
vTmp += *it;
}
benchmark::DoNotOptimize(vTmp);
}
}
BENCHMARK(IterateWhole2DStridedView_XTensor)->RangeMultiplier(MULTIPLIER)->Range(RANGE);
#endif

#ifdef HAS_CLIKE
void IterateWhole2D_CLike(benchmark::State& state)
{
std::vector<double> vTensor(state.range(0) * state.range(0));
for (auto _ : state)
{
double vTmp = 0.0;
double* it = vTensor.data();
double* end = vTensor.data() + vTensor.size();
for (; it != end; ++it) {
vTmp += *it;
}
benchmark::DoNotOptimize(vTmp);
}
}
BENCHMARK(IterateWhole2D_CLike)->RangeMultiplier(MULTIPLIER)->Range(RANGE);
#endif

//#ifdef HAS_EIGEN
Expand Down Expand Up @@ -79,6 +135,23 @@ void IterateWhole2D_Blitz(benchmark::State& state)
BENCHMARK(IterateWhole2D_Blitz)->RangeMultiplier(MULTIPLIER)->Range(RANGE);
#endif

#ifdef HAS_VIGRA
void IterateWhole2D_Vigra(benchmark::State& state)
{
using namespace vigra::multi_math;
vigra::MultiArray<2, double> vArray(state.range(0), state.range(0));
for (auto _ : state)
{
double vTmp = 0.0;
for (auto it = vArray.begin(); it != vArray.end(); ++it) {
vTmp += *it;
}
benchmark::DoNotOptimize(vTmp);
}
}
BENCHMARK(IterateWhole2D_Vigra)->RangeMultiplier(MULTIPLIER)->Range(RANGE);
#endif

#undef RANGE
#undef MULTIPLIER

Loading