mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
Clang-format tests, examples, libraries, benchmarks, etc.
This commit is contained in:
committed by
Rasmus Munk Larsen
parent
3252ecc7a4
commit
46e9cdb7fe
@@ -20,17 +20,14 @@
|
||||
namespace testing {
|
||||
class Benchmark {
|
||||
public:
|
||||
Benchmark(const char* name, void (*fn)(int)) {
|
||||
Register(name, fn, NULL);
|
||||
}
|
||||
Benchmark(const char* name, void (*fn_range)(int, int)) {
|
||||
Register(name, NULL, fn_range);
|
||||
}
|
||||
Benchmark(const char* name, void (*fn)(int)) { Register(name, fn, NULL); }
|
||||
Benchmark(const char* name, void (*fn_range)(int, int)) { Register(name, NULL, fn_range); }
|
||||
Benchmark* Arg(int x);
|
||||
Benchmark* Range(int lo, int hi);
|
||||
const char* Name();
|
||||
bool ShouldRun(int argc, char* argv[]);
|
||||
void Run();
|
||||
|
||||
private:
|
||||
const char* name_;
|
||||
void (*fn_)(int);
|
||||
@@ -45,5 +42,4 @@ void SetBenchmarkFlopsProcessed(int64_t);
|
||||
void StopBenchmarkTiming();
|
||||
void StartBenchmarkTiming();
|
||||
#define BENCHMARK(f) \
|
||||
static ::testing::Benchmark* _benchmark_##f __attribute__((unused)) = \
|
||||
(new ::testing::Benchmark(#f, f))
|
||||
static ::testing::Benchmark* _benchmark_##f __attribute__((unused)) = (new ::testing::Benchmark(#f, f))
|
||||
|
||||
@@ -38,24 +38,22 @@ static int g_name_column_width = 20;
|
||||
|
||||
static int Round(int n) {
|
||||
int base = 1;
|
||||
while (base*10 < n) {
|
||||
while (base * 10 < n) {
|
||||
base *= 10;
|
||||
}
|
||||
if (n < 2*base) {
|
||||
return 2*base;
|
||||
if (n < 2 * base) {
|
||||
return 2 * base;
|
||||
}
|
||||
if (n < 5*base) {
|
||||
return 5*base;
|
||||
if (n < 5 * base) {
|
||||
return 5 * base;
|
||||
}
|
||||
return 10*base;
|
||||
return 10 * base;
|
||||
}
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <mach/mach_time.h>
|
||||
static mach_timebase_info_data_t g_time_info;
|
||||
static void __attribute__((constructor)) init_info() {
|
||||
mach_timebase_info(&g_time_info);
|
||||
}
|
||||
#include <mach/mach_time.h>
|
||||
static mach_timebase_info_data_t g_time_info;
|
||||
static void __attribute__((constructor)) init_info() { mach_timebase_info(&g_time_info); }
|
||||
#endif
|
||||
|
||||
static int64_t NanoTime() {
|
||||
@@ -92,9 +90,7 @@ Benchmark* Benchmark::Range(int lo, int hi) {
|
||||
return this;
|
||||
}
|
||||
|
||||
const char* Benchmark::Name() {
|
||||
return name_;
|
||||
}
|
||||
const char* Benchmark::Name() { return name_; }
|
||||
bool Benchmark::ShouldRun(int argc, char* argv[]) {
|
||||
if (argc == 1) {
|
||||
return true; // With no arguments, we run all benchmarks.
|
||||
@@ -157,42 +153,40 @@ void Benchmark::RunWithArg(int arg) {
|
||||
RunRepeatedlyWithArg(iterations, arg);
|
||||
while (g_benchmark_total_time_ns < 1e9 && iterations < 1e9) {
|
||||
int last = iterations;
|
||||
if (g_benchmark_total_time_ns/iterations == 0) {
|
||||
if (g_benchmark_total_time_ns / iterations == 0) {
|
||||
iterations = 1e9;
|
||||
} else {
|
||||
iterations = 1e9 / (g_benchmark_total_time_ns/iterations);
|
||||
iterations = 1e9 / (g_benchmark_total_time_ns / iterations);
|
||||
}
|
||||
iterations = std::max(last + 1, std::min(iterations + iterations/2, 100*last));
|
||||
iterations = std::max(last + 1, std::min(iterations + iterations / 2, 100 * last));
|
||||
iterations = Round(iterations);
|
||||
RunRepeatedlyWithArg(iterations, arg);
|
||||
}
|
||||
char throughput[100];
|
||||
throughput[0] = '\0';
|
||||
if (g_benchmark_total_time_ns > 0 && g_flops_processed > 0) {
|
||||
double mflops_processed = static_cast<double>(g_flops_processed)/1e6;
|
||||
double seconds = static_cast<double>(g_benchmark_total_time_ns)/1e9;
|
||||
snprintf(throughput, sizeof(throughput), " %8.2f MFlops/s", mflops_processed/seconds);
|
||||
double mflops_processed = static_cast<double>(g_flops_processed) / 1e6;
|
||||
double seconds = static_cast<double>(g_benchmark_total_time_ns) / 1e9;
|
||||
snprintf(throughput, sizeof(throughput), " %8.2f MFlops/s", mflops_processed / seconds);
|
||||
}
|
||||
char full_name[100];
|
||||
if (fn_range_ != NULL) {
|
||||
if (arg >= (1<<20)) {
|
||||
snprintf(full_name, sizeof(full_name), "%s/%dM", name_, arg/(1<<20));
|
||||
} else if (arg >= (1<<10)) {
|
||||
snprintf(full_name, sizeof(full_name), "%s/%dK", name_, arg/(1<<10));
|
||||
if (arg >= (1 << 20)) {
|
||||
snprintf(full_name, sizeof(full_name), "%s/%dM", name_, arg / (1 << 20));
|
||||
} else if (arg >= (1 << 10)) {
|
||||
snprintf(full_name, sizeof(full_name), "%s/%dK", name_, arg / (1 << 10));
|
||||
} else {
|
||||
snprintf(full_name, sizeof(full_name), "%s/%d", name_, arg);
|
||||
}
|
||||
} else {
|
||||
snprintf(full_name, sizeof(full_name), "%s", name_);
|
||||
}
|
||||
printf("%-*s %10d %10" PRId64 "%s\n", g_name_column_width, full_name,
|
||||
iterations, g_benchmark_total_time_ns/iterations, throughput);
|
||||
printf("%-*s %10d %10" PRId64 "%s\n", g_name_column_width, full_name, iterations,
|
||||
g_benchmark_total_time_ns / iterations, throughput);
|
||||
fflush(stdout);
|
||||
}
|
||||
} // namespace testing
|
||||
void SetBenchmarkFlopsProcessed(int64_t x) {
|
||||
g_flops_processed = x;
|
||||
}
|
||||
void SetBenchmarkFlopsProcessed(int64_t x) { g_flops_processed = x; }
|
||||
void StopBenchmarkTiming() {
|
||||
if (g_benchmark_start_time_ns != 0) {
|
||||
g_benchmark_total_time_ns += NanoTime() - g_benchmark_start_time_ns;
|
||||
|
||||
@@ -4,10 +4,9 @@
|
||||
|
||||
#include "tensor_benchmarks.h"
|
||||
|
||||
#define CREATE_THREAD_POOL(threads) \
|
||||
Eigen::ThreadPool pool(threads); \
|
||||
Eigen::ThreadPoolDevice device(&pool, threads);
|
||||
|
||||
#define CREATE_THREAD_POOL(threads) \
|
||||
Eigen::ThreadPool pool(threads); \
|
||||
Eigen::ThreadPoolDevice device(&pool, threads);
|
||||
|
||||
// Contractions for number of threads ranging from 1 to 32
|
||||
// Dimensions are Rows, Cols, Depth
|
||||
@@ -20,7 +19,6 @@ Eigen::ThreadPoolDevice device(&pool, threads);
|
||||
} \
|
||||
BENCHMARK_RANGE(BM_##Contraction##_##D1##x##D2##x##D3, 1, 32);
|
||||
|
||||
|
||||
// Vector Matrix and Matrix Vector products
|
||||
BM_ContractionCPU(1, 2000, 500);
|
||||
BM_ContractionCPU(2000, 1, 500);
|
||||
|
||||
@@ -7,30 +7,23 @@ typedef int TensorIndex;
|
||||
#include "unsupported/Eigen/CXX11/Tensor"
|
||||
#include "benchmark.h"
|
||||
|
||||
#define BENCHMARK_RANGE(bench, lo, hi) \
|
||||
BENCHMARK(bench)->Range(lo, hi)
|
||||
#define BENCHMARK_RANGE(bench, lo, hi) BENCHMARK(bench)->Range(lo, hi)
|
||||
|
||||
using Eigen::Tensor;
|
||||
using Eigen::TensorMap;
|
||||
|
||||
// TODO(bsteiner): also templatize on the input type since we have users
|
||||
// for int8 as well as floats.
|
||||
template <typename Device, typename T> class BenchmarkSuite {
|
||||
template <typename Device, typename T>
|
||||
class BenchmarkSuite {
|
||||
public:
|
||||
BenchmarkSuite(const Device& device, size_t m, size_t k, size_t n)
|
||||
: m_(m), k_(k), n_(n), device_(device) {
|
||||
BenchmarkSuite(const Device& device, size_t m, size_t k, size_t n) : m_(m), k_(k), n_(n), device_(device) {
|
||||
initialize();
|
||||
}
|
||||
|
||||
BenchmarkSuite(const Device& device, size_t m)
|
||||
: m_(m), k_(m), n_(m), device_(device) {
|
||||
initialize();
|
||||
}
|
||||
BenchmarkSuite(const Device& device, size_t m) : m_(m), k_(m), n_(m), device_(device) { initialize(); }
|
||||
|
||||
BenchmarkSuite(const Device& device, size_t m, size_t k)
|
||||
: m_(1), k_(k), n_(m), device_(device) {
|
||||
initialize();
|
||||
}
|
||||
BenchmarkSuite(const Device& device, size_t m, size_t k) : m_(1), k_(k), n_(m), device_(device) { initialize(); }
|
||||
|
||||
~BenchmarkSuite() {
|
||||
device_.deallocate(a_);
|
||||
@@ -40,7 +33,7 @@ template <typename Device, typename T> class BenchmarkSuite {
|
||||
|
||||
void memcpy(int num_iters) {
|
||||
eigen_assert(m_ == k_ && k_ == n_);
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
device_.memcpy(c_, a_, m_ * m_ * sizeof(T));
|
||||
}
|
||||
@@ -65,7 +58,7 @@ template <typename Device, typename T> class BenchmarkSuite {
|
||||
}
|
||||
const TensorMap<Tensor<int, 2, 0, TensorIndex>, Eigen::Aligned> A((int*)a_, sizes);
|
||||
TensorMap<Tensor<T, 2, 0, TensorIndex>, Eigen::Aligned> B(b_, sizes);
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
B.device(device_) = A.template cast<T>();
|
||||
}
|
||||
@@ -84,7 +77,7 @@ template <typename Device, typename T> class BenchmarkSuite {
|
||||
sizes[0] = m_;
|
||||
sizes[1] = m_;
|
||||
TensorMap<Tensor<T, 2>, Eigen::Aligned> C(c_, sizes);
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
C.device(device_) = C.random();
|
||||
}
|
||||
@@ -106,33 +99,25 @@ template <typename Device, typename T> class BenchmarkSuite {
|
||||
const TensorMap<Tensor<T, 2>, Eigen::Aligned> B(b_, sizes);
|
||||
TensorMap<Tensor<T, 2>, Eigen::Aligned> C(c_, sizes);
|
||||
|
||||
const Eigen::DSizes<TensorIndex, 2> quarter_sizes(m_/2, m_/2);
|
||||
const Eigen::DSizes<TensorIndex, 2> quarter_sizes(m_ / 2, m_ / 2);
|
||||
const Eigen::DSizes<TensorIndex, 2> first_quadrant(0, 0);
|
||||
const Eigen::DSizes<TensorIndex, 2> second_quadrant(0, m_/2);
|
||||
const Eigen::DSizes<TensorIndex, 2> third_quadrant(m_/2, 0);
|
||||
const Eigen::DSizes<TensorIndex, 2> fourth_quadrant(m_/2, m_/2);
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
const Eigen::DSizes<TensorIndex, 2> second_quadrant(0, m_ / 2);
|
||||
const Eigen::DSizes<TensorIndex, 2> third_quadrant(m_ / 2, 0);
|
||||
const Eigen::DSizes<TensorIndex, 2> fourth_quadrant(m_ / 2, m_ / 2);
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
C.slice(first_quadrant, quarter_sizes).device(device_) =
|
||||
A.slice(first_quadrant, quarter_sizes);
|
||||
C.slice(second_quadrant, quarter_sizes).device(device_) =
|
||||
B.slice(second_quadrant, quarter_sizes);
|
||||
C.slice(third_quadrant, quarter_sizes).device(device_) =
|
||||
A.slice(third_quadrant, quarter_sizes);
|
||||
C.slice(fourth_quadrant, quarter_sizes).device(device_) =
|
||||
B.slice(fourth_quadrant, quarter_sizes);
|
||||
C.slice(first_quadrant, quarter_sizes).device(device_) = A.slice(first_quadrant, quarter_sizes);
|
||||
C.slice(second_quadrant, quarter_sizes).device(device_) = B.slice(second_quadrant, quarter_sizes);
|
||||
C.slice(third_quadrant, quarter_sizes).device(device_) = A.slice(third_quadrant, quarter_sizes);
|
||||
C.slice(fourth_quadrant, quarter_sizes).device(device_) = B.slice(fourth_quadrant, quarter_sizes);
|
||||
}
|
||||
#endif
|
||||
StartBenchmarkTiming();
|
||||
for (int iter = 0; iter < num_iters; ++iter) {
|
||||
C.slice(first_quadrant, quarter_sizes).device(device_) =
|
||||
A.slice(first_quadrant, quarter_sizes);
|
||||
C.slice(second_quadrant, quarter_sizes).device(device_) =
|
||||
B.slice(second_quadrant, quarter_sizes);
|
||||
C.slice(third_quadrant, quarter_sizes).device(device_) =
|
||||
A.slice(third_quadrant, quarter_sizes);
|
||||
C.slice(fourth_quadrant, quarter_sizes).device(device_) =
|
||||
B.slice(fourth_quadrant, quarter_sizes);
|
||||
C.slice(first_quadrant, quarter_sizes).device(device_) = A.slice(first_quadrant, quarter_sizes);
|
||||
C.slice(second_quadrant, quarter_sizes).device(device_) = B.slice(second_quadrant, quarter_sizes);
|
||||
C.slice(third_quadrant, quarter_sizes).device(device_) = A.slice(third_quadrant, quarter_sizes);
|
||||
C.slice(fourth_quadrant, quarter_sizes).device(device_) = B.slice(fourth_quadrant, quarter_sizes);
|
||||
}
|
||||
// Record the number of values copied from the rhs slice to the lhs slice
|
||||
// each second
|
||||
@@ -147,7 +132,7 @@ template <typename Device, typename T> class BenchmarkSuite {
|
||||
Eigen::array<TensorIndex, 1> output_size;
|
||||
output_size[0] = n_;
|
||||
TensorMap<Tensor<T, 1, 0, TensorIndex>, Eigen::Aligned> C(c_, output_size);
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
C.device(device_) = B.chip(iter % k_, 0);
|
||||
}
|
||||
@@ -168,7 +153,7 @@ template <typename Device, typename T> class BenchmarkSuite {
|
||||
Eigen::array<TensorIndex, 1> output_size;
|
||||
output_size[0] = n_;
|
||||
TensorMap<Tensor<T, 1, 0, TensorIndex>, Eigen::Aligned> C(c_, output_size);
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
C.device(device_) = B.chip(iter % n_, 1);
|
||||
}
|
||||
@@ -195,7 +180,7 @@ template <typename Device, typename T> class BenchmarkSuite {
|
||||
Eigen::array<int, 2> shuffle;
|
||||
shuffle[0] = 1;
|
||||
shuffle[1] = 0;
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
B.device(device_) = A.shuffle(shuffle);
|
||||
}
|
||||
@@ -208,20 +193,19 @@ template <typename Device, typename T> class BenchmarkSuite {
|
||||
finalizeBenchmark(static_cast<int64_t>(m_) * k_ * num_iters);
|
||||
}
|
||||
|
||||
void padding(int num_iters) {
|
||||
void padding(int num_iters) {
|
||||
eigen_assert(m_ == k_);
|
||||
Eigen::array<TensorIndex, 2> size_a;
|
||||
size_a[0] = m_;
|
||||
size_a[1] = k_-3;
|
||||
size_a[1] = k_ - 3;
|
||||
const TensorMap<Tensor<T, 2>, Eigen::Aligned> A(a_, size_a);
|
||||
Eigen::array<TensorIndex, 2> size_b;
|
||||
size_b[0] = k_;
|
||||
size_b[1] = m_;
|
||||
TensorMap<Tensor<T, 2>, Eigen::Aligned> B(b_, size_b);
|
||||
|
||||
Eigen::IndexPairList<Eigen::type2indexpair<0, 0>,
|
||||
Eigen::type2indexpair<2, 1> > paddings;
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
Eigen::IndexPairList<Eigen::type2indexpair<0, 0>, Eigen::type2indexpair<2, 1>> paddings;
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
B.device(device_) = A.pad(paddings);
|
||||
}
|
||||
@@ -234,7 +218,7 @@ template <typename Device, typename T> class BenchmarkSuite {
|
||||
finalizeBenchmark(static_cast<int64_t>(m_) * k_ * num_iters);
|
||||
}
|
||||
|
||||
void striding(int num_iters) {
|
||||
void striding(int num_iters) {
|
||||
eigen_assert(m_ == k_);
|
||||
Eigen::array<TensorIndex, 2> size_a;
|
||||
size_a[0] = m_;
|
||||
@@ -242,12 +226,12 @@ template <typename Device, typename T> class BenchmarkSuite {
|
||||
const TensorMap<Tensor<T, 2>, Eigen::Aligned> A(a_, size_a);
|
||||
Eigen::array<TensorIndex, 2> size_b;
|
||||
size_b[0] = m_;
|
||||
size_b[1] = k_/2;
|
||||
size_b[1] = k_ / 2;
|
||||
TensorMap<Tensor<T, 2>, Eigen::Aligned> B(b_, size_b);
|
||||
|
||||
Eigen::IndexList<Eigen::type2index<1>, Eigen::type2index<2> > strides;
|
||||
Eigen::IndexList<Eigen::type2index<1>, Eigen::type2index<2>> strides;
|
||||
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
B.device(device_) = A.stride(strides);
|
||||
}
|
||||
@@ -260,7 +244,6 @@ template <typename Device, typename T> class BenchmarkSuite {
|
||||
finalizeBenchmark(static_cast<int64_t>(m_) * k_ * num_iters);
|
||||
}
|
||||
|
||||
|
||||
void broadcasting(int num_iters) {
|
||||
Eigen::array<TensorIndex, 2> size_a;
|
||||
size_a[0] = m_;
|
||||
@@ -273,7 +256,7 @@ template <typename Device, typename T> class BenchmarkSuite {
|
||||
Eigen::IndexList<Eigen::type2index<1>, int> broadcast;
|
||||
broadcast.set(1, n_);
|
||||
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
C.device(device_) = A.broadcast(broadcast);
|
||||
}
|
||||
@@ -294,7 +277,7 @@ template <typename Device, typename T> class BenchmarkSuite {
|
||||
const TensorMap<Tensor<T, 2>, Eigen::Aligned> A(a_, sizes);
|
||||
const TensorMap<Tensor<T, 2>, Eigen::Aligned> B(b_, sizes);
|
||||
TensorMap<Tensor<T, 2>, Eigen::Aligned> C(c_, sizes);
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
C.device(device_) = A * A.constant(static_cast<T>(3.14)) + B * B.constant(static_cast<T>(2.7));
|
||||
}
|
||||
@@ -317,10 +300,10 @@ template <typename Device, typename T> class BenchmarkSuite {
|
||||
const TensorMap<Tensor<T, 2>, Eigen::Aligned> B(b_, sizes);
|
||||
TensorMap<Tensor<T, 2>, Eigen::Aligned> C(c_, sizes);
|
||||
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
C.device(device_) = A.rsqrt() + B.sqrt() * B.square();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
StartBenchmarkTiming();
|
||||
for (int iter = 0; iter < num_iters; ++iter) {
|
||||
@@ -339,7 +322,7 @@ for (int iter = 0; iter < 10; ++iter) {
|
||||
const TensorMap<Tensor<T, 2>, Eigen::Aligned> A(a_, sizes);
|
||||
const TensorMap<Tensor<T, 2>, Eigen::Aligned> B(b_, sizes);
|
||||
TensorMap<Tensor<T, 2>, Eigen::Aligned> C(c_, sizes);
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
C.device(device_) = A.exp() + B.log();
|
||||
}
|
||||
@@ -353,7 +336,7 @@ for (int iter = 0; iter < 10; ++iter) {
|
||||
finalizeBenchmark(static_cast<int64_t>(m_) * m_ * num_iters);
|
||||
}
|
||||
|
||||
// Row reduction
|
||||
// Row reduction
|
||||
void rowReduction(int num_iters) {
|
||||
Eigen::array<TensorIndex, 2> input_size;
|
||||
input_size[0] = k_;
|
||||
@@ -363,10 +346,10 @@ for (int iter = 0; iter < 10; ++iter) {
|
||||
output_size[0] = n_;
|
||||
TensorMap<Tensor<T, 1, 0, TensorIndex>, Eigen::Aligned> C(c_, output_size);
|
||||
Eigen::IndexList<Eigen::type2index<0>> sum_along_dim;
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
C.device(device_) = B.sum(sum_along_dim);
|
||||
}
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
C.device(device_) = B.sum(sum_along_dim);
|
||||
}
|
||||
#endif
|
||||
StartBenchmarkTiming();
|
||||
for (int iter = 0; iter < num_iters; ++iter) {
|
||||
@@ -382,12 +365,10 @@ for (int iter = 0; iter < 10; ++iter) {
|
||||
Eigen::array<TensorIndex, 2> input_size;
|
||||
input_size[0] = k_;
|
||||
input_size[1] = n_;
|
||||
const TensorMap<Tensor<T, 2, 0, TensorIndex>, Eigen::Aligned> B(
|
||||
b_, input_size);
|
||||
const TensorMap<Tensor<T, 2, 0, TensorIndex>, Eigen::Aligned> B(b_, input_size);
|
||||
Eigen::array<TensorIndex, 1> output_size;
|
||||
output_size[0] = k_;
|
||||
TensorMap<Tensor<T, 1, 0, TensorIndex>, Eigen::Aligned> A(
|
||||
a_, output_size);
|
||||
TensorMap<Tensor<T, 1, 0, TensorIndex>, Eigen::Aligned> A(a_, output_size);
|
||||
|
||||
#ifndef EIGEN_HAS_INDEX_LIST
|
||||
Eigen::array<TensorIndex, 1> sum_along_dim;
|
||||
@@ -397,10 +378,10 @@ for (int iter = 0; iter < 10; ++iter) {
|
||||
// optimize the code.
|
||||
Eigen::IndexList<Eigen::type2index<1>> sum_along_dim;
|
||||
#endif
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
A.device(device_) = B.sum(sum_along_dim);
|
||||
}
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
A.device(device_) = B.sum(sum_along_dim);
|
||||
}
|
||||
#endif
|
||||
StartBenchmarkTiming();
|
||||
for (int iter = 0; iter < num_iters; ++iter) {
|
||||
@@ -416,12 +397,10 @@ for (int iter = 0; iter < 10; ++iter) {
|
||||
Eigen::array<TensorIndex, 2> input_size;
|
||||
input_size[0] = k_;
|
||||
input_size[1] = n_;
|
||||
const TensorMap<Tensor<T, 2, 0, TensorIndex>, Eigen::Aligned> B(
|
||||
b_, input_size);
|
||||
const TensorMap<Tensor<T, 2, 0, TensorIndex>, Eigen::Aligned> B(b_, input_size);
|
||||
Eigen::array<TensorIndex, 0> output_size;
|
||||
TensorMap<Tensor<T, 0, 0, TensorIndex>, Eigen::Aligned> C(
|
||||
c_, output_size);
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
TensorMap<Tensor<T, 0, 0, TensorIndex>, Eigen::Aligned> C(c_, output_size);
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
C.device(device_) = B.sum();
|
||||
}
|
||||
@@ -435,28 +414,16 @@ for (int iter = 0; iter < 10; ++iter) {
|
||||
finalizeBenchmark(static_cast<int64_t>(k_) * n_ * num_iters);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// do a contraction which is equivalent to a matrix multiplication
|
||||
void contraction(int num_iters) {
|
||||
contraction<static_cast<int>(Eigen::ColMajor)>(num_iters, false, false);
|
||||
}
|
||||
void contraction(int num_iters) { contraction<static_cast<int>(Eigen::ColMajor)>(num_iters, false, false); }
|
||||
|
||||
void contractionRowMajor(int num_iters) {
|
||||
contraction<static_cast<int>(Eigen::RowMajor)>(num_iters, false, false);
|
||||
}
|
||||
|
||||
void contractionRowMajorAT(int num_iters) {
|
||||
contraction<static_cast<int>(Eigen::RowMajor)>(num_iters, true, false);
|
||||
}
|
||||
void contractionRowMajor(int num_iters) { contraction<static_cast<int>(Eigen::RowMajor)>(num_iters, false, false); }
|
||||
|
||||
void contractionRowMajorBT(int num_iters) {
|
||||
contraction<static_cast<int>(Eigen::RowMajor)>(num_iters, false, true);
|
||||
}
|
||||
void contractionRowMajorAT(int num_iters) { contraction<static_cast<int>(Eigen::RowMajor)>(num_iters, true, false); }
|
||||
|
||||
void contractionRowMajorABT(int num_iters) {
|
||||
contraction<static_cast<int>(Eigen::RowMajor)>(num_iters, true, true);
|
||||
}
|
||||
void contractionRowMajorBT(int num_iters) { contraction<static_cast<int>(Eigen::RowMajor)>(num_iters, false, true); }
|
||||
|
||||
void contractionRowMajorABT(int num_iters) { contraction<static_cast<int>(Eigen::RowMajor)>(num_iters, true, true); }
|
||||
|
||||
void convolution(int num_iters, int kernel_x, int kernel_y) {
|
||||
Eigen::array<TensorIndex, 2> input_sizes;
|
||||
@@ -474,10 +441,10 @@ for (int iter = 0; iter < 10; ++iter) {
|
||||
Eigen::array<TensorIndex, 2> dims;
|
||||
dims[0] = 0;
|
||||
dims[1] = 1;
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
C.device(device_) = A.convolve(B, dims);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
StartBenchmarkTiming();
|
||||
for (int iter = 0; iter < num_iters; ++iter) {
|
||||
@@ -485,20 +452,20 @@ for (int iter = 0; iter < 10; ++iter) {
|
||||
}
|
||||
// Record the number of FLOPs executed per second (kernel_size
|
||||
// multiplications and additions for each value in the resulting tensor)
|
||||
finalizeBenchmark(static_cast<int64_t>(2) *
|
||||
(m_ - kernel_x + 1) * (n_ - kernel_y + 1) * kernel_x * kernel_y * num_iters);
|
||||
finalizeBenchmark(static_cast<int64_t>(2) * (m_ - kernel_x + 1) * (n_ - kernel_y + 1) * kernel_x * kernel_y *
|
||||
num_iters);
|
||||
}
|
||||
|
||||
private:
|
||||
// do a contraction which is equivalent to a matrix multiplication
|
||||
template<int Layout>
|
||||
// do a contraction which is equivalent to a matrix multiplication
|
||||
template <int Layout>
|
||||
void contraction(int num_iters, bool trans_a, bool trans_b) {
|
||||
Eigen::array<TensorIndex, 2> sizeA;
|
||||
sizeA[0] = (trans_a ? k_: m_);
|
||||
sizeA[1] = (trans_a ? m_: k_);
|
||||
sizeA[0] = (trans_a ? k_ : m_);
|
||||
sizeA[1] = (trans_a ? m_ : k_);
|
||||
Eigen::array<TensorIndex, 2> sizeB;
|
||||
sizeB[0] = (trans_b ? n_: k_);
|
||||
sizeB[1] = (trans_b ? k_: n_);
|
||||
sizeB[0] = (trans_b ? n_ : k_);
|
||||
sizeB[1] = (trans_b ? k_ : n_);
|
||||
Eigen::array<TensorIndex, 2> sizeC;
|
||||
sizeC[0] = m_;
|
||||
sizeC[1] = n_;
|
||||
@@ -512,10 +479,10 @@ for (int iter = 0; iter < 10; ++iter) {
|
||||
TensorIndex a_contract_dim = (trans_a ? 0 : 1);
|
||||
TensorIndex b_contract_dim = (trans_b ? 1 : 0);
|
||||
dims[0] = DimPair(a_contract_dim, b_contract_dim);
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
C.device(device_) = A.contract(B, dims);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
StartBenchmarkTiming();
|
||||
for (int iter = 0; iter < num_iters; ++iter) {
|
||||
@@ -527,16 +494,15 @@ for (int iter = 0; iter < 10; ++iter) {
|
||||
}
|
||||
|
||||
void initialize() {
|
||||
a_ = (T *) device_.allocate(m_ * k_ * sizeof(T));
|
||||
b_ = (T *) device_.allocate(k_ * n_ * sizeof(T));
|
||||
c_ = (T *) device_.allocate(m_ * n_ * sizeof(T));
|
||||
a_ = (T*)device_.allocate(m_ * k_ * sizeof(T));
|
||||
b_ = (T*)device_.allocate(k_ * n_ * sizeof(T));
|
||||
c_ = (T*)device_.allocate(m_ * n_ * sizeof(T));
|
||||
|
||||
// Initialize the content of the memory pools to prevent asan from
|
||||
// complaining.
|
||||
device_.fill(a_, a_ + m_ * k_, T(12));
|
||||
device_.fill(b_, b_ + k_ * n_, T(23));
|
||||
device_.fill(c_, c_ + m_ * n_, T(31));
|
||||
|
||||
}
|
||||
|
||||
inline void finalizeBenchmark(int64_t num_items) {
|
||||
@@ -554,7 +520,6 @@ for (int iter = 0; iter < 10; ++iter) {
|
||||
SetBenchmarkFlopsProcessed(num_items);
|
||||
}
|
||||
|
||||
|
||||
TensorIndex m_;
|
||||
TensorIndex k_;
|
||||
TensorIndex n_;
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
|
||||
#include "tensor_benchmarks.h"
|
||||
|
||||
#define CREATE_THREAD_POOL(threads) \
|
||||
Eigen::ThreadPool pool(threads); \
|
||||
Eigen::ThreadPoolDevice device(&pool, threads);
|
||||
#define CREATE_THREAD_POOL(threads) \
|
||||
Eigen::ThreadPool pool(threads); \
|
||||
Eigen::ThreadPoolDevice device(&pool, threads);
|
||||
|
||||
// Simple functions
|
||||
#define BM_FuncCPU(FUNC, THREADS) \
|
||||
@@ -78,7 +78,6 @@ BM_FuncCPU(colReduction, 4);
|
||||
BM_FuncCPU(colReduction, 8);
|
||||
BM_FuncCPU(colReduction, 12);
|
||||
|
||||
|
||||
// Contractions
|
||||
#define BM_FuncWithInputDimsCPU(FUNC, D1, D2, D3, THREADS) \
|
||||
static void BM_##FUNC##_##D1##x##D2##x##D3##_##THREADS##T(int iters, int N) { \
|
||||
@@ -95,7 +94,6 @@ BM_FuncCPU(colReduction, 12);
|
||||
} \
|
||||
BENCHMARK_RANGE(BM_##FUNC##_##D1##x##D2##x##D3##_##THREADS##T, 10, 5000);
|
||||
|
||||
|
||||
BM_FuncWithInputDimsCPU(contraction, N, N, N, 1);
|
||||
BM_FuncWithInputDimsCPU(contraction, N, N, N, 4);
|
||||
BM_FuncWithInputDimsCPU(contraction, N, N, N, 8);
|
||||
@@ -132,15 +130,14 @@ BM_FuncWithInputDimsCPU(contraction, N, N, 1, 8);
|
||||
BM_FuncWithInputDimsCPU(contraction, N, N, 1, 12);
|
||||
BM_FuncWithInputDimsCPU(contraction, N, N, 1, 16);
|
||||
|
||||
|
||||
// Convolutions
|
||||
#define BM_FuncWithKernelDimsCPU(FUNC, DIM1, DIM2, THREADS) \
|
||||
static void BM_##FUNC##_##DIM1##x##DIM2##_##THREADS##T(int iters, int N) { \
|
||||
StopBenchmarkTiming(); \
|
||||
CREATE_THREAD_POOL(THREADS); \
|
||||
BenchmarkSuite<Eigen::ThreadPoolDevice, float> suite(device, N); \
|
||||
suite.FUNC(iters, DIM1, DIM2); \
|
||||
} \
|
||||
#define BM_FuncWithKernelDimsCPU(FUNC, DIM1, DIM2, THREADS) \
|
||||
static void BM_##FUNC##_##DIM1##x##DIM2##_##THREADS##T(int iters, int N) { \
|
||||
StopBenchmarkTiming(); \
|
||||
CREATE_THREAD_POOL(THREADS); \
|
||||
BenchmarkSuite<Eigen::ThreadPoolDevice, float> suite(device, N); \
|
||||
suite.FUNC(iters, DIM1, DIM2); \
|
||||
} \
|
||||
BENCHMARK_RANGE(BM_##FUNC##_##DIM1##x##DIM2##_##THREADS##T, 128, 5000);
|
||||
|
||||
BM_FuncWithKernelDimsCPU(convolution, 7, 1, 4);
|
||||
|
||||
@@ -7,20 +7,20 @@
|
||||
#include "tensor_benchmarks.h"
|
||||
|
||||
// Simple functions
|
||||
#define BM_FuncGPU(FUNC) \
|
||||
static void BM_##FUNC(int iters, int N) { \
|
||||
StopBenchmarkTiming(); \
|
||||
Eigen::GpuStreamDevice stream; \
|
||||
Eigen::GpuDevice device(&stream); \
|
||||
BenchmarkSuite<Eigen::GpuDevice, Eigen::half> suite(device, N); \
|
||||
cudaDeviceSynchronize(); \
|
||||
suite.FUNC(iters); \
|
||||
} \
|
||||
#define BM_FuncGPU(FUNC) \
|
||||
static void BM_##FUNC(int iters, int N) { \
|
||||
StopBenchmarkTiming(); \
|
||||
Eigen::GpuStreamDevice stream; \
|
||||
Eigen::GpuDevice device(&stream); \
|
||||
BenchmarkSuite<Eigen::GpuDevice, Eigen::half> suite(device, N); \
|
||||
cudaDeviceSynchronize(); \
|
||||
suite.FUNC(iters); \
|
||||
} \
|
||||
BENCHMARK_RANGE(BM_##FUNC, 10, 5000);
|
||||
|
||||
BM_FuncGPU(memcpy);
|
||||
BM_FuncGPU(typeCasting);
|
||||
//BM_FuncGPU(random);
|
||||
// BM_FuncGPU(random);
|
||||
BM_FuncGPU(slicing);
|
||||
BM_FuncGPU(rowChip);
|
||||
BM_FuncGPU(colChip);
|
||||
@@ -35,36 +35,33 @@ BM_FuncGPU(rowReduction);
|
||||
BM_FuncGPU(colReduction);
|
||||
BM_FuncGPU(fullReduction);
|
||||
|
||||
|
||||
// Contractions
|
||||
#define BM_FuncWithInputDimsGPU(FUNC, D1, D2, D3) \
|
||||
static void BM_##FUNC##_##D1##x##D2##x##D3(int iters, int N) { \
|
||||
StopBenchmarkTiming(); \
|
||||
Eigen::GpuStreamDevice stream; \
|
||||
Eigen::GpuDevice device(&stream); \
|
||||
BenchmarkSuite<Eigen::GpuDevice, Eigen::half> suite(device, D1, D2, D3); \
|
||||
cudaDeviceSynchronize(); \
|
||||
suite.FUNC(iters); \
|
||||
} \
|
||||
#define BM_FuncWithInputDimsGPU(FUNC, D1, D2, D3) \
|
||||
static void BM_##FUNC##_##D1##x##D2##x##D3(int iters, int N) { \
|
||||
StopBenchmarkTiming(); \
|
||||
Eigen::GpuStreamDevice stream; \
|
||||
Eigen::GpuDevice device(&stream); \
|
||||
BenchmarkSuite<Eigen::GpuDevice, Eigen::half> suite(device, D1, D2, D3); \
|
||||
cudaDeviceSynchronize(); \
|
||||
suite.FUNC(iters); \
|
||||
} \
|
||||
BENCHMARK_RANGE(BM_##FUNC##_##D1##x##D2##x##D3, 10, 5000);
|
||||
|
||||
|
||||
BM_FuncWithInputDimsGPU(contraction, N, N, N);
|
||||
BM_FuncWithInputDimsGPU(contraction, 64, N, N);
|
||||
BM_FuncWithInputDimsGPU(contraction, N, 64, N);
|
||||
BM_FuncWithInputDimsGPU(contraction, N, N, 64);
|
||||
|
||||
|
||||
// Convolutions
|
||||
#define BM_FuncWithKernelDimsGPU(FUNC, DIM1, DIM2) \
|
||||
static void BM_##FUNC##_##DIM1##x##DIM2(int iters, int N) { \
|
||||
StopBenchmarkTiming(); \
|
||||
Eigen::GpuStreamDevice stream; \
|
||||
Eigen::GpuDevice device(&stream); \
|
||||
BenchmarkSuite<Eigen::GpuDevice, Eigen::half> suite(device, N); \
|
||||
cudaDeviceSynchronize(); \
|
||||
suite.FUNC(iters, DIM1, DIM2); \
|
||||
} \
|
||||
#define BM_FuncWithKernelDimsGPU(FUNC, DIM1, DIM2) \
|
||||
static void BM_##FUNC##_##DIM1##x##DIM2(int iters, int N) { \
|
||||
StopBenchmarkTiming(); \
|
||||
Eigen::GpuStreamDevice stream; \
|
||||
Eigen::GpuDevice device(&stream); \
|
||||
BenchmarkSuite<Eigen::GpuDevice, Eigen::half> suite(device, N); \
|
||||
cudaDeviceSynchronize(); \
|
||||
suite.FUNC(iters, DIM1, DIM2); \
|
||||
} \
|
||||
BENCHMARK_RANGE(BM_##FUNC##_##DIM1##x##DIM2, 128, 5000);
|
||||
|
||||
/*
|
||||
|
||||
@@ -7,15 +7,15 @@
|
||||
#include "tensor_benchmarks.h"
|
||||
|
||||
// Simple functions
|
||||
#define BM_FuncGPU(FUNC) \
|
||||
static void BM_##FUNC(int iters, int N) { \
|
||||
StopBenchmarkTiming(); \
|
||||
Eigen::GpuStreamDevice stream; \
|
||||
Eigen::GpuDevice device(&stream); \
|
||||
BenchmarkSuite<Eigen::GpuDevice, float> suite(device, N); \
|
||||
cudaDeviceSynchronize(); \
|
||||
suite.FUNC(iters); \
|
||||
} \
|
||||
#define BM_FuncGPU(FUNC) \
|
||||
static void BM_##FUNC(int iters, int N) { \
|
||||
StopBenchmarkTiming(); \
|
||||
Eigen::GpuStreamDevice stream; \
|
||||
Eigen::GpuDevice device(&stream); \
|
||||
BenchmarkSuite<Eigen::GpuDevice, float> suite(device, N); \
|
||||
cudaDeviceSynchronize(); \
|
||||
suite.FUNC(iters); \
|
||||
} \
|
||||
BENCHMARK_RANGE(BM_##FUNC, 10, 5000);
|
||||
|
||||
BM_FuncGPU(memcpy);
|
||||
@@ -35,36 +35,33 @@ BM_FuncGPU(rowReduction);
|
||||
BM_FuncGPU(colReduction);
|
||||
BM_FuncGPU(fullReduction);
|
||||
|
||||
|
||||
// Contractions
|
||||
#define BM_FuncWithInputDimsGPU(FUNC, D1, D2, D3) \
|
||||
static void BM_##FUNC##_##D1##x##D2##x##D3(int iters, int N) { \
|
||||
StopBenchmarkTiming(); \
|
||||
Eigen::GpuStreamDevice stream; \
|
||||
Eigen::GpuDevice device(&stream); \
|
||||
BenchmarkSuite<Eigen::GpuDevice, float> suite(device, D1, D2, D3); \
|
||||
cudaDeviceSynchronize(); \
|
||||
suite.FUNC(iters); \
|
||||
} \
|
||||
#define BM_FuncWithInputDimsGPU(FUNC, D1, D2, D3) \
|
||||
static void BM_##FUNC##_##D1##x##D2##x##D3(int iters, int N) { \
|
||||
StopBenchmarkTiming(); \
|
||||
Eigen::GpuStreamDevice stream; \
|
||||
Eigen::GpuDevice device(&stream); \
|
||||
BenchmarkSuite<Eigen::GpuDevice, float> suite(device, D1, D2, D3); \
|
||||
cudaDeviceSynchronize(); \
|
||||
suite.FUNC(iters); \
|
||||
} \
|
||||
BENCHMARK_RANGE(BM_##FUNC##_##D1##x##D2##x##D3, 10, 5000);
|
||||
|
||||
|
||||
BM_FuncWithInputDimsGPU(contraction, N, N, N);
|
||||
BM_FuncWithInputDimsGPU(contraction, 64, N, N);
|
||||
BM_FuncWithInputDimsGPU(contraction, N, 64, N);
|
||||
BM_FuncWithInputDimsGPU(contraction, N, N, 64);
|
||||
|
||||
|
||||
// Convolutions
|
||||
#define BM_FuncWithKernelDimsGPU(FUNC, DIM1, DIM2) \
|
||||
static void BM_##FUNC##_##DIM1##x##DIM2(int iters, int N) { \
|
||||
StopBenchmarkTiming(); \
|
||||
Eigen::GpuStreamDevice stream; \
|
||||
Eigen::GpuDevice device(&stream); \
|
||||
BenchmarkSuite<Eigen::GpuDevice, float> suite(device, N); \
|
||||
cudaDeviceSynchronize(); \
|
||||
suite.FUNC(iters, DIM1, DIM2); \
|
||||
} \
|
||||
#define BM_FuncWithKernelDimsGPU(FUNC, DIM1, DIM2) \
|
||||
static void BM_##FUNC##_##DIM1##x##DIM2(int iters, int N) { \
|
||||
StopBenchmarkTiming(); \
|
||||
Eigen::GpuStreamDevice stream; \
|
||||
Eigen::GpuDevice device(&stream); \
|
||||
BenchmarkSuite<Eigen::GpuDevice, float> suite(device, N); \
|
||||
cudaDeviceSynchronize(); \
|
||||
suite.FUNC(iters, DIM1, DIM2); \
|
||||
} \
|
||||
BENCHMARK_RANGE(BM_##FUNC##_##DIM1##x##DIM2, 128, 5000);
|
||||
|
||||
BM_FuncWithKernelDimsGPU(convolution, 7, 1);
|
||||
|
||||
@@ -115,7 +115,6 @@ BM_FuncWithInputDimsGPU(contractionRowMajorBT, 64, N, N);
|
||||
BM_FuncWithInputDimsGPU(contractionRowMajorBT, N, 64, N);
|
||||
BM_FuncWithInputDimsGPU(contractionRowMajorBT, N, N, 64);
|
||||
|
||||
|
||||
BM_FuncWithInputDimsGPU(contractionRowMajorABT, N, N, N);
|
||||
BM_FuncWithInputDimsGPU(contractionRowMajorABT, 64, N, N);
|
||||
BM_FuncWithInputDimsGPU(contractionRowMajorABT, N, 64, N);
|
||||
|
||||
@@ -29,30 +29,32 @@ using Eigen::Tensor;
|
||||
using Eigen::TensorMap;
|
||||
std::ofstream out("Result.txt");
|
||||
|
||||
std::chrono::time_point<std::chrono::system_clock> get_time(){
|
||||
std::chrono::time_point<std::chrono::system_clock> get_time() {
|
||||
std::chrono::time_point<std::chrono::system_clock> start, end;
|
||||
return std::chrono::system_clock::now();
|
||||
}
|
||||
|
||||
template<typename Start, typename End, typename TensorIndex>
|
||||
void finalizeBenchmark(Start start, End end, TensorIndex m_, TensorIndex k_, TensorIndex n_ , TensorIndex num_iters, std::string name){
|
||||
|
||||
std::chrono::duration<double> elapsed_seconds = end-start;
|
||||
std::cout <<"Kernel Name : " << name << ", M : " << m_ << ", N : " << n_ << ", K : " << k_ << " GFLOP/s : " <<
|
||||
static_cast<float>((static_cast<int64_t>(2) * m_ * n_ * k_ * num_iters)/ elapsed_seconds.count()) * 1e-9 << "\n";
|
||||
out <<"Kernel Name : " << name << ", M : " << m_ << ", N : " << n_ << ", K : " << k_ << " GFLOP/s : " <<
|
||||
static_cast<float>((static_cast<int64_t>(2) * m_ * n_ * k_ * num_iters)/ elapsed_seconds.count()) * 1e-9 << "\n";
|
||||
template <typename Start, typename End, typename TensorIndex>
|
||||
void finalizeBenchmark(Start start, End end, TensorIndex m_, TensorIndex k_, TensorIndex n_, TensorIndex num_iters,
|
||||
std::string name) {
|
||||
std::chrono::duration<double> elapsed_seconds = end - start;
|
||||
std::cout << "Kernel Name : " << name << ", M : " << m_ << ", N : " << n_ << ", K : " << k_ << " GFLOP/s : "
|
||||
<< static_cast<float>((static_cast<int64_t>(2) * m_ * n_ * k_ * num_iters) / elapsed_seconds.count()) * 1e-9
|
||||
<< "\n";
|
||||
out << "Kernel Name : " << name << ", M : " << m_ << ", N : " << n_ << ", K : " << k_ << " GFLOP/s : "
|
||||
<< static_cast<float>((static_cast<int64_t>(2) * m_ * n_ * k_ * num_iters) / elapsed_seconds.count()) * 1e-9
|
||||
<< "\n";
|
||||
}
|
||||
|
||||
// do a contraction which is equivalent to a matrix multiplication
|
||||
template<typename T, typename Device, typename TensorIndex>
|
||||
template <typename T, typename Device, typename TensorIndex>
|
||||
void contraction(const Device& device_, TensorIndex num_iters, TensorIndex m_, TensorIndex k_, TensorIndex n_) {
|
||||
T* a_;
|
||||
T* b_;
|
||||
T* c_;
|
||||
a_ = (T *) device_.allocate(m_ * k_ * sizeof(T));
|
||||
b_ = (T *) device_.allocate(k_ * n_ * sizeof(T));
|
||||
c_ = (T *) device_.allocate(m_ * n_ * sizeof(T));
|
||||
a_ = (T*)device_.allocate(m_ * k_ * sizeof(T));
|
||||
b_ = (T*)device_.allocate(k_ * n_ * sizeof(T));
|
||||
c_ = (T*)device_.allocate(m_ * n_ * sizeof(T));
|
||||
|
||||
// Initialize the content of the memory pools to prevent asan from
|
||||
// complaining.
|
||||
@@ -77,16 +79,16 @@ void contraction(const Device& device_, TensorIndex num_iters, TensorIndex m_, T
|
||||
typedef typename Tensor<T, 2>::DimensionPair DimPair;
|
||||
Eigen::array<DimPair, 1> dims;
|
||||
dims[0] = DimPair(1, 0);
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
C.device(device_) = A.contract(B, dims);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
auto start = get_time();
|
||||
for (int iter = 0; iter < num_iters; ++iter) {
|
||||
C.device(device_) = A.contract(B, dims);
|
||||
}
|
||||
auto end = get_time();
|
||||
auto end = get_time();
|
||||
// Record the number of FLOPs executed per second (size_ multiplications and
|
||||
// additions for each value in the resulting tensor)
|
||||
finalizeBenchmark(start, end, m_, k_, n_, num_iters, "contraction");
|
||||
@@ -96,17 +98,15 @@ void contraction(const Device& device_, TensorIndex num_iters, TensorIndex m_, T
|
||||
device_.synchronize();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// do a contraction which is equivalent to a matrix multiplication
|
||||
template<typename T, typename Device, typename TensorIndex>
|
||||
template <typename T, typename Device, typename TensorIndex>
|
||||
void contractionRowMajor(const Device& device_, TensorIndex num_iters, TensorIndex m_, TensorIndex k_, TensorIndex n_) {
|
||||
T* a_;
|
||||
T* b_;
|
||||
T* c_;
|
||||
a_ = (T *) device_.allocate(m_ * k_ * sizeof(T));
|
||||
b_ = (T *) device_.allocate(k_ * n_ * sizeof(T));
|
||||
c_ = (T *) device_.allocate(m_ * n_ * sizeof(T));
|
||||
a_ = (T*)device_.allocate(m_ * k_ * sizeof(T));
|
||||
b_ = (T*)device_.allocate(k_ * n_ * sizeof(T));
|
||||
c_ = (T*)device_.allocate(m_ * n_ * sizeof(T));
|
||||
|
||||
// Initialize the content of the memory pools to prevent asan from
|
||||
// complaining.
|
||||
@@ -131,10 +131,10 @@ void contractionRowMajor(const Device& device_, TensorIndex num_iters, TensorInd
|
||||
typedef typename Tensor<T, 2>::DimensionPair DimPair;
|
||||
Eigen::array<DimPair, 1> dims;
|
||||
dims[0] = DimPair(1, 0);
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
C.device(device_) = A.contract(B, dims);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
auto start = get_time();
|
||||
for (int iter = 0; iter < num_iters; ++iter) {
|
||||
@@ -150,15 +150,14 @@ void contractionRowMajor(const Device& device_, TensorIndex num_iters, TensorInd
|
||||
device_.synchronize();
|
||||
}
|
||||
|
||||
|
||||
template<typename T, typename Device, typename TensorIndex>
|
||||
template <typename T, typename Device, typename TensorIndex>
|
||||
void contractionAT(const Device& device_, TensorIndex num_iters, TensorIndex m_, TensorIndex k_, TensorIndex n_) {
|
||||
T* a_;
|
||||
T* b_;
|
||||
T* c_;
|
||||
a_ = (T *) device_.allocate(m_ * k_ * sizeof(T));
|
||||
b_ = (T *) device_.allocate(k_ * n_ * sizeof(T));
|
||||
c_ = (T *) device_.allocate(m_ * n_ * sizeof(T));
|
||||
a_ = (T*)device_.allocate(m_ * k_ * sizeof(T));
|
||||
b_ = (T*)device_.allocate(k_ * n_ * sizeof(T));
|
||||
c_ = (T*)device_.allocate(m_ * n_ * sizeof(T));
|
||||
|
||||
// Initialize the content of the memory pools to prevent asan from
|
||||
// complaining.
|
||||
@@ -182,10 +181,10 @@ void contractionAT(const Device& device_, TensorIndex num_iters, TensorIndex m_,
|
||||
typedef typename Tensor<T, 2>::DimensionPair DimPair;
|
||||
Eigen::array<DimPair, 1> dims;
|
||||
dims[0] = DimPair(0, 0);
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
C.device(device_) = A.contract(B, dims);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
auto start = get_time();
|
||||
for (int iter = 0; iter < num_iters; ++iter) {
|
||||
@@ -199,17 +198,16 @@ void contractionAT(const Device& device_, TensorIndex num_iters, TensorIndex m_,
|
||||
device_.deallocate(b_);
|
||||
device_.deallocate(c_);
|
||||
device_.synchronize();
|
||||
|
||||
}
|
||||
|
||||
template<typename T, typename Device, typename TensorIndex>
|
||||
template <typename T, typename Device, typename TensorIndex>
|
||||
void contractionBT(const Device& device_, TensorIndex num_iters, TensorIndex m_, TensorIndex k_, TensorIndex n_) {
|
||||
T* a_;
|
||||
T* b_;
|
||||
T* c_;
|
||||
a_ = (T *) device_.allocate(m_ * k_ * sizeof(T));
|
||||
b_ = (T *) device_.allocate(k_ * n_ * sizeof(T));
|
||||
c_ = (T *) device_.allocate(m_ * n_ * sizeof(T));
|
||||
a_ = (T*)device_.allocate(m_ * k_ * sizeof(T));
|
||||
b_ = (T*)device_.allocate(k_ * n_ * sizeof(T));
|
||||
c_ = (T*)device_.allocate(m_ * n_ * sizeof(T));
|
||||
|
||||
// Initialize the content of the memory pools to prevent asan from
|
||||
// complaining.
|
||||
@@ -234,10 +232,10 @@ void contractionBT(const Device& device_, TensorIndex num_iters, TensorIndex m_,
|
||||
typedef typename Tensor<T, 2>::DimensionPair DimPair;
|
||||
Eigen::array<DimPair, 1> dims;
|
||||
dims[0] = DimPair(1, 1);
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
C.device(device_) = A.contract(B, dims);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
auto start = get_time();
|
||||
for (int iter = 0; iter < num_iters; ++iter) {
|
||||
@@ -251,17 +249,16 @@ void contractionBT(const Device& device_, TensorIndex num_iters, TensorIndex m_,
|
||||
device_.deallocate(b_);
|
||||
device_.deallocate(c_);
|
||||
device_.synchronize();
|
||||
|
||||
}
|
||||
|
||||
template<typename T, typename Device, typename TensorIndex>
|
||||
template <typename T, typename Device, typename TensorIndex>
|
||||
void contractionABT(const Device& device_, TensorIndex num_iters, TensorIndex m_, TensorIndex k_, TensorIndex n_) {
|
||||
T* a_;
|
||||
T* b_;
|
||||
T* c_;
|
||||
a_ = (T *) device_.allocate(m_ * k_ * sizeof(T));
|
||||
b_ = (T *) device_.allocate(k_ * n_ * sizeof(T));
|
||||
c_ = (T *) device_.allocate(m_ * n_ * sizeof(T));
|
||||
a_ = (T*)device_.allocate(m_ * k_ * sizeof(T));
|
||||
b_ = (T*)device_.allocate(k_ * n_ * sizeof(T));
|
||||
c_ = (T*)device_.allocate(m_ * n_ * sizeof(T));
|
||||
|
||||
// Initialize the content of the memory pools to prevent asan from
|
||||
// complaining.
|
||||
@@ -286,10 +283,10 @@ void contractionABT(const Device& device_, TensorIndex num_iters, TensorIndex m_
|
||||
typedef typename Tensor<T, 2>::DimensionPair DimPair;
|
||||
Eigen::array<DimPair, 1> dims;
|
||||
dims[0] = DimPair(0, 1);
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
#ifdef EIGEN_USE_SYCL // warmup for sycl
|
||||
for (int iter = 0; iter < 10; ++iter) {
|
||||
C.device(device_) = A.contract(B, dims);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
auto start = get_time();
|
||||
for (int iter = 0; iter < num_iters; ++iter) {
|
||||
@@ -309,10 +306,10 @@ int main() {
|
||||
cl::sycl::gpu_selector selector;
|
||||
Eigen::QueueInterface queue(selector);
|
||||
Eigen::SyclDevice device(&queue);
|
||||
int64_t num_iters =20;
|
||||
for(int64_t m = 32; m <= 4096; m *= 2)
|
||||
for(int64_t k = 32; k <= 4096; k *= 2)
|
||||
for(int64_t n = 32; n <= 4096; n*= 2){
|
||||
int64_t num_iters = 20;
|
||||
for (int64_t m = 32; m <= 4096; m *= 2)
|
||||
for (int64_t k = 32; k <= 4096; k *= 2)
|
||||
for (int64_t n = 32; n <= 4096; n *= 2) {
|
||||
(contraction<float>(device, num_iters, m, k, n));
|
||||
(contractionRowMajor<float>(device, num_iters, m, k, n));
|
||||
(contractionAT<float>(device, num_iters, m, k, n));
|
||||
@@ -320,6 +317,6 @@ int main() {
|
||||
(contractionABT<float>(device, num_iters, m, k, n));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
#endif // EIGEN_BENCH_CONTRACT_SYCL
|
||||
#endif // EIGEN_BENCH_CONTRACT_SYCL
|
||||
|
||||
Reference in New Issue
Block a user