Skip to content
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
8 changes: 8 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_C_FLAGS "-O3 -march=native")

option(ENABLE_SANITIZERS "Enable Clang sanitizers" OFF)

include(GNUInstallDirs)

add_library(binsparse STATIC)
Expand Down Expand Up @@ -84,6 +86,12 @@ install(FILES
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/binsparse)

if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
if (ENABLE_SANITIZERS)
set(SANITIZER_FLAGS "-fsanitize=address,undefined")
target_compile_options(binsparse INTERFACE ${SANITIZER_FLAGS} -g -O1 -fno-omit-frame-pointer)
target_link_options(binsparse INTERFACE ${SANITIZER_FLAGS})
endif()

add_subdirectory(examples)
add_subdirectory(test)
endif()
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ This library provides a C interface for reading and writing binsparse matrices.
#include <binsparse/binsparse.h>

int main(int argc, char** argv) {
bsp_matrix_t mat = bsp_read_matrix("chesapeake.bsp.hdf5");
bsp_matrix_t mat;
bsp_read_matrix(&mat, "chesapeake.bsp.hdf5", NULL);

if (mat.format == BSP_COO) {
float* values = mat.values.data;
Expand All @@ -33,6 +34,7 @@ int main(int argc, char** argv) {
bsp_get_matrix_format_string(mat.format));
}

bsp_destroy_matrix_t(&mat);
return 0;
}
```
Expand Down
11 changes: 7 additions & 4 deletions examples/benchmark_read.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <binsparse/binsparse.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

double gettime() {
struct timespec time;
Expand Down Expand Up @@ -79,20 +80,22 @@ int main(int argc, char** argv) {

// If running warm cache experiments, read once to warm cache.
if (!cold_cache) {
bsp_matrix_t mat = bsp_read_matrix(file_name, NULL);
bsp_destroy_matrix_t(mat);
bsp_matrix_t mat;
BSP_CHECK(bsp_read_matrix(&mat, file_name, NULL));
bsp_destroy_matrix_t(&mat);
}

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);
bsp_matrix_t mat;
BSP_CHECK(bsp_read_matrix(&mat, file_name, NULL));
double end = gettime();
durations[i] = end - begin;
nbytes = bsp_matrix_nbytes(mat);
bsp_destroy_matrix_t(mat);
bsp_destroy_matrix_t(&mat);

double gbytes = ((double) nbytes) / 1024 / 1024 / 1024;
double gbytes_s = gbytes / durations[i];
Expand Down
11 changes: 7 additions & 4 deletions examples/benchmark_read_parallel.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <binsparse/binsparse.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

double gettime() {
struct timespec time;
Expand Down Expand Up @@ -82,8 +83,9 @@ int main(int argc, char** argv) {

// If running warm cache experiments, read once to warm cache.
if (!cold_cache) {
bsp_matrix_t mat = bsp_read_matrix_parallel(file_name, NULL, num_threads);
bsp_destroy_matrix_t(mat);
bsp_matrix_t mat;
BSP_CHECK(bsp_read_matrix_parallel(&mat, file_name, NULL, num_threads));
bsp_destroy_matrix_t(&mat);
}

for (size_t i = 0; i < num_trials; i++) {
Expand All @@ -92,12 +94,13 @@ int main(int argc, char** argv) {
}
fflush(stdout);
double begin = gettime();
bsp_matrix_t mat = bsp_read_matrix_parallel(file_name, NULL, num_threads);
bsp_matrix_t mat;
BSP_CHECK(bsp_read_matrix_parallel(&mat, file_name, NULL, num_threads));
double end = gettime();
durations[i] = end - begin;
nbytes = bsp_matrix_nbytes(mat);

bsp_destroy_matrix_t(mat);
bsp_destroy_matrix_t(&mat);

double gbytes = ((double) nbytes) / 1024 / 1024 / 1024;
double gbytes_s = gbytes / durations[i];
Expand Down
7 changes: 5 additions & 2 deletions examples/benchmark_write.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <binsparse/binsparse.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

double gettime() {
struct timespec time;
Expand Down Expand Up @@ -97,7 +98,8 @@ int main(int argc, char** argv) {

double durations[num_trials];

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

char output_filename[2048];
Expand All @@ -124,7 +126,8 @@ int main(int argc, char** argv) {
printf("Writing to file %s\n", output_filename);

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

if (flush_each_write) {
flush_writes();
Expand Down
10 changes: 8 additions & 2 deletions examples/bsp-ls.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* SPDX-License-Identifier: BSD-3-Clause
*/

#include <binsparse/binsparse.h>
#include <binsparse/binsparse_all.h>

herr_t visit_group(hid_t loc_id, const char* name, const H5L_info_t* linfo,
void* opdata);
Expand All @@ -18,7 +18,13 @@ void print_group_info(hid_t g, const char* name) {
H5E_END_TRY;

if (bsp_json != H5I_INVALID_HID) {
char* json_string = bsp_read_attribute(g, "binsparse");
char* json_string;
bsp_error_t error = bsp_read_attribute(&json_string, g, "binsparse");
if (error != BSP_SUCCESS) {
printf("Error reading binsparse attribute: %s\n",
bsp_get_error_string(error));
return;
}

cJSON* j = cJSON_Parse(json_string);

Expand Down
7 changes: 4 additions & 3 deletions examples/bsp2mtx.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@ int main(int argc, char** argv) {
char* output_fname = argv[2];

printf(" === Reading file... ===\n");
bsp_matrix_t matrix = bsp_read_matrix(input_fname, NULL);
printf(" === Done writing. ===\n");
bsp_matrix_t matrix;
BSP_CHECK(bsp_read_matrix(&matrix, input_fname, NULL));
printf(" === Done reading. ===\n");
if (matrix.format != BSP_COO) {
matrix = bsp_convert_matrix(matrix, BSP_COO);
}
Expand All @@ -29,7 +30,7 @@ int main(int argc, char** argv) {
bsp_mmwrite(output_fname, matrix);
printf(" === Done writing. ===\n");

bsp_destroy_matrix_t(matrix);
bsp_destroy_matrix_t(&matrix);

return 0;
}
14 changes: 10 additions & 4 deletions examples/check_equivalence.c
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,9 @@ int main(int argc, char** argv) {
printf("Matrix 2: %s and %s\n", info2.fname,
(info2.dataset == NULL) ? "root" : info2.dataset);

bsp_matrix_t matrix1 = bsp_read_matrix(info1.fname, info1.dataset);
bsp_matrix_t matrix2 = bsp_read_matrix(info2.fname, info2.dataset);
bsp_matrix_t matrix1, matrix2;
BSP_CHECK(bsp_read_matrix(&matrix1, info1.fname, info1.dataset));
BSP_CHECK(bsp_read_matrix(&matrix2, info2.fname, info2.dataset));

bool perform_suitesparse_declamping = true;
if (perform_suitesparse_declamping &&
Expand All @@ -128,13 +129,13 @@ int main(int argc, char** argv) {
if (matrix1.format != matrix2.format) {
if (matrix1.format != BSP_COOR) {
bsp_matrix_t intermediate = bsp_convert_matrix(matrix1, BSP_COOR);
bsp_destroy_matrix_t(matrix1);
bsp_destroy_matrix_t(&matrix1);
matrix1 = intermediate;
}

if (matrix2.format != BSP_COOR) {
bsp_matrix_t intermediate = bsp_convert_matrix(matrix2, BSP_COOR);
bsp_destroy_matrix_t(matrix2);
bsp_destroy_matrix_t(&matrix2);
matrix2 = intermediate;
}
}
Expand Down Expand Up @@ -202,6 +203,11 @@ int main(int argc, char** argv) {
return 9;
}

bsp_destroy_matrix_t(&matrix1);
bsp_destroy_matrix_t(&matrix2);
bsp_destroy_fdataset_info_t(&info1);
bsp_destroy_fdataset_info_t(&info2);

printf("The files are equivalent.\n");
printf("OK!\n");

Expand Down
11 changes: 6 additions & 5 deletions examples/check_equivalence_parallel.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,10 @@ int main(int argc, char** argv) {

fflush(stdout);

bsp_matrix_t matrix1 = bsp_read_matrix(info1.fname, info1.dataset);
bsp_matrix_t matrix2 =
bsp_read_matrix_parallel(info2.fname, info2.dataset, num_threads);
bsp_matrix_t matrix1, matrix2;
BSP_CHECK(bsp_read_matrix(&matrix1, info1.fname, info1.dataset));
BSP_CHECK(bsp_read_matrix_parallel(&matrix2, info2.fname, info2.dataset,
num_threads));

bool perform_suitesparse_declamping = true;
if (perform_suitesparse_declamping &&
Expand All @@ -136,13 +137,13 @@ int main(int argc, char** argv) {
if (matrix1.format != matrix2.format) {
if (matrix1.format != BSP_COOR) {
bsp_matrix_t intermediate = bsp_convert_matrix(matrix1, BSP_COOR);
bsp_destroy_matrix_t(matrix1);
bsp_destroy_matrix_t(&matrix1);
matrix1 = intermediate;
}

if (matrix2.format != BSP_COOR) {
bsp_matrix_t intermediate = bsp_convert_matrix(matrix2, BSP_COOR);
bsp_destroy_matrix_t(matrix2);
bsp_destroy_matrix_t(&matrix2);
matrix2 = intermediate;
}
}
Expand Down
13 changes: 8 additions & 5 deletions examples/mtx2bsp.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* SPDX-License-Identifier: BSD-3-Clause
*/

#include <binsparse/binsparse.h>
#include <binsparse/binsparse_all.h>
#include <stdio.h>

#include <time.h>
Expand Down Expand Up @@ -151,7 +151,7 @@ int main(int argc, char** argv) {
if (format != BSP_COOR) {
begin = gettime();
bsp_matrix_t converted_matrix = bsp_convert_matrix(matrix, format);
bsp_destroy_matrix_t(matrix);
bsp_destroy_matrix_t(&matrix);
matrix = converted_matrix;
end = gettime();
duration = end - begin;
Expand All @@ -163,14 +163,17 @@ int main(int argc, char** argv) {

printf(" === Writing to %s... ===\n", output_fname);
begin = gettime();
bsp_write_matrix(output_fname, matrix, group_name, user_json,
compression_level);
BSP_CHECK(bsp_write_matrix_cjson(output_fname, matrix, group_name, user_json,
compression_level));
end = gettime();
duration = end - begin;
printf("%lf seconds writing Binsparse file...\n", duration);
printf(" === Done writing. ===\n");

bsp_destroy_matrix_t(matrix);
bsp_destroy_matrix_t(&matrix);
bsp_destroy_mm_metadata(&m);
bsp_destroy_fdataset_info_t(&info2);
cJSON_Delete(user_json);

return 0;
}
3 changes: 2 additions & 1 deletion examples/simple_matrix_read.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
int main(int argc, char** argv) {
const char* file_name = "test.hdf5";

bsp_matrix_t mat = bsp_read_matrix(file_name, NULL);
bsp_matrix_t mat;
BSP_CHECK(bsp_read_matrix(&mat, file_name, NULL));

if (mat.format == BSP_COO) {
float* values = (float*) mat.values.data;
Expand Down
2 changes: 1 addition & 1 deletion examples/simple_matrix_write.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ int main(int argc, char** argv) {
printf("%d, %d: %f\n", rowind[i], colind[i], values[i]);
}

bsp_write_matrix("test.hdf5", mat, NULL, NULL, 9);
BSP_CHECK(bsp_write_matrix("test.hdf5", mat, NULL, NULL, 9));

return 0;
}
7 changes: 4 additions & 3 deletions examples/simple_read.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,23 @@
* SPDX-License-Identifier: BSD-3-Clause
*/

#include <binsparse/binsparse.h>
#include <binsparse/binsparse_all.h>

int main(int argc, char** argv) {
char* file_name = (char*) "test.hdf5";

hid_t f = H5Fopen(file_name, H5F_ACC_RDWR, H5P_DEFAULT);

bsp_array_t array = bsp_read_array(f, "test");
bsp_array_t array;
BSP_CHECK(bsp_read_array(&array, f, "test"));

int* values = (int*) array.data;

for (size_t i = 0; i < array.size; i++) {
printf("%lu: %d\n", i, values[i]);
}

bsp_destroy_array_t(array);
bsp_destroy_array_t(&array);
H5Fclose(f);

return 0;
Expand Down
7 changes: 4 additions & 3 deletions examples/simple_write.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@
* SPDX-License-Identifier: BSD-3-Clause
*/

#include <binsparse/binsparse.h>
#include <binsparse/binsparse_all.h>

int main(int argc, char** argv) {
const char* file_name = "test.hdf5";

hid_t f = H5Fcreate(file_name, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

bsp_array_t array = bsp_construct_array_t(1000, BSP_INT32);
bsp_array_t array;
bsp_construct_array_t(&array, 1000, BSP_INT32);

int* values = (int*) array.data;

Expand All @@ -22,7 +23,7 @@ int main(int argc, char** argv) {
bsp_write_array(f, "test", array, 0);

H5Fclose(f);
bsp_destroy_array_t(array);
bsp_destroy_array_t(&array);

return 0;
}
Loading