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

Remove code duplication; reference C examples from cpp directory #14

Merged
merged 1 commit into from
Sep 27, 2024
Merged
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
124 changes: 1 addition & 123 deletions examples/cpp/benchmark_read.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,126 +2,4 @@
//
// SPDX-License-Identifier: BSD-3-Clause

#include <binsparse/binsparse.h>
#include <stdlib.h>
#include <time.h>

double gettime() {
struct timespec time;
clock_gettime(CLOCK_MONOTONIC, &time);
return ((double) time.tv_sec) + ((double) 1e-9) * time.tv_nsec;
}

int compar(const void* a, const void* b) {
double x = *((const double*) a);
double y = *((const double*) b);

double diff = x - y;

if (diff > 0) {
return 1;
} else if (diff < 0) {
return -1;
} else {
return 0;
}
}

double compute_variance(double* x, size_t n) {
double sum = 0;

for (size_t i = 0; i < n; i++) {
sum += x[i];
}

double mean = sum / n;

double sum_of_squares = 0;
for (size_t i = 0; i < n; i++) {
sum_of_squares += (x[i] - mean) * (x[i] - mean);
}

return sum_of_squares / (n - 1);
}

void flush_cache() {
#ifdef __APPLE__
system("bash -c \"sync && sudo purge\"");
#elif __linux__
system("bash -c \"sync\" && sudo echo 3 > /proc/sys/vm/drop_caches");
#else
static_assert(false);
#endif
}

int main(int argc, char** argv) {
if (argc < 2) {
fprintf(stderr, "usage: ./benchmark_read [file_name.h5]\n");
return 1;
}

char* file_name = argv[1];

printf("Opening %s\n", file_name);

const int num_trials = 1;

double durations[num_trials];

size_t nbytes = 0;

// To flush the filesystem cache before each trial, change to `true`.
bool cold_cache = false;

for (size_t i = 0; i < num_trials; i++) {
if (cold_cache) {
flush_cache();
}
double begin = gettime();
bsp_matrix_t mat = bsp_read_matrix(file_name, NULL);
double end = gettime();
durations[i] = end - begin;
nbytes = bsp_matrix_nbytes(mat);
bsp_destroy_matrix_t(mat);
}

printf("[");
for (size_t i = 0; i < num_trials; i++) {
printf("%lf", durations[i]);
if (i + 1 < num_trials) {
printf(", ");
}
}
printf("]\n");

qsort(durations, num_trials, sizeof(double), compar);

double variance = compute_variance(durations, num_trials);

double median_time = durations[num_trials / 2];

printf("Read file in %lf seconds\n", median_time);

if (num_trials > 1) {
printf("Variance is %lf seconds, standard devication is %lf seconds\n",
variance, sqrt(variance));
}

double gbytes = ((double) nbytes) / 1024 / 1024 / 1024;
double gbytes_s = gbytes / median_time;

printf("Achieved %lf GiB/s\n", gbytes_s);

printf("[");
for (size_t i = 0; i < num_trials; i++) {
printf("%lf", durations[i]);
if (i + 1 < num_trials) {
printf(", ");
}
}
printf("]\n");

printf("FORPARSER: %s,%lf,%lf\n", file_name, median_time, gbytes_s);

return 0;
}
#include "../benchmark_read.c"
171 changes: 1 addition & 170 deletions examples/cpp/benchmark_write.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,173 +2,4 @@
//
// SPDX-License-Identifier: BSD-3-Clause

#include <binsparse/binsparse.h>
#include <stdlib.h>
#include <time.h>

double gettime() {
struct timespec time;
clock_gettime(CLOCK_MONOTONIC, &time);
return ((double) time.tv_sec) + ((double) 1e-9) * time.tv_nsec;
}

int compar(const void* a, const void* b) {
double x = *((const double*) a);
double y = *((const double*) b);

double diff = x - y;

if (diff > 0) {
return 1;
} else if (diff < 0) {
return -1;
} else {
return 0;
}
}

double compute_variance(double* x, size_t n) {
double sum = 0;

for (size_t i = 0; i < n; i++) {
sum += x[i];
}

double mean = sum / n;

double sum_of_squares = 0;
for (size_t i = 0; i < n; i++) {
sum_of_squares += (x[i] - mean) * (x[i] - mean);
}

return sum_of_squares / (n - 1);
}

void flush_cache() {
#ifdef __APPLE__
system("bash -c \"sync && sudo purge\"");
#elif __linux__
system("bash -c \"sync\" && sudo echo 3 > /proc/sys/vm/drop_caches");
#else
static_assert(false);
#endif
}

void flush_writes() {
#ifdef __APPLE__
system("bash -c \"sync\"");
#elif __linux__
system("bash -c \"sync\"");
#else
static_assert(false);
#endif
}

void delete_file(const char* file_name) {
char command[2048];
snprintf(command, 2047, "rm %s", file_name);
system(command);
}

int main(int argc, char** argv) {
if (argc < 2) {
fprintf(stderr,
"usage: ./benchmark_read [file_name.h5] [scratch_space] [optional: "
"compression_level]\n");
return 1;
}

char* file_name = argv[1];
char* scratch_space = argv[2];

int compression_level = 0;

if (argc >= 4) {
compression_level = atoi(argv[3]);
}

printf("Opening %s\n", file_name);

const int num_trials = 1;

double durations[num_trials];

bsp_matrix_t mat = bsp_read_matrix(file_name, NULL);
size_t nbytes = bsp_matrix_nbytes(mat);

char output_filename[2048];
strncpy(output_filename, scratch_space, 2047);
strncpy(output_filename + strlen(scratch_space), "/benchmark_write_file_n.h5",
2047 - strlen(scratch_space));

// Current output name logic does not do much.
assert(num_trials <= 10);

// To flush the filesystem cache before each trial, change to `true`.
bool cold_cache = false;

// To flush each write to the filesystem and include this in the timing,
// change to `true`.
bool flush_each_write = true;

for (size_t i = 0; i < num_trials; i++) {
if (cold_cache) {
flush_cache();
}

output_filename[strlen(scratch_space) + 21] = '0' + i;
printf("Writing to file %s\n", output_filename);

double begin = gettime();
bsp_write_matrix(output_filename, mat, NULL, NULL, compression_level);

if (flush_each_write) {
flush_writes();
}

double end = gettime();
durations[i] = end - begin;

delete_file(output_filename);
}

printf("[");
for (size_t i = 0; i < num_trials; i++) {
printf("%lf", durations[i]);
if (i + 1 < num_trials) {
printf(", ");
}
}
printf("]\n");

qsort(durations, num_trials, sizeof(double), compar);

double variance = compute_variance(durations, num_trials);

double median_time = durations[num_trials / 2];

printf("Wrote file in %lf seconds\n", median_time);

if (num_trials > 1) {
printf("Variance is %lf seconds, standard devication is %lf seconds\n",
variance, sqrt(variance));
}

double gbytes = ((double) nbytes) / 1024 / 1024 / 1024;
double gbytes_s = gbytes / median_time;

printf("Achieved %lf GiB/s\n", gbytes_s);

printf("[");
for (size_t i = 0; i < num_trials; i++) {
printf("%lf", durations[i]);
if (i + 1 < num_trials) {
printf(", ");
}
}
printf("]\n");

printf("FORPARSER: %s,%lf,%lf\n", file_name, median_time, gbytes_s);

return 0;
}
#include "../benchmark_write.c"
Loading
Loading