From 4827dce5042252749cef78fbc74cd02a9c441deb Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 11 Nov 2025 14:24:15 -0600 Subject: [PATCH 1/6] set BLA_VENDOR to Generic if not set --- SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake b/SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake index b748ceb06..56d20ddb2 100644 --- a/SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake +++ b/SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake @@ -242,4 +242,7 @@ message ( STATUS "Looking for any 32-bit BLAS" ) set ( BLA_SIZEOF_INTEGER 4 ) find_package ( BLAS REQUIRED ) include ( SuiteSparseBLAS32 ) +if ( NOT DEFINED BLA_VENDOR ) + set ( BLA_VENDOR Generic ) +endif ( ) From c18bcf84765e13c5f952903ea6bd656cd7af47ae Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 12 Nov 2025 10:22:13 -0600 Subject: [PATCH 2/6] comments to SuiteSparseBLAS.cmake, and prioritize Intel MKL and OpenBLAS --- .../cmake_modules/SuiteSparseBLAS.cmake | 81 +++++++++++++------ 1 file changed, 56 insertions(+), 25 deletions(-) diff --git a/SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake b/SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake index 56d20ddb2..a07ad1e2b 100644 --- a/SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake +++ b/SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake @@ -11,11 +11,43 @@ # SuiteSparse interface to the Fortran BLAS library. # cmake 3.22 is required because BLA_SIZEOF_INTEGER is used. +cmake_minimum_required ( VERSION 3.22 ) + # The Intel MKL BLAS is highly recommended. It is free to download (but be # sure to check their license to make sure you accept it). See: -# https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl.htm - -cmake_minimum_required ( VERSION 3.22 ) +# https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl.htm . +# It includes an mkl_set_num_threads_local that ParU can use for best +# performance. + +# Otherwise, the OpenBLAS also gives excellent performance. The main downside +# of OpenBLAS is that its header (openblas_config.h) does not have an OpenBLAS +# version that can be used for conditional compilation. If OpenBLAS is used, +# v0.2.14 or later is required, and v0.3.27 or later is most desirable. +# OpenBLAS v0.3.27 and later includes openblas_set_num_threads_local. If this +# method is available, ParU uses it to obtain better performance, as compared +# to BLAS packages that do not have this option. + +# No other BLAS packages include a method to control the number of threads on a +# per-call basis to the BLAS. As a result, this script prioritizes Intel MKL +# and OpenBLAS over other BLAS libraries. + +# BLA_VENDOR may be set by the user before this script runs (see the comments +# below on how to look for a specific BLAS library); in this case, only that +# particular BLAS package is searched for, and if not found, it results in an +# error. + +# If BLA_VENDOR is not set by the user, then this scripts sets it to one value +# at a time, and searches for that particular BLAS library package. If not +# found, this script keeps looking, until it gives up looking for specific BLAS +# libraries and simply unsets BLA_VENDOR to find any BLAS library. + +# BLA_VENDOR is only any input parameter to find_package ( BLAS ), not +# an output. However, on output, this script sets BLA_VENDOR to the specific +# BLAS that was found, with one exception: if an unknown or generic BLAS +# library is found, then BLA_VENDOR is set to GENERIC. The BLA_VENDOR variable +# is then used by SuiteSparse__blas_threading.cmake, SuiteSparseBLAS32.cmake, +# SuiteSparseBLAS64.cmake, SuiteSparseLAPACK.cmake, to set other compile-time +# definitions based on this final value of BLA_VENDOR. # To select a specific BLAS: set to the BLA_VENDOR options from FindBLAS.cmake if ( DEFINED ENV{BLA_VENDOR} ) @@ -121,9 +153,9 @@ if ( SUITESPARSE_USE_64BIT_BLAS ) return ( ) endif ( ) - # Look for ARM BLAS with 64-bit integers - message ( STATUS "Looking for ARM 64-bit BLAS" ) - set ( BLA_VENDOR Arm_ilp64_mp ) + # Look for OpenBLAS with 64-bit integers + message ( STATUS "Looking for 64-bit OpenBLAS" ) + set ( BLA_VENDOR OpenBLAS ) set ( BLA_SIZEOF_INTEGER 8 ) find_package ( BLAS ) if ( BLAS_FOUND ) @@ -131,9 +163,9 @@ if ( SUITESPARSE_USE_64BIT_BLAS ) return ( ) endif ( ) - # Look for IBM BLAS with 64-bit integers - message ( STATUS "Looking for IBM ESSL 64-bit BLAS" ) - set ( BLA_VENDOR IBMESSL_SMP ) + # Look for ARM BLAS with 64-bit integers + message ( STATUS "Looking for ARM 64-bit BLAS" ) + set ( BLA_VENDOR Arm_ilp64_mp ) set ( BLA_SIZEOF_INTEGER 8 ) find_package ( BLAS ) if ( BLAS_FOUND ) @@ -141,9 +173,9 @@ if ( SUITESPARSE_USE_64BIT_BLAS ) return ( ) endif ( ) - # Look for OpenBLAS with 64-bit integers - message ( STATUS "Looking for 64-bit OpenBLAS" ) - set ( BLA_VENDOR OpenBLAS ) + # Look for IBM BLAS with 64-bit integers + message ( STATUS "Looking for IBM ESSL 64-bit BLAS" ) + set ( BLA_VENDOR IBMESSL_SMP ) set ( BLA_SIZEOF_INTEGER 8 ) find_package ( BLAS ) if ( BLAS_FOUND ) @@ -158,6 +190,7 @@ if ( SUITESPARSE_USE_64BIT_BLAS ) find_package ( BLAS ) if ( BLAS_FOUND ) include ( SuiteSparseBLAS64 ) + set ( BLA_VENDOR Generic ) return ( ) endif ( ) @@ -182,6 +215,16 @@ if ( BLAS_FOUND ) return ( ) endif ( ) +# Look for OpenBLAS with 32-bit integers +message ( STATUS "Looking for 32-bit OpenBLAS" ) +set ( BLA_VENDOR OpenBLAS ) +set ( BLA_SIZEOF_INTEGER 4 ) +find_package ( BLAS ) +if ( BLAS_FOUND ) + include ( SuiteSparseBLAS32 ) + return ( ) +endif ( ) + # Look for Apple Accelerate Framework (32-bit only) message ( STATUS "Looking for 32-bit Apple BLAS" ) set ( BLA_VENDOR Apple ) @@ -212,16 +255,6 @@ if ( BLAS_FOUND ) return ( ) endif ( ) -# Look for OpenBLAS with 32-bit integers -message ( STATUS "Looking for 32-bit OpenBLAS" ) -set ( BLA_VENDOR OpenBLAS ) -set ( BLA_SIZEOF_INTEGER 4 ) -find_package ( BLAS ) -if ( BLAS_FOUND ) - include ( SuiteSparseBLAS32 ) - return ( ) -endif ( ) - # Look for FLAME BLAS(32-bit only) message ( STATUS "Looking for 32-bit FLAME (BLIS) BLAS" ) set ( BLA_VENDOR FLAME ) @@ -242,7 +275,5 @@ message ( STATUS "Looking for any 32-bit BLAS" ) set ( BLA_SIZEOF_INTEGER 4 ) find_package ( BLAS REQUIRED ) include ( SuiteSparseBLAS32 ) -if ( NOT DEFINED BLA_VENDOR ) - set ( BLA_VENDOR Generic ) -endif ( ) +set ( BLA_VENDOR Generic ) From fafadbf78f160c072ee3a904ebe4573f279ac0c3 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 4 Feb 2026 14:14:32 -0600 Subject: [PATCH 3/6] draft GraphBLAS 10.3.1 --- GraphBLAS/CMakeLists.txt | 218 +++++++++--- GraphBLAS/CUDA/CMakeLists.txt | 158 --------- GraphBLAS/CUDA/Config/GraphBLAS_CUDA.pc.in | 17 - .../CUDA/Config/GraphBLAS_CUDAConfig.cmake.in | 139 -------- GraphBLAS/CUDA/{ => apply}/GB_cuda_apply.hpp | 0 .../{ => apply}/GB_cuda_apply_bind1st_jit.cpp | 2 +- .../{ => apply}/GB_cuda_apply_bind2nd_jit.cpp | 2 +- .../CUDA/{ => apply}/GB_cuda_apply_binop.cpp | 4 +- .../GB_cuda_apply_binop_branch.cpp | 0 .../CUDA/{ => apply}/GB_cuda_apply_unop.cpp | 4 +- .../{ => apply}/GB_cuda_apply_unop_branch.cpp | 0 .../{ => apply}/GB_cuda_apply_unop_jit.cpp | 2 +- .../GB_jit_kernel_cuda_apply_bind1st.cu | 0 .../GB_jit_kernel_cuda_apply_bind2nd.cu | 0 .../template/GB_jit_kernel_cuda_apply_unop.cu | 2 +- .../{ => cumsum}/template/GB_cuda_cumsum.cuh | 0 .../GB_cuda_threadblock_sum_uint64.cuh | 0 .../template/GB_cuda_tile_sum_uint64.cuh | 0 .../{ => device}/GB_cuda_get_device_count.cu | 0 .../GB_cuda_get_device_properties.cu | 1 + .../CUDA/{ => device}/GB_cuda_stream_pool.cu | 0 GraphBLAS/CUDA/include/GB_cuda_kernel.cuh | 7 +- GraphBLAS/CUDA/include/GraphBLAS_cuda.hpp | 3 + GraphBLAS/CUDA/{ => init}/GB_cuda_finalize.c | 0 GraphBLAS/CUDA/{ => init}/GB_cuda_init.c | 2 +- GraphBLAS/CUDA/{ => init}/GB_cuda_warmup.cu | 0 .../{ => matrix}/GB_cuda_matrix_prefetch.cpp | 1 + .../{ => monoid}/GB_cuda_upscale_identity.cpp | 0 GraphBLAS/CUDA/{ => mxm}/GB_cuda_AxB.hpp | 0 GraphBLAS/CUDA/{ => mxm}/GB_cuda_AxB_dot3.cpp | 2 +- .../{ => mxm}/GB_cuda_AxB_dot3_branch.cpp | 1 - .../CUDA/{ => mxm}/GB_cuda_AxB_dot3_jit.cpp | 2 +- GraphBLAS/CUDA/{ => mxm}/GB_cuda_colscale.cpp | 4 +- .../{ => mxm}/GB_cuda_colscale_branch.cpp | 0 .../CUDA/{ => mxm}/GB_cuda_colscale_jit.cpp | 2 +- GraphBLAS/CUDA/{ => mxm}/GB_cuda_ewise.hpp | 0 GraphBLAS/CUDA/{ => mxm}/GB_cuda_rowscale.cpp | 4 +- .../{ => mxm}/GB_cuda_rowscale_branch.cpp | 0 .../CUDA/{ => mxm}/GB_cuda_rowscale_jit.cpp | 2 +- .../GB_cuda_jit_AxB_dot3_dense_phase1.cuh | 0 .../template/GB_cuda_jit_AxB_dot3_phase1.cuh | 0 .../template/GB_cuda_jit_AxB_dot3_phase2.cuh | 0 .../GB_cuda_jit_AxB_dot3_phase2end.cuh | 0 .../GB_cuda_jit_AxB_dot3_phase3_dndn.cuh | 0 .../GB_cuda_jit_AxB_dot3_phase3_mp.cuh | 4 +- .../GB_cuda_jit_AxB_dot3_phase3_mp_guts.cuh | 0 .../GB_cuda_jit_AxB_dot3_phase3_spdn.cuh | 0 .../GB_cuda_jit_AxB_dot3_phase3_vsdn.cuh | 0 .../GB_cuda_jit_AxB_dot3_phase3_vssp.cuh | 0 .../GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh | 0 .../template/GB_jit_kernel_cuda_AxB_dot3.cu | 28 +- .../template/GB_jit_kernel_cuda_colscale.cu | 2 +- .../template/GB_jit_kernel_cuda_rowscale.cu | 0 .../CUDA/{ => reduce}/GB_cuda_reduce.hpp | 0 .../{ => reduce}/GB_cuda_reduce_to_scalar.cpp | 4 +- .../GB_cuda_reduce_to_scalar_branch.cpp | 2 +- .../GB_cuda_reduce_to_scalar_jit.cpp | 2 +- .../GB_cuda_threadblock_reduce_ztype.cuh | 0 .../template/GB_cuda_tile_reduce_ztype.cuh | 0 .../template/GB_jit_kernel_cuda_reduce.cu | 6 +- .../CUDA/{ => select}/GB_cuda_select.hpp | 0 .../{ => select}/GB_cuda_select_bitmap.cpp | 2 +- .../GB_cuda_select_bitmap_jit.cpp | 2 +- .../{ => select}/GB_cuda_select_branch.cpp | 0 .../{ => select}/GB_cuda_select_sparse.cpp | 2 +- .../GB_cuda_select_sparse_jit.cpp | 2 +- .../GB_jit_kernel_cuda_select_bitmap.cu | 5 +- .../GB_jit_kernel_cuda_select_sparse.cu | 4 +- .../GB_jit_kernel_cuda_select_sparse_OLD.cu | 4 +- .../{ => slice}/template/GB_cuda_ek_slice.cuh | 0 .../CUDA/{ => type}/GB_cuda_type_branch.cpp | 0 GraphBLAS/Config/GraphBLASConfig.cmake.in | 22 +- GraphBLAS/Doc/ChangeLog | 17 + GraphBLAS/Doc/GraphBLAS_UserGuide.pdf | Bin 1218374 -> 1220468 bytes GraphBLAS/Doc/GraphBLAS_version.tex | 4 +- .../Doc/UserGuide/GrB_objects_Matrix.tex | 6 + .../Doc/UserGuide/GrB_objects_Scalar.tex | 7 + .../Doc/UserGuide/GrB_objects_Vector.tex | 10 +- GraphBLAS/Doc/UserGuide/GrB_release.tex | 31 +- GraphBLAS/GraphBLAS/@GrB/GrB.m | 4 +- GraphBLAS/GraphBLAS/@GrB/compact.m | 26 +- .../@GrB/private/mexfunctions/gbselect.c | 1 + GraphBLAS/GraphBLAS/rename/GB_rename.h | 1 + GraphBLAS/GraphBLAS/test/gbtest54.m | 21 ++ GraphBLAS/Include/GraphBLAS.h | 8 +- GraphBLAS/JITpackage/CMakeLists.txt | 3 +- GraphBLAS/README.md | 2 +- GraphBLAS/Source/builder/GB_build.c | 4 +- GraphBLAS/Source/builder/GB_builder.c | 85 +++-- GraphBLAS/Source/builtin/include/GB_opaque.h | 259 ++++++-------- GraphBLAS/Source/dup/GB_dup.c | 19 +- GraphBLAS/Source/dup/GB_dup_worker.c | 71 +++- GraphBLAS/Source/extract/GB_I_inverse.c | 252 ++++++++----- GraphBLAS/Source/extract/GB_subref.c | 38 +- GraphBLAS/Source/extract/GB_subref.h | 24 +- GraphBLAS/Source/extract/GB_subref_phase0.c | 12 +- GraphBLAS/Source/extract/GB_subref_phase2.c | 41 ++- GraphBLAS/Source/extract/GB_subref_phase3.c | 44 ++- GraphBLAS/Source/extract/GB_subref_slice.c | 64 +--- .../Source/extract/include/GB_subref_method.h | 45 +-- .../extract/template/GB_subref_template.c | 108 +++--- GraphBLAS/Source/gateway/GB_cuda_gateway.h | 2 +- GraphBLAS/Source/global/GB_Global.c | 2 +- GraphBLAS/Source/init/GB_init.c | 8 +- GraphBLAS/Source/init/GrB_init.c | 2 +- .../jit_kernels/include/GB_jit_kernel_proto.h | 3 +- .../template/GB_jit_kernel_subref_sparse.c | 17 +- .../jit_wrappers/GB_masker_phase1_jit.c | 4 +- .../jit_wrappers/GB_masker_phase2_jit.c | 4 +- .../jit_wrappers/GB_subref_bitmap_jit.c | 2 +- .../jit_wrappers/GB_subref_sparse_jit.c | 11 +- .../Source/jitifyer/GB_encodify_masker.c | 11 +- .../Source/jitifyer/GB_encodify_subref.c | 6 +- GraphBLAS/Source/jitifyer/GB_enumify_masker.c | 11 +- GraphBLAS/Source/jitifyer/GB_enumify_subref.c | 27 +- GraphBLAS/Source/jitifyer/GB_jitifyer.c | 12 +- GraphBLAS/Source/jitifyer/GB_macrofy_subref.c | 24 +- GraphBLAS/Source/jitifyer/GB_stringify.h | 19 +- GraphBLAS/Source/mask/GB_mask.h | 3 +- GraphBLAS/Source/mask/GB_masker.c | 2 +- GraphBLAS/Source/mask/GB_masker_phase1.c | 4 +- GraphBLAS/Source/mask/GB_masker_phase2.c | 5 +- GraphBLAS/Source/memory/GB_calloc_memory.c | 1 + GraphBLAS/Source/memory/GB_memcpy.c | 2 +- GraphBLAS/Source/memory/GB_memset.c | 2 + GraphBLAS/Source/mxm/GB_AxB_dot.c | 2 +- .../Source/pack_unpack/GxB_pack_HyperHash.c | 2 +- GraphBLAS/Source/print/GB_matvec_check.c | 13 +- GraphBLAS/Source/select/GB_select_bitmap.c | 2 +- GraphBLAS/Source/select/GB_selector.c | 2 +- GraphBLAS/Source/sort/GB_bitonic.c | 80 +++++ GraphBLAS/Source/sort/GB_msort_1.c | 9 + GraphBLAS/Source/sort/GB_sort.h | 11 + GraphBLAS/Source/wait/GB_wait.c | 2 +- GraphBLAS/Tcov/log_Dec3.txt | 335 ++++++++++++++++++ GraphBLAS/Tcov/log_Nov5.txt | 332 +++++++++++++++++ GraphBLAS/Tcov/log_Oct31.txt | 332 ----------------- GraphBLAS/Test/GB_mex_edit.c | 18 +- GraphBLAS/Test/GB_mex_msort_1.c | 5 + GraphBLAS/Test/GB_mex_test2.c | 1 + GraphBLAS/Test/test303.m | 28 ++ GraphBLAS/Test/testall.m | 3 +- GraphBLAS/cmake_modules/GraphBLASReport.cmake | 9 + .../GraphBLAS_JIT_configure.cmake | 15 +- .../cmake_modules/GraphBLAS_JIT_paths.cmake | 5 - .../cmake_modules/GraphBLAS_version.cmake | 6 +- GraphBLAS/rmm_wrap/CMakeLists.txt | 9 +- GraphBLAS/rmm_wrap/rmm_wrap.cpp | 27 +- GraphBLAS/rmm_wrap/rmm_wrap.h | 14 +- GraphBLAS/rmm_wrap/rmm_wrap.hpp | 8 +- GraphBLAS/rmm_wrap/rmm_wrap_test.c | 4 +- 151 files changed, 1907 insertions(+), 1428 deletions(-) delete mode 100644 GraphBLAS/CUDA/CMakeLists.txt delete mode 100644 GraphBLAS/CUDA/Config/GraphBLAS_CUDA.pc.in delete mode 100644 GraphBLAS/CUDA/Config/GraphBLAS_CUDAConfig.cmake.in rename GraphBLAS/CUDA/{ => apply}/GB_cuda_apply.hpp (100%) rename GraphBLAS/CUDA/{ => apply}/GB_cuda_apply_bind1st_jit.cpp (98%) rename GraphBLAS/CUDA/{ => apply}/GB_cuda_apply_bind2nd_jit.cpp (98%) rename GraphBLAS/CUDA/{ => apply}/GB_cuda_apply_binop.cpp (95%) rename GraphBLAS/CUDA/{ => apply}/GB_cuda_apply_binop_branch.cpp (100%) rename GraphBLAS/CUDA/{ => apply}/GB_cuda_apply_unop.cpp (95%) rename GraphBLAS/CUDA/{ => apply}/GB_cuda_apply_unop_branch.cpp (100%) rename GraphBLAS/CUDA/{ => apply}/GB_cuda_apply_unop_jit.cpp (98%) rename GraphBLAS/CUDA/{ => apply}/template/GB_jit_kernel_cuda_apply_bind1st.cu (100%) rename GraphBLAS/CUDA/{ => apply}/template/GB_jit_kernel_cuda_apply_bind2nd.cu (100%) rename GraphBLAS/CUDA/{ => apply}/template/GB_jit_kernel_cuda_apply_unop.cu (98%) rename GraphBLAS/CUDA/{ => cumsum}/template/GB_cuda_cumsum.cuh (100%) rename GraphBLAS/CUDA/{ => cumsum}/template/GB_cuda_threadblock_sum_uint64.cuh (100%) rename GraphBLAS/CUDA/{ => cumsum}/template/GB_cuda_tile_sum_uint64.cuh (100%) rename GraphBLAS/CUDA/{ => device}/GB_cuda_get_device_count.cu (100%) rename GraphBLAS/CUDA/{ => device}/GB_cuda_get_device_properties.cu (99%) rename GraphBLAS/CUDA/{ => device}/GB_cuda_stream_pool.cu (100%) rename GraphBLAS/CUDA/{ => init}/GB_cuda_finalize.c (100%) rename GraphBLAS/CUDA/{ => init}/GB_cuda_init.c (97%) rename GraphBLAS/CUDA/{ => init}/GB_cuda_warmup.cu (100%) rename GraphBLAS/CUDA/{ => matrix}/GB_cuda_matrix_prefetch.cpp (99%) rename GraphBLAS/CUDA/{ => monoid}/GB_cuda_upscale_identity.cpp (100%) rename GraphBLAS/CUDA/{ => mxm}/GB_cuda_AxB.hpp (100%) rename GraphBLAS/CUDA/{ => mxm}/GB_cuda_AxB_dot3.cpp (99%) rename GraphBLAS/CUDA/{ => mxm}/GB_cuda_AxB_dot3_branch.cpp (98%) rename GraphBLAS/CUDA/{ => mxm}/GB_cuda_AxB_dot3_jit.cpp (98%) rename GraphBLAS/CUDA/{ => mxm}/GB_cuda_colscale.cpp (89%) rename GraphBLAS/CUDA/{ => mxm}/GB_cuda_colscale_branch.cpp (100%) rename GraphBLAS/CUDA/{ => mxm}/GB_cuda_colscale_jit.cpp (98%) rename GraphBLAS/CUDA/{ => mxm}/GB_cuda_ewise.hpp (100%) rename GraphBLAS/CUDA/{ => mxm}/GB_cuda_rowscale.cpp (89%) rename GraphBLAS/CUDA/{ => mxm}/GB_cuda_rowscale_branch.cpp (100%) rename GraphBLAS/CUDA/{ => mxm}/GB_cuda_rowscale_jit.cpp (98%) rename GraphBLAS/CUDA/{ => mxm}/template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh (100%) rename GraphBLAS/CUDA/{ => mxm}/template/GB_cuda_jit_AxB_dot3_phase1.cuh (100%) rename GraphBLAS/CUDA/{ => mxm}/template/GB_cuda_jit_AxB_dot3_phase2.cuh (100%) rename GraphBLAS/CUDA/{ => mxm}/template/GB_cuda_jit_AxB_dot3_phase2end.cuh (100%) rename GraphBLAS/CUDA/{ => mxm}/template/GB_cuda_jit_AxB_dot3_phase3_dndn.cuh (100%) rename GraphBLAS/CUDA/{ => mxm}/template/GB_cuda_jit_AxB_dot3_phase3_mp.cuh (98%) rename GraphBLAS/CUDA/{ => mxm}/template/GB_cuda_jit_AxB_dot3_phase3_mp_guts.cuh (100%) rename GraphBLAS/CUDA/{ => mxm}/template/GB_cuda_jit_AxB_dot3_phase3_spdn.cuh (100%) rename GraphBLAS/CUDA/{ => mxm}/template/GB_cuda_jit_AxB_dot3_phase3_vsdn.cuh (100%) rename GraphBLAS/CUDA/{ => mxm}/template/GB_cuda_jit_AxB_dot3_phase3_vssp.cuh (100%) rename GraphBLAS/CUDA/{ => mxm}/template/GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh (100%) rename GraphBLAS/CUDA/{ => mxm}/template/GB_jit_kernel_cuda_AxB_dot3.cu (97%) rename GraphBLAS/CUDA/{ => mxm}/template/GB_jit_kernel_cuda_colscale.cu (98%) rename GraphBLAS/CUDA/{ => mxm}/template/GB_jit_kernel_cuda_rowscale.cu (100%) rename GraphBLAS/CUDA/{ => reduce}/GB_cuda_reduce.hpp (100%) rename GraphBLAS/CUDA/{ => reduce}/GB_cuda_reduce_to_scalar.cpp (98%) rename GraphBLAS/CUDA/{ => reduce}/GB_cuda_reduce_to_scalar_branch.cpp (97%) rename GraphBLAS/CUDA/{ => reduce}/GB_cuda_reduce_to_scalar_jit.cpp (98%) rename GraphBLAS/CUDA/{ => reduce}/template/GB_cuda_threadblock_reduce_ztype.cuh (100%) rename GraphBLAS/CUDA/{ => reduce}/template/GB_cuda_tile_reduce_ztype.cuh (100%) rename GraphBLAS/CUDA/{ => reduce}/template/GB_jit_kernel_cuda_reduce.cu (97%) rename GraphBLAS/CUDA/{ => select}/GB_cuda_select.hpp (100%) rename GraphBLAS/CUDA/{ => select}/GB_cuda_select_bitmap.cpp (96%) rename GraphBLAS/CUDA/{ => select}/GB_cuda_select_bitmap_jit.cpp (97%) rename GraphBLAS/CUDA/{ => select}/GB_cuda_select_branch.cpp (100%) rename GraphBLAS/CUDA/{ => select}/GB_cuda_select_sparse.cpp (98%) rename GraphBLAS/CUDA/{ => select}/GB_cuda_select_sparse_jit.cpp (97%) rename GraphBLAS/CUDA/{ => select}/template/GB_jit_kernel_cuda_select_bitmap.cu (94%) rename GraphBLAS/CUDA/{ => select}/template/GB_jit_kernel_cuda_select_sparse.cu (99%) rename GraphBLAS/CUDA/{ => select}/template/GB_jit_kernel_cuda_select_sparse_OLD.cu (99%) rename GraphBLAS/CUDA/{ => slice}/template/GB_cuda_ek_slice.cuh (100%) rename GraphBLAS/CUDA/{ => type}/GB_cuda_type_branch.cpp (100%) create mode 100644 GraphBLAS/Source/sort/GB_bitonic.c create mode 100644 GraphBLAS/Tcov/log_Dec3.txt create mode 100644 GraphBLAS/Tcov/log_Nov5.txt delete mode 100644 GraphBLAS/Tcov/log_Oct31.txt create mode 100644 GraphBLAS/Test/test303.m diff --git a/GraphBLAS/CMakeLists.txt b/GraphBLAS/CMakeLists.txt index 33827180b..45131cc00 100644 --- a/GraphBLAS/CMakeLists.txt +++ b/GraphBLAS/CMakeLists.txt @@ -62,7 +62,8 @@ if ( SUITESPARSE_HAS_CUDA AND GRAPHBLAS_USE_CUDA ) # FOR NOW: do not compile FactoryKernels when developing the CUDA kernels set ( GRAPHBLAS_COMPACT ON ) message ( STATUS "GraphBLAS CUDA JIT: enabled") - enable_language ( CUDA ) + set ( CMAKE_CXX_STANDARD 17 ) + enable_language ( CXX CUDA ) set ( GRAPHBLAS_HAS_CUDA ON ) else ( ) message ( STATUS "GraphBLAS CUDA JIT: disabled") @@ -76,37 +77,84 @@ endif ( ) include ( GraphBLAS_JIT_paths ) +#------------------------------------------------------------------------------- +# CUDA +#------------------------------------------------------------------------------- + if ( GRAPHBLAS_HAS_CUDA ) - # with CUDA and RMM - add_subdirectory ( CUDA ) - set ( GB_CUDA GraphBLAS_CUDA ${CUDA_LIBRARIES} ) - set ( GB_RMM RMM_wrap ${CUDA_LIBRARIES} ) - add_subdirectory ( rmm_wrap ) - include_directories ( "rmm_wrap" ${CUDA_INCLUDE_DIRS} - "/usr/local/cuda/include/cub" ) - link_directories ( "CUDA" "${CUDA_LIBRARIES}" - "/usr/local/cuda/lib64/stubs" "rmm_wrap" "/usr/local/cuda/lib64" ) + + # with CUDA, and supporting libraries: Rapids Memory Manager (rmm), and spdlog + cmake_policy ( SET CMP0135 NEW ) # URL download timestamp policy + find_package ( CUDAToolkit REQUIRED ) + set ( CMAKE_CUDA_FLAGS "-cudart=static -lineinfo -Wno-deprecated-gpu-targets " ) + set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++17 -fPIC " ) + message ( STATUS "C++ flags for CUDA: ${CMAKE_CXX_FLAGS}" ) + message ( STATUS "CUDA include dirs: ${CUDA_INCLUDE_DIRS}" ) + message ( STATUS "CUDA libraries: ${CUDA_LIBRARIES}" ) + set ( GB_CUDA ${CUDA_LIBRARIES} ) + + include_directories ( "rmm_wrap" "CUDA/include" "CUDA" ${CUDA_INCLUDE_DIRS} ) + + set ( EXTERNAL_INCLUDES_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/external_includes ) + + if ( NOT EXISTS ${EXTERNAL_INCLUDES_DIRECTORY} ) + file ( MAKE_DIRECTORY ${EXTERNAL_INCLUDES_DIRECTORY} ) + endif ( ) + + if ( NOT EXISTS ${EXTERNAL_INCLUDES_DIRECTORY}/spdlog ) + message ( STATUS "cloning spdlog v1.10.0" ) + execute_process ( + COMMAND git clone "https://github.com/gabime/spdlog" --branch v1.10.0 --recursive spdlog + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/external_includes ) + endif ( ) + + if ( NOT EXISTS ${EXTERNAL_INCLUDES_DIRECTORY}/rmm ) + message ( STATUS "cloning rmm branch-21.10" ) + execute_process ( + COMMAND git clone "https://github.com/rapidsai/rmm" --branch branch-21.10 --recursive rmm +# COMMAND git clone "https://github.com/rapidsai/rmm" --branch branch-25.10 --recursive rmm + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/external_includes ) + endif() + + set ( RMM_WRAP_INCLUDES ${PROJECT_BINARY_DIR} + ${CMAKE_CURRENT_BINARY_DIR}/external_includes/spdlog/include +# for v21.10: + ${CMAKE_CURRENT_BINARY_DIR}/external_includes/rmm/include +# for v25.10: +# ${CMAKE_CURRENT_BINARY_DIR}/external_includes/rmm/cpp/include + ${CUDA_INCLUDE_DIRS} ) + else ( ) - # without CUDA and RMM - set ( CMAKE_RMM_FLAG " " ) + + # without CUDA set ( GB_CUDA ) - set ( GB_RMM ) + set ( RMM_WRAP_INCLUDES ) + endif ( ) #------------------------------------------------------------------------------- -# find OpenMP +# OpenMP #------------------------------------------------------------------------------- option ( GRAPHBLAS_USE_OPENMP "ON: Use OpenMP in GraphBLAS if available. OFF: Do not use OpenMP. (Default: SUITESPARSE_USE_OPENMP)" ${SUITESPARSE_USE_OPENMP} ) if ( GRAPHBLAS_USE_OPENMP ) if ( CMAKE_VERSION VERSION_LESS 3.24 ) - find_package ( OpenMP COMPONENTS C ) + if ( GRAPHBLAS_HAS_CUDA ) + find_package ( OpenMP COMPONENTS C CXX ) + else ( ) + find_package ( OpenMP COMPONENTS C ) + endif ( ) else ( ) - find_package ( OpenMP COMPONENTS C GLOBAL ) + if ( GRAPHBLAS_HAS_CUDA ) + find_package ( OpenMP COMPONENTS C CXX GLOBAL ) + else ( ) + find_package ( OpenMP COMPONENTS C GLOBAL ) + endif ( ) endif ( ) else ( ) # OpenMP has been disabled. set ( OpenMP_C_FOUND OFF ) + set ( OpenMP_CXX_FOUND OFF ) endif ( ) if ( GRAPHBLAS_USE_OPENMP AND OpenMP_C_FOUND ) @@ -122,7 +170,7 @@ if ( SUITESPARSE_USE_STRICT AND GRAPHBLAS_USE_OPENMP AND NOT GRAPHBLAS_HAS_OPENM endif ( ) #------------------------------------------------------------------------------- -# find cpu_features +# cpu_features #------------------------------------------------------------------------------- if ( NOT GBNCPUFEAT ) @@ -185,7 +233,7 @@ if ( DEFINED GBRVV ) endif ( ) #------------------------------------------------------------------------------- -# check compiler features +# check compiler support for the complex data types #------------------------------------------------------------------------------- include ( GraphBLAS_complex ) @@ -214,7 +262,6 @@ endif ( ) configure_file ( "Config/GraphBLAS.h.in" "${PROJECT_SOURCE_DIR}/Include/GraphBLAS.h" NEWLINE_STYLE LF ) - configure_file ( "Config/GraphBLAS_version.tex.in" "${PROJECT_SOURCE_DIR}/Doc/GraphBLAS_version.tex" NEWLINE_STYLE LF ) @@ -226,7 +273,7 @@ configure_file ( "Config/README.md.in" NEWLINE_STYLE LF ) #------------------------------------------------------------------------------- -# include directories for both graphblas and the demos +# include directories for both GraphBLAS and the demos #------------------------------------------------------------------------------- include_directories ( ${PROJECT_SOURCE_DIR} Source Include Config @@ -266,6 +313,20 @@ include_directories ( ${PROJECT_SOURCE_DIR} Source Include Config Source/type Source/wait Source/werk + # include all CUDA/* folders that have include/ or template/ subfolders: + CUDA + CUDA/apply + CUDA/cumsum + CUDA/device + CUDA/include + CUDA/init + CUDA/matrix + CUDA/monoid + CUDA/mxm + CUDA/reduce + CUDA/select + CUDA/slice + CUDA/type ) #------------------------------------------------------------------------------- @@ -275,10 +336,17 @@ include_directories ( ${PROJECT_SOURCE_DIR} Source Include Config include ( GraphBLAS_compiler_options ) #------------------------------------------------------------------------------- -# dynamic graphblas library properties +# GraphBLAS source code #------------------------------------------------------------------------------- -file ( GLOB GRAPHBLAS_SOURCES "PreJIT/*.c" "Config/*.c" "Source/*/*.c" ) +if ( GRAPHBLAS_HAS_CUDA ) + file ( GLOB GRAPHBLAS_SOURCES + "rmm_wrap/rmm_wrap.cpp" + "CUDA/*/*.cu" "CUDA/*/*.c" "CUDA/*/*.cpp" + "PreJIT/*.c" "Config/*.c" "Source/*/*.c" ) +else ( ) + file ( GLOB GRAPHBLAS_SOURCES "PreJIT/*.c" "Config/*.c" "Source/*/*.c" ) +endif ( ) if ( NOT GRAPHBLAS_COMPACT ) # compile the FactoryKernels @@ -286,6 +354,10 @@ if ( NOT GRAPHBLAS_COMPACT ) list ( APPEND GRAPHBLAS_SOURCES ${GRAPHBLAS_FACTORYKERNELS} ) endif ( ) +#------------------------------------------------------------------------------- +# GraphBLAS JITpackage +#------------------------------------------------------------------------------- + if ( GRAPHBLAS_USE_JIT ) # generate compressed JIT sources to create GB_JITpackage.c message ( STATUS "Creating the GraphBLAS/JITpackage:" ) @@ -303,7 +375,13 @@ else ( ) list ( PREPEND GRAPHBLAS_SOURCES "JITpackage/GB_JITpackage.c") endif ( ) +#------------------------------------------------------------------------------- +# dynamic GraphBLAS library properties +#------------------------------------------------------------------------------- + if ( BUILD_SHARED_LIBS ) + + # create the dynamic GraphBLAS library and set its properties add_library ( GraphBLAS SHARED ${GRAPHBLAS_SOURCES} ) set_target_properties ( GraphBLAS PROPERTIES @@ -315,6 +393,13 @@ if ( BUILD_SHARED_LIBS ) PUBLIC_HEADER "Include/GraphBLAS.h" WINDOWS_EXPORT_ALL_SYMBOLS ON ) + if ( GRAPHBLAS_HAS_CUDA ) + set_target_properties ( GraphBLAS PROPERTIES + CXX_STANDARD 17 + CXX_STANDARD_REQUIRED ON ) + set_target_properties ( GraphBLAS PROPERTIES CUDA_SEPARABLE_COMPILATION ON ) + endif ( ) + if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" ) set_target_properties ( GraphBLAS PROPERTIES EXPORT_NO_SYSTEM ON ) endif ( ) @@ -323,14 +408,15 @@ if ( BUILD_SHARED_LIBS ) INTERFACE $ $ ) - if ( SUITESPARSE_HAS_CUDA AND GRAPHBLAS_USE_CUDA ) - add_dependencies ( GraphBLAS GraphBLAS_CUDA ) - add_dependencies ( GraphBLAS RMM_wrap ) + if ( GRAPHBLAS_HAS_CUDA ) target_compile_definitions ( GraphBLAS PRIVATE "GRAPHBLAS_HAS_CUDA" ) + target_include_directories ( GraphBLAS PRIVATE "${RMM_WRAP_INCLUDES}" ) +# required for rmm 25.10: +# target_compile_definitions ( GraphBLAS PRIVATE "LIBCUDACXX_ENABLE_EXPERIMENTAL_MEMORY_RESOURCE" ) endif ( ) if ( WIN32 ) - # Compiling the graphblas dll on Windows: export the dll symbols + # Compiling the GraphBLAS dll on Windows: export the dll symbols target_compile_definitions ( GraphBLAS PRIVATE GB_DLL_EXPORT ) endif ( ) @@ -344,11 +430,12 @@ if ( BUILD_SHARED_LIBS ) endif ( ) #------------------------------------------------------------------------------- -# static graphblas library properties +# static GraphBLAS library properties #------------------------------------------------------------------------------- if ( BUILD_STATIC_LIBS ) + # create the static GraphBLAS library and set its properties add_library ( GraphBLAS_static STATIC ${GRAPHBLAS_SOURCES} ) set_target_properties ( GraphBLAS_static PROPERTIES @@ -357,6 +444,13 @@ if ( BUILD_STATIC_LIBS ) C_STANDARD_REQUIRED ON PUBLIC_HEADER "Include/GraphBLAS.h" ) + if ( GRAPHBLAS_HAS_CUDA ) + set_target_properties ( GraphBLAS_static PROPERTIES + CXX_STANDARD 17 + CXX_STANDARD_REQUIRED ON ) + set_target_properties ( GraphBLAS_static PROPERTIES CUDA_SEPARABLE_COMPILATION ON ) + endif ( ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( GraphBLAS_static PROPERTIES OUTPUT_NAME graphblas_static ) @@ -370,11 +464,11 @@ if ( BUILD_STATIC_LIBS ) INTERFACE $ $ ) - if ( SUITESPARSE_HAS_CUDA AND GRAPHBLAS_USE_CUDA ) - add_dependencies ( GraphBLAS_static GraphBLAS_CUDA ) - set ( GRAPHBLAS_STATIC_MODULES "${GRAPHBLAS_STATIC_MODULES} GraphBLAS_CUDA" ) - add_dependencies ( GraphBLAS_static RMM_wrap ) + if ( GRAPHBLAS_HAS_CUDA ) target_compile_definitions ( GraphBLAS_static PRIVATE "GRAPHBLAS_HAS_CUDA" ) +# required for rmm 25.10: +# target_compile_definitions ( GraphBLAS_static PRIVATE "LIBCUDACXX_ENABLE_EXPERIMENTAL_MEMORY_RESOURCE" ) + target_include_directories ( GraphBLAS_static PRIVATE "${RMM_WRAP_INCLUDES}" ) endif ( ) if ( WIN32 ) @@ -428,7 +522,7 @@ if ( NOT GBNCPUFEAT ) endif ( ) #------------------------------------------------------------------------------- -# select the math library (not required for Microsoft Visual Studio) +# determine which basic libraries are needed (m, dl, and atomic) #------------------------------------------------------------------------------- # libm: @@ -468,10 +562,9 @@ if ( LIBATOMIC_REQUIRED ) endif ( ) #------------------------------------------------------------------------------- -# add the OpenMP, IPP, CUDA, BLAS, etc libraries +# get the current library list, before linking with OpenMP, CUDA and rmm #------------------------------------------------------------------------------- -# get the current library list, before linking with OpenMP, CUDA and rmm if ( BUILD_SHARED_LIBS ) get_target_property ( GB_CMAKE_LIBRARIES GraphBLAS LINK_LIBRARIES ) else ( ) @@ -481,16 +574,26 @@ if ( NOT GB_CMAKE_LIBRARIES ) set ( GB_CMAKE_LIBRARIES "" ) endif ( ) +#------------------------------------------------------------------------------- +# add the OpenMP, IPP, CUDA, BLAS, etc libraries +#------------------------------------------------------------------------------- + if ( GRAPHBLAS_HAS_OPENMP ) message ( STATUS "CMAKE OpenMP libraries: ${OpenMP_C_LIBRARIES}" ) message ( STATUS "CMAKE OpenMP include: ${OpenMP_C_INCLUDE_DIRS}" ) list ( APPEND GB_CMAKE_LIBRARIES ${OpenMP_C_LIBRARIES} ) if ( BUILD_SHARED_LIBS ) target_link_libraries ( GraphBLAS PRIVATE OpenMP::OpenMP_C ) + if ( GRAPHBLAS_HAS_CUDA ) + target_link_libraries ( GraphBLAS PRIVATE OpenMP::OpenMP_CXX ) + endif ( ) endif ( ) if ( BUILD_STATIC_LIBS ) list ( APPEND GRAPHBLAS_STATIC_LIBS ${OpenMP_C_LIBRARIES} ) target_link_libraries ( GraphBLAS_static PRIVATE OpenMP::OpenMP_C ) + if ( GRAPHBLAS_HAS_CUDA ) + target_link_libraries ( GraphBLAS_static PRIVATE OpenMP::OpenMP_CXX ) + endif ( ) endif ( ) message ( STATUS "CMAKE OpenMP C flags: ${OpenMP_C_FLAGS}" ) set ( GB_OPENMP_C_FLAGS "${OpenMP_C_FLAGS}" ) @@ -517,12 +620,32 @@ else ( ) set ( GB_OPENMP_C_FLAGS "" ) endif ( ) -if ( SUITESPARSE_HAS_CUDA AND GRAPHBLAS_USE_CUDA ) +#------------------------------------------------------------------------------- +# link CUDA libraries +#------------------------------------------------------------------------------- + +if ( GRAPHBLAS_HAS_CUDA ) if ( BUILD_SHARED_LIBS ) - target_link_libraries ( GraphBLAS PRIVATE ${GB_CUDA} ${GB_RMM} ) + target_link_libraries ( GraphBLAS PRIVATE ${GB_CUDA} ) + target_link_libraries ( GraphBLAS PRIVATE CUDA::nvrtc CUDA::cudart_static CUDA::cuda_driver ) + if ( TARGET CUDA::nvToolsExt ) + target_link_libraries ( GraphBLAS PRIVATE CUDA::nvToolsExt ) + endif ( ) + if ( TARGET CUDA::nvtx3 ) + target_link_libraries ( GraphBLAS PRIVATE CUDA::nvtx3 ) + target_compile_definitions ( GraphBLAS PRIVATE GBNVTX ) + endif ( ) endif ( ) if ( BUILD_STATIC_LIBS ) - target_link_libraries ( GraphBLAS_static PUBLIC ${GB_CUDA} ${GB_RMM} ) + target_link_libraries ( GraphBLAS_static PUBLIC ${GB_CUDA} ) + target_link_libraries ( GraphBLAS_static PRIVATE CUDA::nvrtc CUDA::cudart_static CUDA::cuda_driver ) + if ( TARGET CUDA::nvToolsExt ) + target_link_libraries ( GraphBLAS_static PRIVATE CUDA::nvToolsExt ) + endif ( ) + if ( TARGET CUDA::nvtx3 ) + target_link_libraries ( GraphBLAS_static PRIVATE CUDA::nvtx3 ) + target_compile_definitions ( GraphBLAS_static PRIVATE GBNVTX ) + endif ( ) endif ( ) endif ( ) @@ -571,18 +694,23 @@ if ( SUITESPARSE_DEMOS ) target_link_libraries ( grow_demo PUBLIC GraphBLAS_static ) endif ( ) - target_link_libraries ( complex_demo PUBLIC ${GB_M} ${GB_CUDA} ${GB_RMM} ) - target_link_libraries ( simple_demo PUBLIC ${GB_M} ${GB_CUDA} ${GB_RMM} ) - target_link_libraries ( wildtype_demo PUBLIC ${GB_M} ${GB_CUDA} ${GB_RMM} ) - target_link_libraries ( wathen_demo PUBLIC ${GB_M} ${GB_CUDA} ${GB_RMM} ) - target_link_libraries ( context_demo PUBLIC ${GB_M} ${GB_CUDA} ${GB_RMM} ) - target_link_libraries ( gauss_demo PUBLIC ${GB_M} ${GB_CUDA} ${GB_RMM} ) - target_link_libraries ( grow_demo PUBLIC ${GB_M} ${GB_CUDA} ${GB_RMM} ) + target_link_libraries ( complex_demo PUBLIC ${GB_M} ${GB_CUDA} ) + target_link_libraries ( simple_demo PUBLIC ${GB_M} ${GB_CUDA} ) + target_link_libraries ( wildtype_demo PUBLIC ${GB_M} ${GB_CUDA} ) + target_link_libraries ( wathen_demo PUBLIC ${GB_M} ${GB_CUDA} ) + target_link_libraries ( context_demo PUBLIC ${GB_M} ${GB_CUDA} ) + target_link_libraries ( gauss_demo PUBLIC ${GB_M} ${GB_CUDA} ) + target_link_libraries ( grow_demo PUBLIC ${GB_M} ${GB_CUDA} ) if ( GRAPHBLAS_HAS_OPENMP ) target_link_libraries ( wathen_demo PUBLIC OpenMP::OpenMP_C ) target_link_libraries ( context_demo PUBLIC OpenMP::OpenMP_C ) target_link_libraries ( grow_demo PUBLIC OpenMP::OpenMP_C ) + if ( GRAPHBLAS_HAS_CUDA ) + target_link_libraries ( wathen_demo PUBLIC OpenMP::OpenMP_CXX ) + target_link_libraries ( context_demo PUBLIC OpenMP::OpenMP_CXX ) + target_link_libraries ( grow_demo PUBLIC OpenMP::OpenMP_CXX ) + endif ( ) endif ( ) else ( ) @@ -722,7 +850,7 @@ if ( NOT MSVC ) endif ( ) #------------------------------------------------------------------------------- -# configure the JITs +# configure the JIT #------------------------------------------------------------------------------- include ( GraphBLAS_JIT_configure ) diff --git a/GraphBLAS/CUDA/CMakeLists.txt b/GraphBLAS/CUDA/CMakeLists.txt deleted file mode 100644 index 6fd80479e..000000000 --- a/GraphBLAS/CUDA/CMakeLists.txt +++ /dev/null @@ -1,158 +0,0 @@ -#------------------------------------------------------------------------------- -# GraphBLAS/CUDA/CMakeLists.txt: cmake script for GraphBLAS/CUDA -#------------------------------------------------------------------------------- - -# SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2025, All Rights Reserved. - -# Some files in this folder are (c) NVIDIA or (c) Google. Please refer -# to their individual licenses (Apache, BSD, or others). -# SPDX-License-Identifier: Apache-2.0 - -#------------------------------------------------------------------------------- - -cmake_minimum_required ( VERSION 3.20 ) # GraphBLAS can be built stand-alone - -project ( GRAPHBLAS_CUDA - VERSION "${GraphBLAS_VERSION_MAJOR}.${GraphBLAS_VERSION_MINOR}.${GraphBLAS_VERSION_SUB}" - LANGUAGES CXX CUDA ) - -if ( CMAKE_VERSION VERSION_GREATER_EQUAL 3.24 ) - # requires cmake 3.24: - cmake_policy ( SET CMP0135 NEW ) # URL download timestamp policy -endif ( ) - -set ( CMAKE_CXX_STANDARD 17 ) - -set ( CMAKE_CUDA_FLAGS "-cudart=static -lineinfo " ) -set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++17 -fPIC " ) - -add_compile_definitions ( GBNCPUFEAT ) - -message ( STATUS "C++ flags for CUDA: ${CMAKE_CXX_FLAGS}" ) - -file ( GLOB GRAPHBLAS_CUDA_SOURCES "*.cu" "*.c" "*.cpp" ) - -add_library ( GraphBLAS_CUDA SHARED ${GRAPHBLAS_CUDA_SOURCES} ) - -set_target_properties ( GraphBLAS_CUDA PROPERTIES - VERSION ${GraphBLAS_VERSION_MAJOR}.${GraphBLAS_VERSION_MINOR}.${GraphBLAS_VERSION_SUB} - OUTPUT_NAME graphblascuda - SOVERSION ${GraphBLAS_VERSION_MAJOR} - C_STANDARD 11 - C_STANDARD_REQUIRED ON ) - -#------------------------------------------------------------------------------- -# GraphBLAS_CUDA properties -#------------------------------------------------------------------------------- - -target_include_directories ( GraphBLAS_CUDA PRIVATE - ${PROJECT_SOURCE_DIR} - ${PROJECT_SOURCE_DIR}/../ - include - ../Include - ../rmm_wrap - ../Source - ../Source/hyper - ../Source/builtin - ) - -set_target_properties ( GraphBLAS_CUDA PROPERTIES POSITION_INDEPENDENT_CODE ON ) -set_target_properties ( GraphBLAS_CUDA PROPERTIES CUDA_SEPARABLE_COMPILATION ON ) - -target_link_libraries ( GraphBLAS_CUDA PRIVATE CUDA::nvrtc CUDA::cudart_static CUDA::cuda_driver ) - -if ( TARGET CUDA::nvToolsExt ) - target_link_libraries ( GraphBLAS_CUDA PRIVATE CUDA::nvToolsExt ) -endif ( ) - -if ( TARGET CUDA::nvtx3 ) - target_link_libraries ( GraphBLAS_CUDA PRIVATE CUDA::nvtx3 ) - target_compile_definitions ( GraphBLAS_CUDA PRIVATE GBNVTX ) -endif ( ) - -target_compile_definitions ( GraphBLAS_CUDA PUBLIC "GRAPHBLAS_HAS_CUDA" ) - -if ( OpenMP_CXX_FOUND ) - target_include_directories ( GraphBLAS_CUDA PRIVATE OpenMP::OpenMP_CXX ) -endif ( ) - -target_include_directories ( GraphBLAS_CUDA - INTERFACE $ - $ ) - -#------------------------------------------------------------------------------- -# installation location -#------------------------------------------------------------------------------- - -include ( CMakePackageConfigHelpers ) - -install ( TARGETS GraphBLAS_CUDA - EXPORT GraphBLAS_CUDATargets - LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} - RUNTIME DESTINATION ${SUITESPARSE_BINDIR} - PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) - -# create (temporary) export target file during build -export ( EXPORT GraphBLAS_CUDATargets - NAMESPACE SuiteSparse:: - FILE ${CMAKE_CURRENT_BINARY_DIR}/GraphBLAS_CUDATargets.cmake ) - -# install export target and config for find_package -install ( EXPORT GraphBLAS_CUDATargets - NAMESPACE SuiteSparse:: - DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/GraphBLAS ) - -configure_package_config_file ( - Config/GraphBLAS_CUDAConfig.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/GraphBLAS_CUDAConfig.cmake - INSTALL_DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/GraphBLAS ) - -write_basic_package_version_file ( - ${CMAKE_CURRENT_BINARY_DIR}/GraphBLAS_CUDAConfigVersion.cmake - COMPATIBILITY SameMajorVersion ) - -install ( FILES - ${CMAKE_CURRENT_BINARY_DIR}/GraphBLAS_CUDAConfig.cmake - ${CMAKE_CURRENT_BINARY_DIR}/GraphBLAS_CUDAConfigVersion.cmake - DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/GraphBLAS ) - -#------------------------------------------------------------------------------- -# create pkg-config file -#------------------------------------------------------------------------------- - -if ( NOT MSVC ) - set ( prefix "${CMAKE_INSTALL_PREFIX}" ) - set ( exec_prefix "\${prefix}" ) - cmake_path ( IS_ABSOLUTE SUITESPARSE_LIBDIR SUITESPARSE_LIBDIR_IS_ABSOLUTE ) - if (SUITESPARSE_LIBDIR_IS_ABSOLUTE) - set ( libdir "${SUITESPARSE_LIBDIR}") - else ( ) - set ( libdir "\${exec_prefix}/${SUITESPARSE_LIBDIR}") - endif ( ) - cmake_path ( IS_ABSOLUTE SUITESPARSE_INCLUDEDIR SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE ) - if (SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE) - set ( includedir "${SUITESPARSE_INCLUDEDIR}") - else ( ) - set ( includedir "\${prefix}/${SUITESPARSE_INCLUDEDIR}") - endif ( ) - configure_file ( - Config/GraphBLAS_CUDA.pc.in - GraphBLAS_CUDA.pc - @ONLY - NEWLINE_STYLE LF ) - install ( FILES - ${CMAKE_CURRENT_BINARY_DIR}/GraphBLAS_CUDA.pc - DESTINATION ${SUITESPARSE_PKGFILEDIR}/pkgconfig ) -endif ( ) - -#------------------------------------------------------------------------------- -# report -#------------------------------------------------------------------------------- - -message ( STATUS "CMAKE_CUDA_COMPILER: ${CMAKE_CUDA_COMPILER} ") -message ( STATUS "CMAKE_CUDA_FLAGS: ${CMAKE_CUDA_FLAGS} ") -message ( STATUS "CMAKE_CUDA_FLAGS_RELEASE: ${CMAKE_CUDA_FLAGS_RELEASE} ") -message ( STATUS "CMAKE_CUDA_FLAGS_DEBUG: ${CMAKE_CUDA_FLAGS_DEBUG} ") - - diff --git a/GraphBLAS/CUDA/Config/GraphBLAS_CUDA.pc.in b/GraphBLAS/CUDA/Config/GraphBLAS_CUDA.pc.in deleted file mode 100644 index a04257bf9..000000000 --- a/GraphBLAS/CUDA/Config/GraphBLAS_CUDA.pc.in +++ /dev/null @@ -1,17 +0,0 @@ -# GraphBLAS_CUDA, Copyright (c) 2017-2025, FIXME -# All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -# FIXME: Which flags do we need to statically link CUDA? - -Name: GraphBLAS_CUDA -URL: https://github.com/DrTimothyAldenDavis/SuiteSparse -Description: CUDA support library for GraphBLAS in SuiteSparse -Version: @GraphBLAS_VERSION_MAJOR@.@GraphBLAS_VERSION_MINOR@.@GraphBLAS_VERSION_SUB@ -Libs: -L${libdir} -lgraphblascuda@CMAKE_RELEASE_POSTFIX@ -Cflags: -I${includedir} -DGRAPHBLAS_HAS_CUDA diff --git a/GraphBLAS/CUDA/Config/GraphBLAS_CUDAConfig.cmake.in b/GraphBLAS/CUDA/Config/GraphBLAS_CUDAConfig.cmake.in deleted file mode 100644 index b5249120c..000000000 --- a/GraphBLAS/CUDA/Config/GraphBLAS_CUDAConfig.cmake.in +++ /dev/null @@ -1,139 +0,0 @@ -#------------------------------------------------------------------------------- -# SuiteSparse/GraphBLAS/cmake_modules/GraphBLASConfig.cmake -#------------------------------------------------------------------------------- - -# The following copyright and license applies to just this file only, not to -# the library itself: -# GraphBLASConfig.cmake, Copyright (c) 2023-2025, FIXME -# SPDX-License-Identifier: BSD-3-clause - -#------------------------------------------------------------------------------- - -# Finds the GraphBLAS_CUDA include file and compiled library. -# The following targets are defined: -# SuiteSparse::GRAPHBLAS_CUDA - for the shared library (if available) -# SuiteSparse::GRAPHBLAS_CUDA_static - for the static library (if available) - -# For backward compatibility the following variables are set: - -# GRAPHBLAS_CUDA_INCLUDE_DIR - where to find GraphBLAS.h, etc. -# GRAPHBLAS_CUDA_LIBRARY - dynamic GraphBLAS library -# GRAPHBLAS_CUDA_STATIC - static GraphBLAS library -# GRAPHBLAS_CUDA_LIBRARIES - libraries when using GraphBLAS -# GRAPHBLAS_CUDA_FOUND - true if GraphBLAS found - -# Set ``CMAKE_MODULE_PATH`` to the parent folder where this module file is -# installed. - -#------------------------------------------------------------------------------- - -@PACKAGE_INIT@ - -set ( GRAPHBLAS_CUDA_DATE "@GraphBLAS_DATE@" ) -set ( GRAPHBLAS_CUDA_VERSION_MAJOR @GraphBLAS_VERSION_MAJOR@ ) -set ( GRAPHBLAS_CUDA_VERSION_MINOR @GraphBLAS_VERSION_MINOR@ ) -set ( GRAPHBLAS_CUDA_VERSION_PATCH @GraphBLAS_VERSION_SUB@ ) -set ( GRAPHBLAS_CUDA_VERSION "@GraphBLAS_VERSION_MAJOR@.@GraphBLAS_VERSION_MINOR@.@GraphBLAS_VERSION_SUB@" ) - -# Check for dependent targets -include ( CMakeFindDependencyMacro ) -set ( _dependencies_found ON ) - -# Look for NVIDIA CUDA toolkit -if ( NOT CUDAToolkit_FOUND ) - find_dependency ( CUDAToolkit @CUDAToolkit_VERSION_MAJOR@ ) - if ( NOT CUDAToolkit_FOUND ) - set ( _dependencies_found OFF ) - endif ( ) -endif ( ) - -if ( NOT _dependencies_found ) - set ( GraphBLAS_CUDA_FOUND OFF ) - return ( ) -endif ( ) - -# Import target -include ( ${CMAKE_CURRENT_LIST_DIR}/GraphBLAS_CUDATargets.cmake ) - -# The following is only for backward compatibility with FindGraphBLAS_CUDA. - -set ( _target_shared SuiteSparse::GraphBLAS_CUDA ) -set ( _target_static SuiteSparse::GraphBLAS_CUDA_static ) -set ( _var_prefix "GRAPHBLAS_CUDA" ) - -get_target_property ( ${_var_prefix}_INCLUDE_DIR ${_target_shared} INTERFACE_INCLUDE_DIRECTORIES ) -if ( ${_var_prefix}_INCLUDE_DIR ) - # First item in SuiteSparse targets contains the "main" header directory. - list ( GET ${_var_prefix}_INCLUDE_DIR 0 ${_var_prefix}_INCLUDE_DIR ) -endif ( ) -get_target_property ( ${_var_prefix}_LIBRARY ${_target_shared} IMPORTED_IMPLIB ) -if ( NOT ${_var_prefix}_LIBRARY ) - get_target_property ( _library_chk ${_target_shared} IMPORTED_LOCATION ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_LIBRARY ${_library_chk} ) - endif ( ) -endif ( ) -if ( TARGET ${_target_static} ) - get_target_property ( ${_var_prefix}_STATIC ${_target_static} IMPORTED_LOCATION ) -endif ( ) - -# Check for most common build types -set ( _config_types "Debug" "Release" "RelWithDebInfo" "MinSizeRel" "None" ) - -get_property ( _isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG ) -if ( _isMultiConfig ) - # For multi-configuration generators (e.g., Visual Studio), prefer those - # configurations. - list ( PREPEND _config_types ${CMAKE_CONFIGURATION_TYPES} ) -else ( ) - # For single-configuration generators, prefer the current configuration. - list ( PREPEND _config_types ${CMAKE_BUILD_TYPE} ) -endif ( ) - -list ( REMOVE_DUPLICATES _config_types ) - -foreach ( _config ${_config_types} ) - string ( TOUPPER ${_config} _uc_config ) - if ( NOT ${_var_prefix}_LIBRARY ) - get_target_property ( _library_chk ${_target_shared} - IMPORTED_IMPLIB_${_uc_config} ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_LIBRARY ${_library_chk} ) - endif ( ) - endif ( ) - if ( NOT ${_var_prefix}_LIBRARY ) - get_target_property ( _library_chk ${_target_shared} - IMPORTED_LOCATION_${_uc_config} ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_LIBRARY ${_library_chk} ) - endif ( ) - endif ( ) - if ( TARGET ${_target_static} AND NOT ${_var_prefix}_STATIC ) - get_target_property ( _library_chk ${_target_static} - IMPORTED_LOCATION_${_uc_config} ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_STATIC ${_library_chk} ) - endif ( ) - endif ( ) -endforeach ( ) - -set ( GRAPHBLAS_CUDA_LIBRARIES ${GRAPHBLAS_CUDA_LIBRARY} ) - -macro ( suitesparse_check_exist _var _files ) - # ignore generator expressions - string ( GENEX_STRIP "${_files}" _files2 ) - - foreach ( _file ${_files2} ) - if ( NOT EXISTS "${_file}" ) - message ( FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist!" ) - endif ( ) - endforeach () -endmacro ( ) - -suitesparse_check_exist ( GRAPHBLAS_CUDA_INCLUDE_DIR ${GRAPHBLAS_CUDA_INCLUDE_DIR} ) -suitesparse_check_exist ( GRAPHBLAS_CUDA_LIBRARY ${GRAPHBLAS_CUDA_LIBRARY} ) - -message ( STATUS "GraphBLAS_CUDA version: ${GRAPHBLAS_CUDA_VERSION}" ) -message ( STATUS "GraphBLAS_CUDA include: ${GRAPHBLAS_CUDA_INCLUDE_DIR}" ) -message ( STATUS "GraphBLAS_CUDA library: ${GRAPHBLAS_CUDA_LIBRARY}" ) -message ( STATUS "GraphBLAS_CUDA static: ${GRAPHBLAS_CUDA_STATIC}" ) diff --git a/GraphBLAS/CUDA/GB_cuda_apply.hpp b/GraphBLAS/CUDA/apply/GB_cuda_apply.hpp similarity index 100% rename from GraphBLAS/CUDA/GB_cuda_apply.hpp rename to GraphBLAS/CUDA/apply/GB_cuda_apply.hpp diff --git a/GraphBLAS/CUDA/GB_cuda_apply_bind1st_jit.cpp b/GraphBLAS/CUDA/apply/GB_cuda_apply_bind1st_jit.cpp similarity index 98% rename from GraphBLAS/CUDA/GB_cuda_apply_bind1st_jit.cpp rename to GraphBLAS/CUDA/apply/GB_cuda_apply_bind1st_jit.cpp index ba3a03da2..9427bbc8b 100644 --- a/GraphBLAS/CUDA/GB_cuda_apply_bind1st_jit.cpp +++ b/GraphBLAS/CUDA/apply/GB_cuda_apply_bind1st_jit.cpp @@ -1,4 +1,4 @@ -#include "GB_cuda_apply.hpp" +#include "apply/GB_cuda_apply.hpp" extern "C" { diff --git a/GraphBLAS/CUDA/GB_cuda_apply_bind2nd_jit.cpp b/GraphBLAS/CUDA/apply/GB_cuda_apply_bind2nd_jit.cpp similarity index 98% rename from GraphBLAS/CUDA/GB_cuda_apply_bind2nd_jit.cpp rename to GraphBLAS/CUDA/apply/GB_cuda_apply_bind2nd_jit.cpp index d96b4772a..4d8d648dc 100644 --- a/GraphBLAS/CUDA/GB_cuda_apply_bind2nd_jit.cpp +++ b/GraphBLAS/CUDA/apply/GB_cuda_apply_bind2nd_jit.cpp @@ -1,4 +1,4 @@ -#include "GB_cuda_apply.hpp" +#include "apply/GB_cuda_apply.hpp" extern "C" { diff --git a/GraphBLAS/CUDA/GB_cuda_apply_binop.cpp b/GraphBLAS/CUDA/apply/GB_cuda_apply_binop.cpp similarity index 95% rename from GraphBLAS/CUDA/GB_cuda_apply_binop.cpp rename to GraphBLAS/CUDA/apply/GB_cuda_apply_binop.cpp index 8c31a0367..fde888616 100644 --- a/GraphBLAS/CUDA/GB_cuda_apply_binop.cpp +++ b/GraphBLAS/CUDA/apply/GB_cuda_apply_binop.cpp @@ -1,4 +1,4 @@ -#include "GB_cuda_apply.hpp" +#include "apply/GB_cuda_apply.hpp" #undef GB_FREE_WORKSPACE #define GB_FREE_WORKSPACE \ @@ -10,7 +10,7 @@ #define GB_FREE_ALL \ { \ GB_FREE_WORKSPACE ; \ - GB_cuda_stream_pool_release (&stream) ; \ + GB_cuda_stream_pool_release (&stream) ; \ } #define BLOCK_SIZE 512 diff --git a/GraphBLAS/CUDA/GB_cuda_apply_binop_branch.cpp b/GraphBLAS/CUDA/apply/GB_cuda_apply_binop_branch.cpp similarity index 100% rename from GraphBLAS/CUDA/GB_cuda_apply_binop_branch.cpp rename to GraphBLAS/CUDA/apply/GB_cuda_apply_binop_branch.cpp diff --git a/GraphBLAS/CUDA/GB_cuda_apply_unop.cpp b/GraphBLAS/CUDA/apply/GB_cuda_apply_unop.cpp similarity index 95% rename from GraphBLAS/CUDA/GB_cuda_apply_unop.cpp rename to GraphBLAS/CUDA/apply/GB_cuda_apply_unop.cpp index cf0ef9309..34a48544a 100644 --- a/GraphBLAS/CUDA/GB_cuda_apply_unop.cpp +++ b/GraphBLAS/CUDA/apply/GB_cuda_apply_unop.cpp @@ -1,4 +1,4 @@ -#include "GB_cuda_apply.hpp" +#include "apply/GB_cuda_apply.hpp" #undef GB_FREE_WORKSPACE #define GB_FREE_WORKSPACE \ @@ -10,7 +10,7 @@ #define GB_FREE_ALL \ { \ GB_FREE_WORKSPACE \ - GB_cuda_stream_pool_release (&stream) ; \ + GB_cuda_stream_pool_release (&stream) ; \ } #define BLOCK_SIZE 512 diff --git a/GraphBLAS/CUDA/GB_cuda_apply_unop_branch.cpp b/GraphBLAS/CUDA/apply/GB_cuda_apply_unop_branch.cpp similarity index 100% rename from GraphBLAS/CUDA/GB_cuda_apply_unop_branch.cpp rename to GraphBLAS/CUDA/apply/GB_cuda_apply_unop_branch.cpp diff --git a/GraphBLAS/CUDA/GB_cuda_apply_unop_jit.cpp b/GraphBLAS/CUDA/apply/GB_cuda_apply_unop_jit.cpp similarity index 98% rename from GraphBLAS/CUDA/GB_cuda_apply_unop_jit.cpp rename to GraphBLAS/CUDA/apply/GB_cuda_apply_unop_jit.cpp index fccbf6746..554bdc5a1 100644 --- a/GraphBLAS/CUDA/GB_cuda_apply_unop_jit.cpp +++ b/GraphBLAS/CUDA/apply/GB_cuda_apply_unop_jit.cpp @@ -1,4 +1,4 @@ -#include "GB_cuda_apply.hpp" +#include "apply/GB_cuda_apply.hpp" extern "C" { diff --git a/GraphBLAS/CUDA/template/GB_jit_kernel_cuda_apply_bind1st.cu b/GraphBLAS/CUDA/apply/template/GB_jit_kernel_cuda_apply_bind1st.cu similarity index 100% rename from GraphBLAS/CUDA/template/GB_jit_kernel_cuda_apply_bind1st.cu rename to GraphBLAS/CUDA/apply/template/GB_jit_kernel_cuda_apply_bind1st.cu diff --git a/GraphBLAS/CUDA/template/GB_jit_kernel_cuda_apply_bind2nd.cu b/GraphBLAS/CUDA/apply/template/GB_jit_kernel_cuda_apply_bind2nd.cu similarity index 100% rename from GraphBLAS/CUDA/template/GB_jit_kernel_cuda_apply_bind2nd.cu rename to GraphBLAS/CUDA/apply/template/GB_jit_kernel_cuda_apply_bind2nd.cu diff --git a/GraphBLAS/CUDA/template/GB_jit_kernel_cuda_apply_unop.cu b/GraphBLAS/CUDA/apply/template/GB_jit_kernel_cuda_apply_unop.cu similarity index 98% rename from GraphBLAS/CUDA/template/GB_jit_kernel_cuda_apply_unop.cu rename to GraphBLAS/CUDA/apply/template/GB_jit_kernel_cuda_apply_unop.cu index cfc752c8b..9b9a2473b 100644 --- a/GraphBLAS/CUDA/template/GB_jit_kernel_cuda_apply_unop.cu +++ b/GraphBLAS/CUDA/apply/template/GB_jit_kernel_cuda_apply_unop.cu @@ -2,7 +2,7 @@ using namespace cooperative_groups ; -#include "GB_cuda_ek_slice.cuh" +#include "template/GB_cuda_ek_slice.cuh" #define log2_chunk_size 10 #define chunk_size 1024 diff --git a/GraphBLAS/CUDA/template/GB_cuda_cumsum.cuh b/GraphBLAS/CUDA/cumsum/template/GB_cuda_cumsum.cuh similarity index 100% rename from GraphBLAS/CUDA/template/GB_cuda_cumsum.cuh rename to GraphBLAS/CUDA/cumsum/template/GB_cuda_cumsum.cuh diff --git a/GraphBLAS/CUDA/template/GB_cuda_threadblock_sum_uint64.cuh b/GraphBLAS/CUDA/cumsum/template/GB_cuda_threadblock_sum_uint64.cuh similarity index 100% rename from GraphBLAS/CUDA/template/GB_cuda_threadblock_sum_uint64.cuh rename to GraphBLAS/CUDA/cumsum/template/GB_cuda_threadblock_sum_uint64.cuh diff --git a/GraphBLAS/CUDA/template/GB_cuda_tile_sum_uint64.cuh b/GraphBLAS/CUDA/cumsum/template/GB_cuda_tile_sum_uint64.cuh similarity index 100% rename from GraphBLAS/CUDA/template/GB_cuda_tile_sum_uint64.cuh rename to GraphBLAS/CUDA/cumsum/template/GB_cuda_tile_sum_uint64.cuh diff --git a/GraphBLAS/CUDA/GB_cuda_get_device_count.cu b/GraphBLAS/CUDA/device/GB_cuda_get_device_count.cu similarity index 100% rename from GraphBLAS/CUDA/GB_cuda_get_device_count.cu rename to GraphBLAS/CUDA/device/GB_cuda_get_device_count.cu diff --git a/GraphBLAS/CUDA/GB_cuda_get_device_properties.cu b/GraphBLAS/CUDA/device/GB_cuda_get_device_properties.cu similarity index 99% rename from GraphBLAS/CUDA/GB_cuda_get_device_properties.cu rename to GraphBLAS/CUDA/device/GB_cuda_get_device_properties.cu index b61ac7484..ce14674cf 100644 --- a/GraphBLAS/CUDA/GB_cuda_get_device_properties.cu +++ b/GraphBLAS/CUDA/device/GB_cuda_get_device_properties.cu @@ -12,6 +12,7 @@ // they are to be solely used by C functions in GraphBLAS/Source. #include "GB_cuda.hpp" + #define CU_OK(cudaMethod) \ { \ if ((cudaMethod) != cudaSuccess) \ diff --git a/GraphBLAS/CUDA/GB_cuda_stream_pool.cu b/GraphBLAS/CUDA/device/GB_cuda_stream_pool.cu similarity index 100% rename from GraphBLAS/CUDA/GB_cuda_stream_pool.cu rename to GraphBLAS/CUDA/device/GB_cuda_stream_pool.cu diff --git a/GraphBLAS/CUDA/include/GB_cuda_kernel.cuh b/GraphBLAS/CUDA/include/GB_cuda_kernel.cuh index 466ebc6ca..5813d0733 100644 --- a/GraphBLAS/CUDA/include/GB_cuda_kernel.cuh +++ b/GraphBLAS/CUDA/include/GB_cuda_kernel.cuh @@ -42,7 +42,7 @@ using namespace cooperative_groups ; // subset of GraphBLAS.h //------------------------------------------------------------------------------ -#include "GraphBLAS_cuda.hpp" +#include "include/GraphBLAS_cuda.hpp" //------------------------------------------------------------------------------ // internal #include files @@ -76,6 +76,7 @@ extern "C" #include "include/GB_omp_kernels.h" } -#include "GB_cuda_error.hpp" -#include "GB_cuda_atomics.cuh" +#include "include/GB_cuda_error.hpp" +#include "include/GB_cuda_atomics.cuh" +#include "include/GB_cuda_timer.hpp" diff --git a/GraphBLAS/CUDA/include/GraphBLAS_cuda.hpp b/GraphBLAS/CUDA/include/GraphBLAS_cuda.hpp index cea580f67..d2c4f8915 100644 --- a/GraphBLAS/CUDA/include/GraphBLAS_cuda.hpp +++ b/GraphBLAS/CUDA/include/GraphBLAS_cuda.hpp @@ -10,6 +10,9 @@ extern "C" { // definitions that modify GraphBLAS.h + #ifndef GBNCPUFEAT + #define GBNCPUFEAT + #endif #include "include/GB_dev.h" #include "include/GB_compiler.h" #include "include/GB_warnings.h" diff --git a/GraphBLAS/CUDA/GB_cuda_finalize.c b/GraphBLAS/CUDA/init/GB_cuda_finalize.c similarity index 100% rename from GraphBLAS/CUDA/GB_cuda_finalize.c rename to GraphBLAS/CUDA/init/GB_cuda_finalize.c diff --git a/GraphBLAS/CUDA/GB_cuda_init.c b/GraphBLAS/CUDA/init/GB_cuda_init.c similarity index 97% rename from GraphBLAS/CUDA/GB_cuda_init.c rename to GraphBLAS/CUDA/init/GB_cuda_init.c index ca475f00f..cd12573e5 100644 --- a/GraphBLAS/CUDA/GB_cuda_init.c +++ b/GraphBLAS/CUDA/init/GB_cuda_init.c @@ -49,7 +49,7 @@ GrB_Info GB_cuda_init (void) // of the work. Alternatively, move GB_cuda_init here (if so, // ensure that it doesn't depend on any other initializations // below). - 256 * 1000000L, 1024 * 100000000L, 1) ; // FIXME: ask the GPU(s) + 256 * 1000000L, 1024 * 100000000L /*, 1 */) ; // FIXME: ask the GPU(s) } // warm up the GPUs diff --git a/GraphBLAS/CUDA/GB_cuda_warmup.cu b/GraphBLAS/CUDA/init/GB_cuda_warmup.cu similarity index 100% rename from GraphBLAS/CUDA/GB_cuda_warmup.cu rename to GraphBLAS/CUDA/init/GB_cuda_warmup.cu diff --git a/GraphBLAS/CUDA/GB_cuda_matrix_prefetch.cpp b/GraphBLAS/CUDA/matrix/GB_cuda_matrix_prefetch.cpp similarity index 99% rename from GraphBLAS/CUDA/GB_cuda_matrix_prefetch.cpp rename to GraphBLAS/CUDA/matrix/GB_cuda_matrix_prefetch.cpp index 8fa6328ed..3924b16ab 100644 --- a/GraphBLAS/CUDA/GB_cuda_matrix_prefetch.cpp +++ b/GraphBLAS/CUDA/matrix/GB_cuda_matrix_prefetch.cpp @@ -9,6 +9,7 @@ //------------------------------------------------------------------------------ #include "GB_cuda.hpp" + #define GB_FREE_ALL ; GrB_Info GB_cuda_matrix_prefetch diff --git a/GraphBLAS/CUDA/GB_cuda_upscale_identity.cpp b/GraphBLAS/CUDA/monoid/GB_cuda_upscale_identity.cpp similarity index 100% rename from GraphBLAS/CUDA/GB_cuda_upscale_identity.cpp rename to GraphBLAS/CUDA/monoid/GB_cuda_upscale_identity.cpp diff --git a/GraphBLAS/CUDA/GB_cuda_AxB.hpp b/GraphBLAS/CUDA/mxm/GB_cuda_AxB.hpp similarity index 100% rename from GraphBLAS/CUDA/GB_cuda_AxB.hpp rename to GraphBLAS/CUDA/mxm/GB_cuda_AxB.hpp diff --git a/GraphBLAS/CUDA/GB_cuda_AxB_dot3.cpp b/GraphBLAS/CUDA/mxm/GB_cuda_AxB_dot3.cpp similarity index 99% rename from GraphBLAS/CUDA/GB_cuda_AxB_dot3.cpp rename to GraphBLAS/CUDA/mxm/GB_cuda_AxB_dot3.cpp index a3d96169c..957ef19f7 100644 --- a/GraphBLAS/CUDA/GB_cuda_AxB_dot3.cpp +++ b/GraphBLAS/CUDA/mxm/GB_cuda_AxB_dot3.cpp @@ -20,7 +20,7 @@ GB_cuda_stream_pool_release (&stream) ; \ } -#include "GB_cuda_AxB.hpp" +#include "mxm/GB_cuda_AxB.hpp" //------------------------------------------------------------------------------ // GB_cuda_AxB_dot3 diff --git a/GraphBLAS/CUDA/GB_cuda_AxB_dot3_branch.cpp b/GraphBLAS/CUDA/mxm/GB_cuda_AxB_dot3_branch.cpp similarity index 98% rename from GraphBLAS/CUDA/GB_cuda_AxB_dot3_branch.cpp rename to GraphBLAS/CUDA/mxm/GB_cuda_AxB_dot3_branch.cpp index 880cb8a38..bae3782bc 100644 --- a/GraphBLAS/CUDA/GB_cuda_AxB_dot3_branch.cpp +++ b/GraphBLAS/CUDA/mxm/GB_cuda_AxB_dot3_branch.cpp @@ -10,7 +10,6 @@ // Decide branch direction for GPU use for the dot-product C=A'*B #include "GB_cuda.hpp" -#include bool GB_cuda_AxB_dot3_branch ( diff --git a/GraphBLAS/CUDA/GB_cuda_AxB_dot3_jit.cpp b/GraphBLAS/CUDA/mxm/GB_cuda_AxB_dot3_jit.cpp similarity index 98% rename from GraphBLAS/CUDA/GB_cuda_AxB_dot3_jit.cpp rename to GraphBLAS/CUDA/mxm/GB_cuda_AxB_dot3_jit.cpp index 52cfd7e3d..ccda3c68f 100644 --- a/GraphBLAS/CUDA/GB_cuda_AxB_dot3_jit.cpp +++ b/GraphBLAS/CUDA/mxm/GB_cuda_AxB_dot3_jit.cpp @@ -7,7 +7,7 @@ //------------------------------------------------------------------------------ -#include "GB_cuda_AxB.hpp" +#include "mxm/GB_cuda_AxB.hpp" extern "C" { diff --git a/GraphBLAS/CUDA/GB_cuda_colscale.cpp b/GraphBLAS/CUDA/mxm/GB_cuda_colscale.cpp similarity index 89% rename from GraphBLAS/CUDA/GB_cuda_colscale.cpp rename to GraphBLAS/CUDA/mxm/GB_cuda_colscale.cpp index dc8dad7d8..6b29076aa 100644 --- a/GraphBLAS/CUDA/GB_cuda_colscale.cpp +++ b/GraphBLAS/CUDA/mxm/GB_cuda_colscale.cpp @@ -1,9 +1,9 @@ -#include "GB_cuda_ewise.hpp" +#include "mxm/GB_cuda_ewise.hpp" #undef GB_FREE_ALL #define GB_FREE_ALL \ { \ - GB_cuda_stream_pool_release (&stream) ; \ + GB_cuda_stream_pool_release (&stream) ; \ } #define BLOCK_SIZE 128 diff --git a/GraphBLAS/CUDA/GB_cuda_colscale_branch.cpp b/GraphBLAS/CUDA/mxm/GB_cuda_colscale_branch.cpp similarity index 100% rename from GraphBLAS/CUDA/GB_cuda_colscale_branch.cpp rename to GraphBLAS/CUDA/mxm/GB_cuda_colscale_branch.cpp diff --git a/GraphBLAS/CUDA/GB_cuda_colscale_jit.cpp b/GraphBLAS/CUDA/mxm/GB_cuda_colscale_jit.cpp similarity index 98% rename from GraphBLAS/CUDA/GB_cuda_colscale_jit.cpp rename to GraphBLAS/CUDA/mxm/GB_cuda_colscale_jit.cpp index 31547d789..d7e50005b 100644 --- a/GraphBLAS/CUDA/GB_cuda_colscale_jit.cpp +++ b/GraphBLAS/CUDA/mxm/GB_cuda_colscale_jit.cpp @@ -1,4 +1,4 @@ -#include "GB_cuda_ewise.hpp" +#include "mxm/GB_cuda_ewise.hpp" extern "C" { diff --git a/GraphBLAS/CUDA/GB_cuda_ewise.hpp b/GraphBLAS/CUDA/mxm/GB_cuda_ewise.hpp similarity index 100% rename from GraphBLAS/CUDA/GB_cuda_ewise.hpp rename to GraphBLAS/CUDA/mxm/GB_cuda_ewise.hpp diff --git a/GraphBLAS/CUDA/GB_cuda_rowscale.cpp b/GraphBLAS/CUDA/mxm/GB_cuda_rowscale.cpp similarity index 89% rename from GraphBLAS/CUDA/GB_cuda_rowscale.cpp rename to GraphBLAS/CUDA/mxm/GB_cuda_rowscale.cpp index cabff7da0..ef554d2d6 100644 --- a/GraphBLAS/CUDA/GB_cuda_rowscale.cpp +++ b/GraphBLAS/CUDA/mxm/GB_cuda_rowscale.cpp @@ -1,9 +1,9 @@ -#include "GB_cuda_ewise.hpp" +#include "mxm/GB_cuda_ewise.hpp" #undef GB_FREE_ALL #define GB_FREE_ALL \ { \ - GB_cuda_stream_pool_release (&stream) ; \ + GB_cuda_stream_pool_release (&stream) ; \ } #define BLOCK_SIZE 128 diff --git a/GraphBLAS/CUDA/GB_cuda_rowscale_branch.cpp b/GraphBLAS/CUDA/mxm/GB_cuda_rowscale_branch.cpp similarity index 100% rename from GraphBLAS/CUDA/GB_cuda_rowscale_branch.cpp rename to GraphBLAS/CUDA/mxm/GB_cuda_rowscale_branch.cpp diff --git a/GraphBLAS/CUDA/GB_cuda_rowscale_jit.cpp b/GraphBLAS/CUDA/mxm/GB_cuda_rowscale_jit.cpp similarity index 98% rename from GraphBLAS/CUDA/GB_cuda_rowscale_jit.cpp rename to GraphBLAS/CUDA/mxm/GB_cuda_rowscale_jit.cpp index 0ad2806c2..edca87e01 100644 --- a/GraphBLAS/CUDA/GB_cuda_rowscale_jit.cpp +++ b/GraphBLAS/CUDA/mxm/GB_cuda_rowscale_jit.cpp @@ -1,4 +1,4 @@ -#include "GB_cuda_ewise.hpp" +#include "mxm/GB_cuda_ewise.hpp" extern "C" { diff --git a/GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh b/GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh similarity index 100% rename from GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh rename to GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh diff --git a/GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase1.cuh b/GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase1.cuh similarity index 100% rename from GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase1.cuh rename to GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase1.cuh diff --git a/GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase2.cuh b/GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase2.cuh similarity index 100% rename from GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase2.cuh rename to GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase2.cuh diff --git a/GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase2end.cuh b/GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase2end.cuh similarity index 100% rename from GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase2end.cuh rename to GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase2end.cuh diff --git a/GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase3_dndn.cuh b/GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase3_dndn.cuh similarity index 100% rename from GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase3_dndn.cuh rename to GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase3_dndn.cuh diff --git a/GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase3_mp.cuh b/GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase3_mp.cuh similarity index 98% rename from GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase3_mp.cuh rename to GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase3_mp.cuh index 4315c9063..d3cc062bc 100644 --- a/GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase3_mp.cuh +++ b/GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase3_mp.cuh @@ -179,7 +179,7 @@ __global__ void GB_cuda_AxB_dot3_phase3_mp_kernel #define pY_end pB_end #define Yi Bi - #include "GB_cuda_jit_AxB_dot3_phase3_mp_guts.cuh" + #include "template/GB_cuda_jit_AxB_dot3_phase3_mp_guts.cuh" } #if 0 else @@ -199,7 +199,7 @@ __global__ void GB_cuda_AxB_dot3_phase3_mp_kernel #define Yi Ai // flip the roles of A(:,i) and B(:,j) - #include "GB_cuda_jit_AxB_dot3_phase3_mp_guts.cuh" + #include "template/GB_cuda_jit_AxB_dot3_phase3_mp_guts.cuh" } #endif diff --git a/GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase3_mp_guts.cuh b/GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase3_mp_guts.cuh similarity index 100% rename from GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase3_mp_guts.cuh rename to GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase3_mp_guts.cuh diff --git a/GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase3_spdn.cuh b/GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase3_spdn.cuh similarity index 100% rename from GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase3_spdn.cuh rename to GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase3_spdn.cuh diff --git a/GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase3_vsdn.cuh b/GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase3_vsdn.cuh similarity index 100% rename from GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase3_vsdn.cuh rename to GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase3_vsdn.cuh diff --git a/GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase3_vssp.cuh b/GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase3_vssp.cuh similarity index 100% rename from GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase3_vssp.cuh rename to GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase3_vssp.cuh diff --git a/GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh b/GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh similarity index 100% rename from GraphBLAS/CUDA/template/GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh rename to GraphBLAS/CUDA/mxm/template/GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh diff --git a/GraphBLAS/CUDA/template/GB_jit_kernel_cuda_AxB_dot3.cu b/GraphBLAS/CUDA/mxm/template/GB_jit_kernel_cuda_AxB_dot3.cu similarity index 97% rename from GraphBLAS/CUDA/template/GB_jit_kernel_cuda_AxB_dot3.cu rename to GraphBLAS/CUDA/mxm/template/GB_jit_kernel_cuda_AxB_dot3.cu index fe83b1c7b..949541eef 100644 --- a/GraphBLAS/CUDA/template/GB_jit_kernel_cuda_AxB_dot3.cu +++ b/GraphBLAS/CUDA/mxm/template/GB_jit_kernel_cuda_AxB_dot3.cu @@ -136,19 +136,19 @@ GB_bucket_code ; // FIXME: rename GB_dot3_bucket_code // a bitmap/sparse kernel // ... -#include "GB_cuda_tile_sum_uint64.cuh" -#include "GB_cuda_tile_reduce_ztype.cuh" +#include "template/GB_cuda_tile_sum_uint64.cuh" +#include "template/GB_cuda_tile_reduce_ztype.cuh" //------------------------------------------------------------------------------ // CUDA device kernels for each case //------------------------------------------------------------------------------ -#include "GB_cuda_ek_slice.cuh" +#include "template/GB_cuda_ek_slice.cuh" #if ((GB_A_IS_BITMAP || GB_A_IS_FULL) && (GB_B_IS_BITMAP || GB_B_IS_FULL)) // dense-dense - #include "GB_cuda_jit_AxB_dot3_dense_phase1.cuh" - #include "GB_cuda_jit_AxB_dot3_phase3_dndn.cuh" + #include "template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh" + #include "template/GB_cuda_jit_AxB_dot3_phase3_dndn.cuh" #else // sparse-sparse, sparse-dense, or dense-sparse @@ -161,19 +161,19 @@ GB_bucket_code ; // FIXME: rename GB_dot3_bucket_code GB_FREE_MEMORY (&Bucket, Bu_size) ; \ } - #include "GB_cuda_jit_AxB_dot3_phase1.cuh" - #include "GB_cuda_jit_AxB_dot3_phase2.cuh" - #include "GB_cuda_jit_AxB_dot3_phase2end.cuh" + #include "template/GB_cuda_jit_AxB_dot3_phase1.cuh" + #include "template/GB_cuda_jit_AxB_dot3_phase2.cuh" + #include "template/GB_cuda_jit_AxB_dot3_phase2end.cuh" #if ((GB_A_IS_SPARSE || GB_A_IS_HYPER) && \ (GB_B_IS_SPARSE || GB_B_IS_HYPER)) // sparse-sparse - #include "GB_cuda_jit_AxB_dot3_phase3_mp.cuh" - #include "GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh" - #include "GB_cuda_jit_AxB_dot3_phase3_vssp.cuh" + #include "template/GB_cuda_jit_AxB_dot3_phase3_mp.cuh" + #include "template/GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh" + #include "template/GB_cuda_jit_AxB_dot3_phase3_vssp.cuh" #else // sparse-dense or dense-sparse - #include "GB_cuda_jit_AxB_dot3_phase3_spdn.cuh" - #include "GB_cuda_jit_AxB_dot3_phase3_vsdn.cuh" + #include "template/GB_cuda_jit_AxB_dot3_phase3_spdn.cuh" + #include "template/GB_cuda_jit_AxB_dot3_phase3_vsdn.cuh" #endif #endif @@ -181,8 +181,6 @@ GB_bucket_code ; // FIXME: rename GB_dot3_bucket_code // host function to launch the CUDA kernels for dot3 on the GPU //------------------------------------------------------------------------------ -// #include "GB_cuda_timer.hpp" - extern "C" { GB_JIT_CUDA_KERNEL_DOT3_PROTO (GB_jit_kernel) ; diff --git a/GraphBLAS/CUDA/template/GB_jit_kernel_cuda_colscale.cu b/GraphBLAS/CUDA/mxm/template/GB_jit_kernel_cuda_colscale.cu similarity index 98% rename from GraphBLAS/CUDA/template/GB_jit_kernel_cuda_colscale.cu rename to GraphBLAS/CUDA/mxm/template/GB_jit_kernel_cuda_colscale.cu index 6d80827dc..570509eae 100644 --- a/GraphBLAS/CUDA/template/GB_jit_kernel_cuda_colscale.cu +++ b/GraphBLAS/CUDA/mxm/template/GB_jit_kernel_cuda_colscale.cu @@ -3,7 +3,7 @@ using namespace cooperative_groups ; // do not #include functions inside of other functions! -#include "GB_cuda_ek_slice.cuh" +#include "template/GB_cuda_ek_slice.cuh" #define log2_chunk_size 10 #define chunk_size 1024 diff --git a/GraphBLAS/CUDA/template/GB_jit_kernel_cuda_rowscale.cu b/GraphBLAS/CUDA/mxm/template/GB_jit_kernel_cuda_rowscale.cu similarity index 100% rename from GraphBLAS/CUDA/template/GB_jit_kernel_cuda_rowscale.cu rename to GraphBLAS/CUDA/mxm/template/GB_jit_kernel_cuda_rowscale.cu diff --git a/GraphBLAS/CUDA/GB_cuda_reduce.hpp b/GraphBLAS/CUDA/reduce/GB_cuda_reduce.hpp similarity index 100% rename from GraphBLAS/CUDA/GB_cuda_reduce.hpp rename to GraphBLAS/CUDA/reduce/GB_cuda_reduce.hpp diff --git a/GraphBLAS/CUDA/GB_cuda_reduce_to_scalar.cpp b/GraphBLAS/CUDA/reduce/GB_cuda_reduce_to_scalar.cpp similarity index 98% rename from GraphBLAS/CUDA/GB_cuda_reduce_to_scalar.cpp rename to GraphBLAS/CUDA/reduce/GB_cuda_reduce_to_scalar.cpp index 7864b6323..8c65a0190 100644 --- a/GraphBLAS/CUDA/GB_cuda_reduce_to_scalar.cpp +++ b/GraphBLAS/CUDA/reduce/GB_cuda_reduce_to_scalar.cpp @@ -25,10 +25,10 @@ { \ GB_FREE_WORKSPACE ; \ GB_Matrix_free (&V) ; \ - GB_cuda_stream_pool_release (&stream) ; \ + GB_cuda_stream_pool_release (&stream) ; \ } -#include "GB_cuda_reduce.hpp" +#include "reduce/GB_cuda_reduce.hpp" GrB_Info GB_cuda_reduce_to_scalar ( diff --git a/GraphBLAS/CUDA/GB_cuda_reduce_to_scalar_branch.cpp b/GraphBLAS/CUDA/reduce/GB_cuda_reduce_to_scalar_branch.cpp similarity index 97% rename from GraphBLAS/CUDA/GB_cuda_reduce_to_scalar_branch.cpp rename to GraphBLAS/CUDA/reduce/GB_cuda_reduce_to_scalar_branch.cpp index dbdcf62c7..56c316b5d 100644 --- a/GraphBLAS/CUDA/GB_cuda_reduce_to_scalar_branch.cpp +++ b/GraphBLAS/CUDA/reduce/GB_cuda_reduce_to_scalar_branch.cpp @@ -9,7 +9,7 @@ // Decide branch direction for GPU use for the reduction to scalar -#include "GB_cuda_reduce.hpp" +#include "reduce/GB_cuda_reduce.hpp" bool GB_cuda_reduce_to_scalar_branch // return true to use the GPU ( diff --git a/GraphBLAS/CUDA/GB_cuda_reduce_to_scalar_jit.cpp b/GraphBLAS/CUDA/reduce/GB_cuda_reduce_to_scalar_jit.cpp similarity index 98% rename from GraphBLAS/CUDA/GB_cuda_reduce_to_scalar_jit.cpp rename to GraphBLAS/CUDA/reduce/GB_cuda_reduce_to_scalar_jit.cpp index 2b55cfcf1..74f9e927c 100644 --- a/GraphBLAS/CUDA/GB_cuda_reduce_to_scalar_jit.cpp +++ b/GraphBLAS/CUDA/reduce/GB_cuda_reduce_to_scalar_jit.cpp @@ -7,7 +7,7 @@ //------------------------------------------------------------------------------ -#include "GB_cuda_reduce.hpp" +#include "reduce/GB_cuda_reduce.hpp" extern "C" { diff --git a/GraphBLAS/CUDA/template/GB_cuda_threadblock_reduce_ztype.cuh b/GraphBLAS/CUDA/reduce/template/GB_cuda_threadblock_reduce_ztype.cuh similarity index 100% rename from GraphBLAS/CUDA/template/GB_cuda_threadblock_reduce_ztype.cuh rename to GraphBLAS/CUDA/reduce/template/GB_cuda_threadblock_reduce_ztype.cuh diff --git a/GraphBLAS/CUDA/template/GB_cuda_tile_reduce_ztype.cuh b/GraphBLAS/CUDA/reduce/template/GB_cuda_tile_reduce_ztype.cuh similarity index 100% rename from GraphBLAS/CUDA/template/GB_cuda_tile_reduce_ztype.cuh rename to GraphBLAS/CUDA/reduce/template/GB_cuda_tile_reduce_ztype.cuh diff --git a/GraphBLAS/CUDA/template/GB_jit_kernel_cuda_reduce.cu b/GraphBLAS/CUDA/reduce/template/GB_jit_kernel_cuda_reduce.cu similarity index 97% rename from GraphBLAS/CUDA/template/GB_jit_kernel_cuda_reduce.cu rename to GraphBLAS/CUDA/reduce/template/GB_jit_kernel_cuda_reduce.cu index 708d96d19..47f15bc4b 100644 --- a/GraphBLAS/CUDA/template/GB_jit_kernel_cuda_reduce.cu +++ b/GraphBLAS/CUDA/reduce/template/GB_jit_kernel_cuda_reduce.cu @@ -35,9 +35,9 @@ #define tile_sz 32 #define log2_tile_sz 5 -#include "GB_cuda_tile_sum_uint64.cuh" -#include "GB_cuda_tile_reduce_ztype.cuh" -#include "GB_cuda_threadblock_reduce_ztype.cuh" +#include "template/GB_cuda_tile_sum_uint64.cuh" +#include "template/GB_cuda_tile_reduce_ztype.cuh" +#include "template/GB_cuda_threadblock_reduce_ztype.cuh" //------------------------------------------------------------------------------ // GB_cuda_reduce_kernel: reduce all entries in a matrix to a single scalar diff --git a/GraphBLAS/CUDA/GB_cuda_select.hpp b/GraphBLAS/CUDA/select/GB_cuda_select.hpp similarity index 100% rename from GraphBLAS/CUDA/GB_cuda_select.hpp rename to GraphBLAS/CUDA/select/GB_cuda_select.hpp diff --git a/GraphBLAS/CUDA/GB_cuda_select_bitmap.cpp b/GraphBLAS/CUDA/select/GB_cuda_select_bitmap.cpp similarity index 96% rename from GraphBLAS/CUDA/GB_cuda_select_bitmap.cpp rename to GraphBLAS/CUDA/select/GB_cuda_select_bitmap.cpp index bbeb93861..751f6847e 100644 --- a/GraphBLAS/CUDA/GB_cuda_select_bitmap.cpp +++ b/GraphBLAS/CUDA/select/GB_cuda_select_bitmap.cpp @@ -1,4 +1,4 @@ -#include "GB_cuda_select.hpp" +#include "select/GB_cuda_select.hpp" #undef GB_FREE_ALL #define GB_FREE_ALL \ diff --git a/GraphBLAS/CUDA/GB_cuda_select_bitmap_jit.cpp b/GraphBLAS/CUDA/select/GB_cuda_select_bitmap_jit.cpp similarity index 97% rename from GraphBLAS/CUDA/GB_cuda_select_bitmap_jit.cpp rename to GraphBLAS/CUDA/select/GB_cuda_select_bitmap_jit.cpp index c644e264b..fba572d63 100644 --- a/GraphBLAS/CUDA/GB_cuda_select_bitmap_jit.cpp +++ b/GraphBLAS/CUDA/select/GB_cuda_select_bitmap_jit.cpp @@ -1,4 +1,4 @@ -#include "GB_cuda_select.hpp" +#include "select/GB_cuda_select.hpp" extern "C" { diff --git a/GraphBLAS/CUDA/GB_cuda_select_branch.cpp b/GraphBLAS/CUDA/select/GB_cuda_select_branch.cpp similarity index 100% rename from GraphBLAS/CUDA/GB_cuda_select_branch.cpp rename to GraphBLAS/CUDA/select/GB_cuda_select_branch.cpp diff --git a/GraphBLAS/CUDA/GB_cuda_select_sparse.cpp b/GraphBLAS/CUDA/select/GB_cuda_select_sparse.cpp similarity index 98% rename from GraphBLAS/CUDA/GB_cuda_select_sparse.cpp rename to GraphBLAS/CUDA/select/GB_cuda_select_sparse.cpp index 51d60d615..95d36512d 100644 --- a/GraphBLAS/CUDA/GB_cuda_select_sparse.cpp +++ b/GraphBLAS/CUDA/select/GB_cuda_select_sparse.cpp @@ -1,5 +1,5 @@ -#include "GB_cuda_select.hpp" +#include "select/GB_cuda_select.hpp" #undef GB_FREE_ALL #define GB_FREE_ALL \ diff --git a/GraphBLAS/CUDA/GB_cuda_select_sparse_jit.cpp b/GraphBLAS/CUDA/select/GB_cuda_select_sparse_jit.cpp similarity index 97% rename from GraphBLAS/CUDA/GB_cuda_select_sparse_jit.cpp rename to GraphBLAS/CUDA/select/GB_cuda_select_sparse_jit.cpp index ff7a4b7f6..b54c905a8 100644 --- a/GraphBLAS/CUDA/GB_cuda_select_sparse_jit.cpp +++ b/GraphBLAS/CUDA/select/GB_cuda_select_sparse_jit.cpp @@ -1,4 +1,4 @@ -#include "GB_cuda_select.hpp" +#include "select/GB_cuda_select.hpp" extern "C" { diff --git a/GraphBLAS/CUDA/template/GB_jit_kernel_cuda_select_bitmap.cu b/GraphBLAS/CUDA/select/template/GB_jit_kernel_cuda_select_bitmap.cu similarity index 94% rename from GraphBLAS/CUDA/template/GB_jit_kernel_cuda_select_bitmap.cu rename to GraphBLAS/CUDA/select/template/GB_jit_kernel_cuda_select_bitmap.cu index f9b9d3929..d71ef2386 100644 --- a/GraphBLAS/CUDA/template/GB_jit_kernel_cuda_select_bitmap.cu +++ b/GraphBLAS/CUDA/select/template/GB_jit_kernel_cuda_select_bitmap.cu @@ -5,9 +5,8 @@ using namespace cooperative_groups ; #define tile_sz 32 #define log2_tile_sz 5 -#include "GB_cuda_atomics.cuh" -#include "GB_cuda_tile_sum_uint64.cuh" -#include "GB_cuda_threadblock_sum_uint64.cuh" +#include "template/GB_cuda_tile_sum_uint64.cuh" +#include "template/GB_cuda_threadblock_sum_uint64.cuh" __global__ void GB_cuda_select_bitmap_kernel ( diff --git a/GraphBLAS/CUDA/template/GB_jit_kernel_cuda_select_sparse.cu b/GraphBLAS/CUDA/select/template/GB_jit_kernel_cuda_select_sparse.cu similarity index 99% rename from GraphBLAS/CUDA/template/GB_jit_kernel_cuda_select_sparse.cu rename to GraphBLAS/CUDA/select/template/GB_jit_kernel_cuda_select_sparse.cu index 842234529..814c74605 100644 --- a/GraphBLAS/CUDA/template/GB_jit_kernel_cuda_select_sparse.cu +++ b/GraphBLAS/CUDA/select/template/GB_jit_kernel_cuda_select_sparse.cu @@ -47,7 +47,9 @@ using namespace cooperative_groups ; -#include "GB_cuda_ek_slice.cuh" +#include "template/GB_cuda_ek_slice.cuh" + +// FIXME: put the following elsewhere, say GB_cuda_kernel.cuh: #include #ifdef TIMING #include "omp.h" diff --git a/GraphBLAS/CUDA/template/GB_jit_kernel_cuda_select_sparse_OLD.cu b/GraphBLAS/CUDA/select/template/GB_jit_kernel_cuda_select_sparse_OLD.cu similarity index 99% rename from GraphBLAS/CUDA/template/GB_jit_kernel_cuda_select_sparse_OLD.cu rename to GraphBLAS/CUDA/select/template/GB_jit_kernel_cuda_select_sparse_OLD.cu index d8f64fa94..d1043f39c 100644 --- a/GraphBLAS/CUDA/template/GB_jit_kernel_cuda_select_sparse_OLD.cu +++ b/GraphBLAS/CUDA/select/template/GB_jit_kernel_cuda_select_sparse_OLD.cu @@ -1,7 +1,7 @@ using namespace cooperative_groups ; -#include "GB_cuda_ek_slice.cuh" -#include "GB_cuda_cumsum.cuh" +#include "template/GB_cuda_ek_slice.cuh" +#include "template/GB_cuda_cumsum.cuh" #define GB_FREE_WORKSPACE \ { \ diff --git a/GraphBLAS/CUDA/template/GB_cuda_ek_slice.cuh b/GraphBLAS/CUDA/slice/template/GB_cuda_ek_slice.cuh similarity index 100% rename from GraphBLAS/CUDA/template/GB_cuda_ek_slice.cuh rename to GraphBLAS/CUDA/slice/template/GB_cuda_ek_slice.cuh diff --git a/GraphBLAS/CUDA/GB_cuda_type_branch.cpp b/GraphBLAS/CUDA/type/GB_cuda_type_branch.cpp similarity index 100% rename from GraphBLAS/CUDA/GB_cuda_type_branch.cpp rename to GraphBLAS/CUDA/type/GB_cuda_type_branch.cpp diff --git a/GraphBLAS/Config/GraphBLASConfig.cmake.in b/GraphBLAS/Config/GraphBLASConfig.cmake.in index 0a50fd782..71b358728 100644 --- a/GraphBLAS/Config/GraphBLASConfig.cmake.in +++ b/GraphBLAS/Config/GraphBLASConfig.cmake.in @@ -40,27 +40,6 @@ set ( GRAPHBLAS_VERSION "@GraphBLAS_VERSION_MAJOR@.@GraphBLAS_VERSION_MINOR@.@Gr include ( CMakeFindDependencyMacro ) set ( _dependencies_found ON ) -if ( @GRAPHBLAS_HAS_CUDA@ ) - # Look for imported targets of additional dependency if GraphBLAS was built with CUDA - - if ( NOT GraphBLAS_CUDA_FOUND ) - if ( @SUITESPARSE_IN_BUILD_TREE@ ) - # First check in a common build tree - find_dependency ( GraphBLAS_CUDA @GraphBLAS_VERSION_MAJOR@.@GraphBLAS_VERSION_MINOR@.@GraphBLAS_VERSION_SUB@ - PATHS ${CMAKE_SOURCE_DIR}/../GraphBLAS/build/CUDA NO_DEFAULT_PATH ) - # Then, check in the currently active CMAKE_MODULE_PATH - if ( NOT GraphBLAS_CUDA_FOUND ) - find_dependency ( GraphBLAS_CUDA @GraphBLAS_VERSION_MAJOR@.@GraphBLAS_VERSION_MINOR@.@GraphBLAS_VERSION_SUB@ ) - endif ( ) - else ( ) - find_dependency ( GraphBLAS_CUDA @GraphBLAS_VERSION_MAJOR@.@GraphBLAS_VERSION_MINOR@.@GraphBLAS_VERSION_SUB@ ) - endif ( ) - endif ( ) - if ( NOT GraphBLAS_CUDA_FOUND ) - set ( _dependencies_found OFF ) - endif ( ) -endif ( ) - # Look for OpenMP if ( @GRAPHBLAS_HAS_OPENMP@ AND NOT OpenMP_C_FOUND ) find_dependency ( OpenMP COMPONENTS C ) @@ -255,3 +234,4 @@ if ( GRAPHBLAS_STATIC ) set_target_properties ( SuiteSparse::GraphBLAS_static PROPERTIES OUTPUT_NAME ${_graphblas_library_name} ) endif ( ) + diff --git a/GraphBLAS/Doc/ChangeLog b/GraphBLAS/Doc/ChangeLog index 7531e71fe..4abd22565 100644 --- a/GraphBLAS/Doc/ChangeLog +++ b/GraphBLAS/Doc/ChangeLog @@ -1,3 +1,20 @@ +Jan 21, 2026, version 10.3.1 + + * (67) bug fix: incorrect JIT kernel constructed for R=masker(C,M,Z) + when R is hypersparse. Found by Roi Lipman, FalkorDB. + * (66) bug fix: GB_bitonic did not compile with the MS cl compiler. + Found by Erik Welch, NVIDIA. + +Dec 3, 2025, version 10.3.0 + + * GrB_extract: performance improvement for C=A(I,J) when A is very large + and (typically) hypersparse, and I is an explicit list and also large. + * GrB_(Matrix,Vector,Scalar)_dup: pending work is now left unfinished; + any pending work in the input matrix will appear in the copy. In + v10.2.0 and earlier, all pending work in the input matrix was finished + first. To obtain the behavior in v10.2.0 and earlier, simply call + GrB_*_wait on the input matrix before calling GrB_*_dup. + Nov 1, 2025, version 10.2.0 * printing of user-defined types: get/set with GxB_PRINT_FUNCTION diff --git a/GraphBLAS/Doc/GraphBLAS_UserGuide.pdf b/GraphBLAS/Doc/GraphBLAS_UserGuide.pdf index b1cfd5e886f54ad020084da730cf973f7b834bd1..14bc18348250d5dbbff5668bc0084f22643a3f40 100644 GIT binary patch delta 237290 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

^>dAHgc)YSH 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 Z!Kb{;blr3ejgsi~v*a7=i}kb1Uqlk|gylKU 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

$NLYrdfM?~}1_z}nTG1V%>N&F7KSjr)tk;1g0e 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 NQ)4bwRabvEE&y&y#OeS5 diff --git a/GraphBLAS/Doc/GraphBLAS_version.tex b/GraphBLAS/Doc/GraphBLAS_version.tex index ad8d227ad..267f6f81f 100644 --- a/GraphBLAS/Doc/GraphBLAS_version.tex +++ b/GraphBLAS/Doc/GraphBLAS_version.tex @@ -1,5 +1,5 @@ % version of SuiteSparse:GraphBLAS \date{VERSION -10.2.0, -Nov 1, 2025} +10.3.1, +Jan 21, 2026} diff --git a/GraphBLAS/Doc/UserGuide/GrB_objects_Matrix.tex b/GraphBLAS/Doc/UserGuide/GrB_objects_Matrix.tex index a25aaf8f2..567832b76 100644 --- a/GraphBLAS/Doc/UserGuide/GrB_objects_Matrix.tex +++ b/GraphBLAS/Doc/UserGuide/GrB_objects_Matrix.tex @@ -189,6 +189,12 @@ \subsubsection{{\sf GrB\_Matrix\_dup:} copy a matrix} no effect on the other. The \verb'GrB_NAME' is copied into the new matrix. +In GraphBLAS v10.2.0 and earlier, a call to \verb'GrB_Matrix_dup' triggered +a internal call to \verb'GrB_Matrix_wait' on the input matrix \verb'A'. In +v10.3.0 and later, this call is removed. To obtain the old behavior of +v10.2.0 and earlier, simply call \verb'GrB_Matrix_wait' on the input matrix +\verb'A' prior to calling \verb'GrB_Matrix_dup(&C,A)'. + %------------------------------------------------------------------------------- \subsubsection{{\sf GrB\_Matrix\_clear:} clear a matrix of all entries} %------------------------------------------------------------------------------- diff --git a/GraphBLAS/Doc/UserGuide/GrB_objects_Scalar.tex b/GraphBLAS/Doc/UserGuide/GrB_objects_Scalar.tex index 127b6cf5c..dfc78b884 100644 --- a/GraphBLAS/Doc/UserGuide/GrB_objects_Scalar.tex +++ b/GraphBLAS/Doc/UserGuide/GrB_objects_Scalar.tex @@ -121,6 +121,13 @@ \subsubsection{{\sf GrB\_Scalar\_dup:} copy a scalar} effect on the other. The \verb'GrB_NAME' is copied into the new scalar. +In GraphBLAS v10.2.0 and earlier, a call to \verb'GrB_Scalar_dup' triggered +a internal call to \verb'GrB_Scalar_wait' on the input scalar \verb't'. In +v10.3.0 and later, this call is removed. To obtain the old behavior of +v10.2.0 and earlier, simply call \verb'GrB_Scalar_wait' on the input scalar +\verb't' prior to calling \verb'GrB_Scalar_dup(&s,t)'. + +\newpage %------------------------------------------------------------------------------- \subsubsection{{\sf GrB\_Scalar\_clear:} clear a scalar of its entry} %------------------------------------------------------------------------------- diff --git a/GraphBLAS/Doc/UserGuide/GrB_objects_Vector.tex b/GraphBLAS/Doc/UserGuide/GrB_objects_Vector.tex index 43268191e..5cf4c17eb 100644 --- a/GraphBLAS/Doc/UserGuide/GrB_objects_Vector.tex +++ b/GraphBLAS/Doc/UserGuide/GrB_objects_Vector.tex @@ -156,6 +156,13 @@ \subsubsection{{\sf GrB\_Vector\_dup:} copy a vector} no effect on the other. The \verb'GrB_NAME' is copied into the new vector. +In GraphBLAS v10.2.0 and earlier, a call to \verb'GrB_Vector_dup' triggered +a internal call to \verb'GrB_Vector_wait' on the input vector \verb'u'. In +v10.3.0 and later, this call is removed. To obtain the old behavior of +v10.2.0 and earlier, simply call \verb'GrB_Vector_wait' on the input vector +\verb'u' prior to calling \verb'GrB_Vector_dup(&w,u)'. + +\newpage %------------------------------------------------------------------------------- \subsubsection{{\sf GrB\_Vector\_clear:} clear a vector of all entries} %------------------------------------------------------------------------------- @@ -178,7 +185,6 @@ \subsubsection{{\sf GrB\_Vector\_clear:} clear a vector of all entries} with \verb'v (:) = sparse(0)' in MATLAB. The type and dimension of \verb'v' do not change. Any pending updates to the vector are discarded. -\newpage %------------------------------------------------------------------------------- \subsubsection{{\sf GrB\_Vector\_size:} return the size of a vector} %------------------------------------------------------------------------------- @@ -219,6 +225,7 @@ \subsubsection{{\sf GrB\_Vector\_nvals:} return the number of entries in GraphBLAS need not be zero and \verb'nnz' (short for ``number of nonzeros'') in MATLAB is better described as ``number of entries'' in GraphBLAS. +\newpage %------------------------------------------------------------------------------- \subsubsection{{\sf GrB\_Vector\_build:} build a vector from a set of tuples} %------------------------------------------------------------------------------- @@ -364,7 +371,6 @@ \subsubsection{{\sf GrB\_Vector\_setElement:} add an entry to a vector} \verb'GrB_Matrix_setElement' in Section~\ref{matrix_setElement}. If an error occurs, \verb'GrB_error(&err,w)' returns details about the error. -\newpage %------------------------------------------------------------------------------- \subsubsection{{\sf GrB\_Vector\_extractElement:} get an entry from a vector} %------------------------------------------------------------------------------- diff --git a/GraphBLAS/Doc/UserGuide/GrB_release.tex b/GraphBLAS/Doc/UserGuide/GrB_release.tex index 5344152f0..7dcd6c0a1 100644 --- a/GraphBLAS/Doc/UserGuide/GrB_release.tex +++ b/GraphBLAS/Doc/UserGuide/GrB_release.tex @@ -5,12 +5,37 @@ \section{Release Notes} \begin{itemize} -\item Nov 1, version 10.2.0 +\item Jan 21, 2026: version 10.3.1 \begin{itemize} - \item printing of user-defined types: get/set with \verb'GxB_PRINT_FUNCTION'. + \item (67) bug fix: incorrect JIT kernel constructed for R=masker(C,M,Z) + when R is hypersparse. Found by Roi Lipman, FalkorDB. + \item (66) bug fix: \verb'GB_bitonic' did not compile with the MS cl + compiler. Found by Erik Welch, NVIDIA. + \end{itemize} + +\item Dec 3, 2025: version 10.3.0 + + \begin{itemize} + \item \verb'GrB_extract': performance improvement for \verb'C=A(I,J)' when + \verb'A' is very large and (typically) hypersparse, and \verb'I' is an + explicit list and also large. + \item \verb'GrB_(Matrix,Vector,Scalar)_dup': pending work is now left + unfinished; any pending work in the input matrix will appear in the + copy. In v10.2.0 and earlier, all pending work in the input matrix was + finished first. To obtain the behavior in v10.2.0 and earlier, simply + call \verb'GrB_*_wait' on the input matrix before calling + \verb'GrB_*_dup'. + \end{itemize} + +\item Nov 1, 2025: version 10.2.0 + + \begin{itemize} + \item printing of user-defined types: get/set with + \verb'GxB_PRINT_FUNCTION'. \item doc: documentation of \verb'GrB_Matrix_import/export' was backwards. - \item performance: new \verb'GrB_assign' kernel for \verb'C+=A' added. + \item performance: new \verb'GrB_assign' kernel for \verb'C+=A' + added. \end{itemize} \item July 25, 2025: version 10.1.1 diff --git a/GraphBLAS/GraphBLAS/@GrB/GrB.m b/GraphBLAS/GraphBLAS/@GrB/GrB.m index d737ed174..5f13c443c 100644 --- a/GraphBLAS/GraphBLAS/@GrB/GrB.m +++ b/GraphBLAS/GraphBLAS/@GrB/GrB.m @@ -363,7 +363,7 @@ % operations: % C = GrB.build (I,J,X,m,n,dup,type,desc) build a GrB matrix from % list of entries (like C=sparse(I,J,X...)) -% [C,I,J] = GrB.compact (A,id) remove empty rows and columns +% [C,I,J] = GrB.compact (A,id,s) remove empty rows and columns % c = GrB.entries (A,...) count or query entries in a matrix % C = GrB.expand (scalar, A) expand a scalar (C = scalar*spones(A)) % [I,J,X] = GrB.extracttuples (A,desc) extract all entries (like 'find') @@ -996,7 +996,7 @@ C = cell2mat (A) ; c = chunk (c) ; clear ; - [C, I, J] = compact (A, id) ; + [C, I, J] = compact (A, id, symmetric) ; descriptorinfo (d) ; C = deserialize (blob, mode, arg3) ; % arg3 for testing only Y = dnn (W, bias, Y0) ; % uses GrB matrices diff --git a/GraphBLAS/GraphBLAS/@GrB/compact.m b/GraphBLAS/GraphBLAS/@GrB/compact.m index 566c72597..6dee80165 100644 --- a/GraphBLAS/GraphBLAS/@GrB/compact.m +++ b/GraphBLAS/GraphBLAS/@GrB/compact.m @@ -1,4 +1,4 @@ -function [C, I, J] = compact (A, id) +function [C, I, J] = compact (A, id, symmetric) %GRB.COMPACT remove empty rows and columns from a matrix. % C = GrB.compact (A) returns rows and columns from A that have no entries. % It has no effect on a full matrix, except to convert it to a @@ -11,12 +11,19 @@ % % To remove rows and colums that either have no entries, or that only have % entries equal to a particular scalar value, use C = GrB.compact (A, id), -% where id is the scalar value. +% where id is the scalar value. To skip this option, use id = [ ]. % % With two additional output arguments, [C,I,J] = GrB.compact (A, ...), % the indices of non-empty rows and columns of A are returned, so that % C = A (I,J). The lists I and J are returned in sorted order. % +% A third parameter specifies if C should be constructed symmetrically. +% C = GrB.compact (A, [ ], 'symmetric') constructs a list I = union (I,J), +% and then extracts C = A (I,I). To use this option, A must be square, but +% it need not be symmetric. This option is useful for pruning nodes of +% a directed graph A that have no incoming or outgoing edges. The graph of +% C will include any node with either incoming or outgoing (or both) edges. +% % Example: % % n = 2^40 ; @@ -41,7 +48,15 @@ A = A.opaque ; end -if (nargin > 1) +symmetric = (nargin > 2 && isequal (symmetric, 'symmetric')) ; +if (symmetric) + [m n] = gbsize (A) ; + if (m ~= n) + error ('A must be square to use the "symmetric" option') ; + end +end + +if (nargin > 1 && ~isempty (id)) % prune identity values from A id = gb_get_scalar (id) ; if (id ~= 0) @@ -57,6 +72,11 @@ I = gb_entries (A, 'row', 'list') ; J = gb_entries (A, 'col', 'list') ; +if (symmetric) + I = union (I, J) ; + J = I ; +end + % C = A (I,J) C = GrB (gbextract (A, { I }, { J })) ; diff --git a/GraphBLAS/GraphBLAS/@GrB/private/mexfunctions/gbselect.c b/GraphBLAS/GraphBLAS/@GrB/private/mexfunctions/gbselect.c index b38d1919e..480662928 100644 --- a/GraphBLAS/GraphBLAS/@GrB/private/mexfunctions/gbselect.c +++ b/GraphBLAS/GraphBLAS/@GrB/private/mexfunctions/gbselect.c @@ -298,6 +298,7 @@ void mexFunction OK (GrB_Scalar_new (&Zero, atype)) ; OK (GrB_Scalar_setElement_INT32 (Zero, 0)) ; b = (GrB_Matrix) Zero ; + Zero = NULL ; } //-------------------------------------------------------------------------- diff --git a/GraphBLAS/GraphBLAS/rename/GB_rename.h b/GraphBLAS/GraphBLAS/rename/GB_rename.h index 8f57768a0..5bd4246d1 100644 --- a/GraphBLAS/GraphBLAS/rename/GB_rename.h +++ b/GraphBLAS/GraphBLAS/rename/GB_rename.h @@ -155,6 +155,7 @@ #define GB_bitmap_expand_to_hyper GM_bitmap_expand_to_hyper #define GB_bitmap_M_scatter_whole GM_bitmap_M_scatter_whole #define GB_bitmap_subref GM_bitmap_subref +#define GB_bitonic GM_bitonic #define GB_bitset_int16 GM_bitset_int16 #define GB_bitset_int32 GM_bitset_int32 #define GB_bitset_int64 GM_bitset_int64 diff --git a/GraphBLAS/GraphBLAS/test/gbtest54.m b/GraphBLAS/GraphBLAS/test/gbtest54.m index df12bfbf3..ec3f74e08 100644 --- a/GraphBLAS/GraphBLAS/test/gbtest54.m +++ b/GraphBLAS/GraphBLAS/test/gbtest54.m @@ -16,6 +16,17 @@ [C, I, J] = GrB.compact (H, 0) ; assert (isequal (C, A (:,2:end))) ; +A = sprand (n, n, 0.02) ; +[C, I, J] = GrB.compact (A, [ ], 'symmetric') ; +assert (isequal (I, J)) ; +C2 = A (I, I) ; +assert (isequal (C, C2)) ; + +[C, I, J] = GrB.compact (A, [ ]) ; +assert (~isequal (I, J)) ; +C2 = A (I, J) ; +assert (isequal (C, C2)) ; + A = ones (4) ; A (1,1) = 2 ; G = GrB.compact (A, 2) ; @@ -25,5 +36,15 @@ A = sparse (A) ; assert (isequal (G, A)) ; +A = sprand (n, n/2, 0.5) ; +try + [C, I, J] = GrB.compact (A, [ ], 'symmetric') ; + ok = 0 ; +catch expected_error + expected_error + ok = 1 ; +end +assert (ok) ; + fprintf ('gbtest54: all tests passed\n') ; diff --git a/GraphBLAS/Include/GraphBLAS.h b/GraphBLAS/Include/GraphBLAS.h index 7efe28239..86ab61423 100644 --- a/GraphBLAS/Include/GraphBLAS.h +++ b/GraphBLAS/Include/GraphBLAS.h @@ -1,4 +1,4 @@ -// SuiteSparse:GraphBLAS 10.2.0 +// SuiteSparse:GraphBLAS 10.3.1 //------------------------------------------------------------------------------ // GraphBLAS.h: definitions for the GraphBLAS package //------------------------------------------------------------------------------ @@ -286,10 +286,10 @@ // The version of this implementation, and the GraphBLAS API version: #define GxB_IMPLEMENTATION_NAME "SuiteSparse:GraphBLAS" -#define GxB_IMPLEMENTATION_DATE "Nov 1, 2025" +#define GxB_IMPLEMENTATION_DATE "Jan 21, 2026" #define GxB_IMPLEMENTATION_MAJOR 10 -#define GxB_IMPLEMENTATION_MINOR 2 -#define GxB_IMPLEMENTATION_SUB 0 +#define GxB_IMPLEMENTATION_MINOR 3 +#define GxB_IMPLEMENTATION_SUB 1 #define GxB_SPEC_DATE "Dec 22, 2023" #define GxB_SPEC_MAJOR 2 #define GxB_SPEC_MINOR 1 diff --git a/GraphBLAS/JITpackage/CMakeLists.txt b/GraphBLAS/JITpackage/CMakeLists.txt index 64492a162..6f975d7f5 100644 --- a/GraphBLAS/JITpackage/CMakeLists.txt +++ b/GraphBLAS/JITpackage/CMakeLists.txt @@ -76,7 +76,8 @@ if ( TARGET grb_jitpackage ) file ( GLOB GRB_SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "../Include/GraphBLAS.h" - "../CUDA/template/*" + "../CUDA/*/template/*" + "../CUDA/*/include/*" "../CUDA/include/*" "../Source/*/template/*" "../Source/*/include/*" diff --git a/GraphBLAS/README.md b/GraphBLAS/README.md index 6f36bdfb0..1d416dd32 100644 --- a/GraphBLAS/README.md +++ b/GraphBLAS/README.md @@ -4,7 +4,7 @@ SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2025, All Rights Reserved. SPDX-License-Identifier: Apache-2.0 -VERSION 10.2.0, Nov 1, 2025 +VERSION 10.3.1, Jan 21, 2026 SuiteSparse:GraphBLAS is a complete implementation of the GraphBLAS standard, which defines a set of sparse matrix operations on an extended algebra of diff --git a/GraphBLAS/Source/builder/GB_build.c b/GraphBLAS/Source/builder/GB_build.c index f609e28b1..a17cc66d3 100644 --- a/GraphBLAS/Source/builder/GB_build.c +++ b/GraphBLAS/Source/builder/GB_build.c @@ -336,8 +336,8 @@ GrB_Info GB_build // build matrix // created an iso-valued matrix T, but this is not yet known. X_iso is // false for these methods. Since it has not yet been conformed to its // final sparsity structure, the matrix T is hypersparse, not bitmap. It - // has no zombies or pending tuples, so GB_all_entries_are_iso does need to - // handle those cases. T->x [0] is the new iso value of T. + // has no zombies or pending tuples, so GB_all_entries_are_iso does not + // need to handle those cases. T->x [0] is the new iso value of T. if (!X_iso && GB_all_entries_are_iso (T)) { diff --git a/GraphBLAS/Source/builder/GB_builder.c b/GraphBLAS/Source/builder/GB_builder.c index f01a4142c..7ad2532bb 100644 --- a/GraphBLAS/Source/builder/GB_builder.c +++ b/GraphBLAS/Source/builder/GB_builder.c @@ -22,8 +22,8 @@ // The work is done in major 5 Steps, some of which can be skipped, depending // on how the tuples are provided (*_work or *_input), and whether or not they // are sorted, or have duplicates. If vdim <= 1, some work is skipped (for -// GrB_Vectors, and single-vector GrB_Matrices). Let e be the of tuples on -// input. Let p be the # of threads used. +// GrB_Vectors, and single-vector GrB_Matrices). Let e be the number of tuples +// on input. Let p be the number of threads used. // STEP 1: copy user input. O(e/p) read/write per thread, or skipped. @@ -40,47 +40,58 @@ // STEP 5: assemble the tuples. O(e/p) read/writes per thread, or O(1) if the // values can be transplanted into T as-is. -// For GrB_Matrix_build: If the input (I_input, J_input, S_input) is already -// sorted with no duplicates, and no typecasting needs to be done, then Step 1 -// still must be done (each thread does O(e/p) reads of (I_input,J_input) and -// writes to I_work), but Step 1 also does the work for Step 3. Step 2 and 3 -// are skipped. Step 4 does O(e/p) reads per thread (J_input only). Then -// I_work is transplanted into T->i. Step 5 does O(e/p) read/writes per thread -// to copy Sx into T->x. +// For GrB_Matrix_build and GrB_Matrix_import: The (I_work, J_work, S_work) +// inputs are not used, and are NULL. If the input (I_input, J_input, +// S_input) is already sorted with no duplicates, and no typecasting needs +// to be done, then Step 1 still must be done (each thread does O(e/p) +// reads of (I_input,J_input) and writes to I_work), but Step 1 also does +// the work for Step 3. Step 2 and 3 are skipped. Step 4 does O(e/p) +// reads per thread (J_input only). Then I_work is transplanted into +// T->i. Step 5 does O(e/p) read/writes per thread to copy Sx into T->x. +// After the matrix is built, GB_all_entries_are_iso is called to +// determine if the matrix is iso. // For GrB_Vector_build: as GrB_Matrix_build, Step 1 does O(e/p) read/writes -// per thread. The input is always a vector, so vdim == 1 always holds. Step -// 2 is skipped if the indices are already sorted, and Step 3 does no work at -// all unless duplicates appear. Step 4 takes no time, for any vector. Step 5 -// does O(e/p) reads/writes per thread. +// per thread. The input is always a vector, so vdim == 1 always holds, +// and J_input is NULL. Step 2 is skipped if the indices are already +// sorted, and Step 3 does no work at all unless duplicates appear. Step +// 4 takes no time, for any vector. Step 5 does O(e/p) reads/writes per +// thread. After the vector is built, GB_all_entries_are_iso is called to +// determine if the vector is iso. // For GB_wait: the pending tuples are provided as I_work, J_work, and S_work, -// so Step 1 is skipped (no need to check for invalid indices). The input -// J_work may be null (vdim can be anything, since GB_wait is used for both -// vectors and matrices). The tuples might be in sorted order already, which -// is known precisely known from A->Pending->sorted. Step 2 does -// O((e log e)/p) work to sort the tuples. Duplicates may appear, and -// out-of-order tuples are likely. Step 3 does O(e/p) read/writes. Step 4 -// does O(e/p) reads per thread of (I_work,J_work), or just I_work. Step 5 -// does O(e/p) read/writes per thread, or O(1) time if S_work can be -// transplanted into T->x. +// so Step 1 is skipped (no need to check for invalid indices). The input +// J_work may be NULL (vdim can be anything, since GB_wait is used for +// both vectors and matrices). The tuples might be in sorted order +// already, which is known precisely known from A->Pending->sorted. Step +// 2 does O((e log e)/p) work to sort the tuples. Duplicates may appear, +// and out-of-order tuples are likely. Step 3 does O(e/p) read/writes. +// Step 4 does O(e/p) reads per thread of (I_work,J_work), or just I_work. +// Step 5 does O(e/p) read/writes per thread, or O(1) time if S_work can +// be transplanted into T->x. // For GB_transpose: uses I_work, J_work, and either S_input (if no op applied -// to the values) or S_work (if an op was applied to the A->x values). This is -// only done for matrices, not vectors, so vdim > 1 will always hold. The -// indices are valid so Step 1 is skipped. The tuples are not sorted, so Step -// 2 takes O((e log e)/p) time to do the sort. There are no duplicates, so -// Step 3 only does O(e/p) reads of J_work to count the vectors in each slice. -// Step 4 only does O(e/p) reads of J_work to compute T->h and T->p. Step 5 -// does O(e/p) read/writes per thread, but it uses the simpler case in -// GB_bld_template since no duplicates can appear. It is unlikely -// able to transplant S_work into T->x since the input will almost always be -// unsorted. - -// For GB_concat_hyper: uses I_work, J_work, and S_work. No duplicates -// appear. Tuples are not sorted on input. I_work is transplanted into C->i. -// J_work and S_work are freed on output. S_work is not transplanted into -// C->x. +// to the values) or S_work (if an op was applied to the A->x values). +// This is only done for matrices, not vectors, so vdim > 1 will always +// hold. The indices are valid so Step 1 is skipped. The tuples are not +// sorted, so Step 2 takes O((e log e)/p) time to do the sort. There are +// no duplicates, so Step 3 only does O(e/p) reads of J_work to count the +// vectors in each slice. Step 4 only does O(e/p) reads of J_work to +// compute T->h and T->p. Step 5 does O(e/p) read/writes per thread, but +// it uses the simpler case in GB_bld_template since no duplicates can +// appear. It is unlikely able to transplant S_work into T->x since the +// input will almost always be unsorted. + +// For GB_concat_hyper: uses I_work, J_work, and S_work (or S_input is a +// scalar if C is iso). No duplicates appear. Tuples are not sorted on +// input. I_work is transplanted into C->i. J_work and S_work are freed +// on output. S_work is not transplanted into C->x. + +// For GB_hyper_hash_build: uses I_work, J_work, and S_work. No duplicates +// appear. Tuples are not sorted on input. S_iso is false. + +// For GB_reshape: uses I_work, J_work, and S_work. No duplicates appear. +// Tuples can be sorted or unsorted on input. // For iso inputs/outputs: T and Sx have the same iso property. If they are // iso, then dup is always NULL. Duplicates may or may not appear if T and Sx diff --git a/GraphBLAS/Source/builtin/include/GB_opaque.h b/GraphBLAS/Source/builtin/include/GB_opaque.h index e3e0d86d7..aa0f3ff43 100644 --- a/GraphBLAS/Source/builtin/include/GB_opaque.h +++ b/GraphBLAS/Source/builtin/include/GB_opaque.h @@ -659,117 +659,87 @@ struct GB_Matrix_opaque // content of GrB_Matrix // for declaring pointers for specific matrices (C, M, A, B, S, R, Z): // C matrix: - #define GB_Cp_DECLARE(Cp,const) GB_MDECL (Cp, const, u) - #define GB_Ch_DECLARE(Ch,const) GB_MDECL (Ch, const, u) - #define GB_Ci_DECLARE(Ci,const) GB_MDECL (Ci, const, ) - #define GB_Ci_DECLARE_U(Ci,const) GB_MDECL (Ci, const, u) - #define GB_CYp_DECLARE(C_Yp,const) GB_MDECL (C_Yp, const, u) - #define GB_CYi_DECLARE(C_Yi,const) GB_MDECL (C_Yi, const, u) - #define GB_CYx_DECLARE(C_Yx,const) GB_MDECL (C_Yx, const, u) + #define GB_Cp_DECLARE(Cp,const) GB_MDECL (Cp, const, u) + #define GB_Ch_DECLARE(Ch,const) GB_MDECL (Ch, const, u) + #define GB_Ci_DECLARE(Ci,const) GB_MDECL (Ci, const, ) + #define GB_Ci_DECLARE_U(Ci,const) GB_MDECL (Ci, const, u) #define GB_CPendingi_DECLARE(Pending_i) GB_MDECL (Pending_i, , u) #define GB_CPendingj_DECLARE(Pending_j) GB_MDECL (Pending_j, , u) // M matrix: - #define GB_Mp_DECLARE(Mp,const) GB_MDECL (Mp, const, u) - #define GB_Mh_DECLARE(Mh,const) GB_MDECL (Mh, const, u) - #define GB_Mi_DECLARE(Mi,const) GB_MDECL (Mi, const, ) - #define GB_Mi_DECLARE_U(Mi,const) GB_MDECL (Mi, const, u) - #define GB_MYp_DECLARE(M_Yp,const) GB_MDECL (M_Yp, const, u) - #define GB_MYi_DECLARE(M_Yi,const) GB_MDECL (M_Yi, const, u) - #define GB_MYx_DECLARE(M_Yx,const) GB_MDECL (M_Yx, const, u) + #define GB_Mp_DECLARE(Mp,const) GB_MDECL (Mp, const, u) + #define GB_Mh_DECLARE(Mh,const) GB_MDECL (Mh, const, u) + #define GB_Mi_DECLARE(Mi,const) GB_MDECL (Mi, const, ) + #define GB_Mi_DECLARE_U(Mi,const) GB_MDECL (Mi, const, u) // A matrix: - #define GB_Ap_DECLARE(Ap,const) GB_MDECL (Ap, const, u) - #define GB_Ah_DECLARE(Ah,const) GB_MDECL (Ah, const, u) - #define GB_Ai_DECLARE(Ai,const) GB_MDECL (Ai, const, ) - #define GB_Ai_DECLARE_U(Ai,const) GB_MDECL (Ai, const, u) - #define GB_AYp_DECLARE(A_Yp,const) GB_MDECL (A_Yp, const, u) - #define GB_AYi_DECLARE(A_Yi,const) GB_MDECL (A_Yi, const, u) - #define GB_AYx_DECLARE(A_Yx,const) GB_MDECL (A_Yx, const, u) + #define GB_Ap_DECLARE(Ap,const) GB_MDECL (Ap, const, u) + #define GB_Ah_DECLARE(Ah,const) GB_MDECL (Ah, const, u) + #define GB_Ai_DECLARE(Ai,const) GB_MDECL (Ai, const, ) + #define GB_Ai_DECLARE_U(Ai,const) GB_MDECL (Ai, const, u) // B matrix: - #define GB_Bp_DECLARE(Bp,const) GB_MDECL (Bp, const, u) - #define GB_Bh_DECLARE(Bh,const) GB_MDECL (Bh, const, u) - #define GB_Bi_DECLARE(Bi,const) GB_MDECL (Bi, const, ) - #define GB_Bi_DECLARE_U(Bi,const) GB_MDECL (Bi, const, u) - #define GB_BYp_DECLARE(B_Yp,const) GB_MDECL (B_Yp, const, u) - #define GB_BYi_DECLARE(B_Yi,const) GB_MDECL (B_Yi, const, u) - #define GB_BYx_DECLARE(B_Yx,const) GB_MDECL (B_Yx, const, u) + #define GB_Bp_DECLARE(Bp,const) GB_MDECL (Bp, const, u) + #define GB_Bh_DECLARE(Bh,const) GB_MDECL (Bh, const, u) + #define GB_Bi_DECLARE(Bi,const) GB_MDECL (Bi, const, ) + #define GB_Bi_DECLARE_U(Bi,const) GB_MDECL (Bi, const, u) // S matrix: - #define GB_Sp_DECLARE(Sp,const) GB_MDECL (Sp, const, u) - #define GB_Sh_DECLARE(Sh,const) GB_MDECL (Sh, const, u) - #define GB_Si_DECLARE(Si,const) GB_MDECL (Si, const, ) - #define GB_Si_DECLARE_U(Si,const) GB_MDECL (Si, const, u) - #define GB_SYp_DECLARE(S_Yp,const) GB_MDECL (S_Yp, const, u) - #define GB_SYi_DECLARE(S_Yi,const) GB_MDECL (S_Yi, const, u) - #define GB_SYx_DECLARE(S_Yx,const) GB_MDECL (S_Yx, const, u) + #define GB_Sp_DECLARE(Sp,const) GB_MDECL (Sp, const, u) + #define GB_Sh_DECLARE(Sh,const) GB_MDECL (Sh, const, u) + #define GB_Si_DECLARE(Si,const) GB_MDECL (Si, const, ) + #define GB_Si_DECLARE_U(Si,const) GB_MDECL (Si, const, u) // R matrix: - #define GB_Rp_DECLARE(Rp,const) GB_MDECL (Rp, const, u) - #define GB_Rh_DECLARE(Rh,const) GB_MDECL (Rh, const, u) - #define GB_Ri_DECLARE(Ri,const) GB_MDECL (Ri, const, ) - #define GB_Ri_DECLARE_U(Ri,const) GB_MDECL (Ri, const, u) + #define GB_Rp_DECLARE(Rp,const) GB_MDECL (Rp, const, u) + #define GB_Rh_DECLARE(Rh,const) GB_MDECL (Rh, const, u) + #define GB_Ri_DECLARE(Ri,const) GB_MDECL (Ri, const, ) + #define GB_Ri_DECLARE_U(Ri,const) GB_MDECL (Ri, const, u) // Z matrix: - #define GB_Zp_DECLARE(Zp,const) GB_MDECL (Zp, const, u) - #define GB_Zh_DECLARE(Zh,const) GB_MDECL (Zh, const, u) - #define GB_Zi_DECLARE(Zi,const) GB_MDECL (Zi, const, ) - #define GB_Zi_DECLARE_U(Zi,const) GB_MDECL (Zi, const, u) + #define GB_Zp_DECLARE(Zp,const) GB_MDECL (Zp, const, u) + #define GB_Zh_DECLARE(Zh,const) GB_MDECL (Zh, const, u) + #define GB_Zi_DECLARE(Zi,const) GB_MDECL (Zi, const, ) + #define GB_Zi_DECLARE_U(Zi,const) GB_MDECL (Zi, const, u) // for getting pointers from specific matrices: // C matrix: - #define GB_Cp_PTR(Cp,C) GB_GET_MATRIX_PTR (Cp, C, p_is_32, p) - #define GB_Ch_PTR(Ch,C) GB_GET_MATRIX_PTR (Ch, C, j_is_32, h) - #define GB_Ci_PTR(Ci,C) GB_GET_MATRIX_PTR (Ci, C, i_is_32, i) - #define GB_CYp_PTR(C_Yp,C) GB_GET_HYPER_PTR (C_Yp, C, p) - #define GB_CYi_PTR(C_Yi,C) GB_GET_HYPER_PTR (C_Yi, C, i) - #define GB_CYx_PTR(C_Yx,C) GB_GET_HYPER_PTR (C_Yx, C, x) + #define GB_Cp_PTR(Cp,C) GB_GET_MATRIX_PTR (Cp, C, p_is_32, p) + #define GB_Ch_PTR(Ch,C) GB_GET_MATRIX_PTR (Ch, C, j_is_32, h) + #define GB_Ci_PTR(Ci,C) GB_GET_MATRIX_PTR (Ci, C, i_is_32, i) #define GB_CPendingi_PTR(Pending_i,C) GB_GET_PENDINGi_PTR (Pending_i, C) #define GB_CPendingj_PTR(Pending_j,C) GB_GET_PENDINGj_PTR (Pending_j, C) // M matrix: - #define GB_Mp_PTR(Mp,M) GB_GET_MATRIX_PTR (Mp, M, p_is_32, p) - #define GB_Mh_PTR(Mh,M) GB_GET_MATRIX_PTR (Mh, M, j_is_32, h) - #define GB_Mi_PTR(Mi,M) GB_GET_MATRIX_PTR (Mi, M, i_is_32, i) - #define GB_MYp_PTR(M_Yp,M) GB_GET_HYPER_PTR (M_Yp, M, p) - #define GB_MYi_PTR(M_Yi,M) GB_GET_HYPER_PTR (M_Yi, M, i) - #define GB_MYx_PTR(M_Yx,M) GB_GET_HYPER_PTR (M_Yx, M, x) + #define GB_Mp_PTR(Mp,M) GB_GET_MATRIX_PTR (Mp, M, p_is_32, p) + #define GB_Mh_PTR(Mh,M) GB_GET_MATRIX_PTR (Mh, M, j_is_32, h) + #define GB_Mi_PTR(Mi,M) GB_GET_MATRIX_PTR (Mi, M, i_is_32, i) // A matrix: - #define GB_Ap_PTR(Ap,A) GB_GET_MATRIX_PTR (Ap, A, p_is_32, p) - #define GB_Ah_PTR(Ah,A) GB_GET_MATRIX_PTR (Ah, A, j_is_32, h) - #define GB_Ai_PTR(Ai,A) GB_GET_MATRIX_PTR (Ai, A, i_is_32, i) - #define GB_AYp_PTR(A_Yp,A) GB_GET_HYPER_PTR (A_Yp, A, p) - #define GB_AYi_PTR(A_Yi,A) GB_GET_HYPER_PTR (A_Yi, A, i) - #define GB_AYx_PTR(A_Yx,A) GB_GET_HYPER_PTR (A_Yx, A, x) + #define GB_Ap_PTR(Ap,A) GB_GET_MATRIX_PTR (Ap, A, p_is_32, p) + #define GB_Ah_PTR(Ah,A) GB_GET_MATRIX_PTR (Ah, A, j_is_32, h) + #define GB_Ai_PTR(Ai,A) GB_GET_MATRIX_PTR (Ai, A, i_is_32, i) // B matrix: - #define GB_Bp_PTR(Bp,B) GB_GET_MATRIX_PTR (Bp, B, p_is_32, p) - #define GB_Bh_PTR(Bh,B) GB_GET_MATRIX_PTR (Bh, B, j_is_32, h) - #define GB_Bi_PTR(Bi,B) GB_GET_MATRIX_PTR (Bi, B, i_is_32, i) - #define GB_BYp_PTR(B_Yp,B) GB_GET_HYPER_PTR (B_Yp, B, p) - #define GB_BYi_PTR(B_Yi,B) GB_GET_HYPER_PTR (B_Yi, B, i) - #define GB_BYx_PTR(B_Yx,B) GB_GET_HYPER_PTR (B_Yx, B, x) + #define GB_Bp_PTR(Bp,B) GB_GET_MATRIX_PTR (Bp, B, p_is_32, p) + #define GB_Bh_PTR(Bh,B) GB_GET_MATRIX_PTR (Bh, B, j_is_32, h) + #define GB_Bi_PTR(Bi,B) GB_GET_MATRIX_PTR (Bi, B, i_is_32, i) // S matrix: - #define GB_Sp_PTR(Sp,S) GB_GET_MATRIX_PTR (Sp, S, p_is_32, p) - #define GB_Sh_PTR(Sh,S) GB_GET_MATRIX_PTR (Sh, S, j_is_32, h) - #define GB_Si_PTR(Si,S) GB_GET_MATRIX_PTR (Si, S, i_is_32, i) - #define GB_SYp_PTR(S_Yp,S) GB_GET_HYPER_PTR (S_Yp, S, p) - #define GB_SYi_PTR(S_Yi,S) GB_GET_HYPER_PTR (S_Yi, S, i) - #define GB_SYx_PTR(S_Yx,S) GB_GET_HYPER_PTR (S_Yx, S, x) + #define GB_Sp_PTR(Sp,S) GB_GET_MATRIX_PTR (Sp, S, p_is_32, p) + #define GB_Sh_PTR(Sh,S) GB_GET_MATRIX_PTR (Sh, S, j_is_32, h) + #define GB_Si_PTR(Si,S) GB_GET_MATRIX_PTR (Si, S, i_is_32, i) // R matrix: - #define GB_Rp_PTR(Rp,R) GB_GET_MATRIX_PTR (Rp, R, p_is_32, p) - #define GB_Rh_PTR(Rh,R) GB_GET_MATRIX_PTR (Rh, R, j_is_32, h) - #define GB_Ri_PTR(Ri,R) GB_GET_MATRIX_PTR (Ri, R, i_is_32, i) + #define GB_Rp_PTR(Rp,R) GB_GET_MATRIX_PTR (Rp, R, p_is_32, p) + #define GB_Rh_PTR(Rh,R) GB_GET_MATRIX_PTR (Rh, R, j_is_32, h) + #define GB_Ri_PTR(Ri,R) GB_GET_MATRIX_PTR (Ri, R, i_is_32, i) // Z matrix: - #define GB_Zp_PTR(Zp,Z) GB_GET_MATRIX_PTR (Zp, Z, p_is_32, p) - #define GB_Zh_PTR(Zh,Z) GB_GET_MATRIX_PTR (Zh, Z, j_is_32, h) - #define GB_Zi_PTR(Zi,Z) GB_GET_MATRIX_PTR (Zi, Z, i_is_32, i) + #define GB_Zp_PTR(Zp,Z) GB_GET_MATRIX_PTR (Zp, Z, p_is_32, p) + #define GB_Zh_PTR(Zh,Z) GB_GET_MATRIX_PTR (Zh, Z, j_is_32, h) + #define GB_Zi_PTR(Zi,Z) GB_GET_MATRIX_PTR (Zi, Z, i_is_32, i) // for getting entries from Ap, Ah, Ai for specific matrices: @@ -867,13 +837,10 @@ struct GB_Matrix_opaque // content of GrB_Matrix // for declaring pointers for specific matrices: // C matrix: - #define GB_Cp_DECLARE(Cp,const) GB_JDECL (Cp, const, u, GB_Cp_BITS) - #define GB_Ch_DECLARE(Ch,const) GB_JDECL (Ch, const, u, GB_Cj_BITS) - #define GB_Ci_DECLARE(Ci,const) GB_JDECL (Ci, const, , GB_Ci_BITS) - #define GB_Ci_DECLARE_U(Ci,const) GB_JDECL (Ci, const, u, GB_Ci_BITS) - #define GB_CYp_DECLARE(C_Yp,const) GB_JDECL (C_Yp,const, u, GB_Cj_BITS) - #define GB_CYi_DECLARE(C_Yi,const) GB_JDECL (C_Yi,const, u, GB_Cj_BITS) - #define GB_CYx_DECLARE(C_Yx,const) GB_JDECL (C_Yx,const, u, GB_Cj_BITS) + #define GB_Cp_DECLARE(Cp,const) GB_JDECL (Cp, const, u, GB_Cp_BITS) + #define GB_Ch_DECLARE(Ch,const) GB_JDECL (Ch, const, u, GB_Cj_BITS) + #define GB_Ci_DECLARE(Ci,const) GB_JDECL (Ci, const, , GB_Ci_BITS) + #define GB_Ci_DECLARE_U(Ci,const) GB_JDECL (Ci, const, u, GB_Ci_BITS) #define GB_CPendingi_DECLARE(Pending_i) \ GB_JDECL (Pending_i, , u, GB_Ci_BITS) #define GB_CPendingj_DECLARE(Pending_j) \ @@ -883,67 +850,55 @@ struct GB_Matrix_opaque // content of GrB_Matrix #define GB_Ci_IS_32 (GB_Ci_BITS == 32) // M matrix: - #define GB_Mp_DECLARE(Mp,const) GB_JDECL (Mp, const, u, GB_Mp_BITS) - #define GB_Mh_DECLARE(Mh,const) GB_JDECL (Mh, const, u, GB_Mj_BITS) - #define GB_Mi_DECLARE(Mi,const) GB_JDECL (Mi, const, , GB_Mi_BITS) - #define GB_Mi_DECLARE_U(Mi,const) GB_JDECL (Mi, const, u, GB_Mi_BITS) - #define GB_MYp_DECLARE(M_Yp,const) GB_JDECL (M_Yp,const, u, GB_Mj_BITS) - #define GB_MYi_DECLARE(M_Yi,const) GB_JDECL (M_Yi,const, u, GB_Mj_BITS) - #define GB_MYx_DECLARE(M_Yx,const) GB_JDECL (M_Yx,const, u, GB_Mj_BITS) + #define GB_Mp_DECLARE(Mp,const) GB_JDECL (Mp, const, u, GB_Mp_BITS) + #define GB_Mh_DECLARE(Mh,const) GB_JDECL (Mh, const, u, GB_Mj_BITS) + #define GB_Mi_DECLARE(Mi,const) GB_JDECL (Mi, const, , GB_Mi_BITS) + #define GB_Mi_DECLARE_U(Mi,const) GB_JDECL (Mi, const, u, GB_Mi_BITS) #define GB_Mp_IS_32 (GB_Mp_BITS == 32) #define GB_Mj_IS_32 (GB_Mj_BITS == 32) #define GB_Mi_IS_32 (GB_Mi_BITS == 32) // A matrix: - #define GB_Ap_DECLARE(Ap,const) GB_JDECL (Ap, const, u, GB_Ap_BITS) - #define GB_Ah_DECLARE(Ah,const) GB_JDECL (Ah, const, u, GB_Aj_BITS) - #define GB_Ai_DECLARE(Ai,const) GB_JDECL (Ai, const, , GB_Ai_BITS) - #define GB_Ai_DECLARE_U(Ai,const) GB_JDECL (Ai, const, u, GB_Ai_BITS) - #define GB_AYp_DECLARE(A_Yp,const) GB_JDECL (A_Yp,const, u, GB_Aj_BITS) - #define GB_AYi_DECLARE(A_Yi,const) GB_JDECL (A_Yi,const, u, GB_Aj_BITS) - #define GB_AYx_DECLARE(A_Yx,const) GB_JDECL (A_Yx,const, u, GB_Aj_BITS) + #define GB_Ap_DECLARE(Ap,const) GB_JDECL (Ap, const, u, GB_Ap_BITS) + #define GB_Ah_DECLARE(Ah,const) GB_JDECL (Ah, const, u, GB_Aj_BITS) + #define GB_Ai_DECLARE(Ai,const) GB_JDECL (Ai, const, , GB_Ai_BITS) + #define GB_Ai_DECLARE_U(Ai,const) GB_JDECL (Ai, const, u, GB_Ai_BITS) #define GB_Ap_IS_32 (GB_Ap_BITS == 32) #define GB_Aj_IS_32 (GB_Aj_BITS == 32) #define GB_Ai_IS_32 (GB_Ai_BITS == 32) // B matrix: - #define GB_Bp_DECLARE(Bp,const) GB_JDECL (Bp, const, u, GB_Bp_BITS) - #define GB_Bh_DECLARE(Bh,const) GB_JDECL (Bh, const, u, GB_Bj_BITS) - #define GB_Bi_DECLARE(Bi,const) GB_JDECL (Bi, const, , GB_Bi_BITS) - #define GB_Bi_DECLARE_U(Bi,const) GB_JDECL (Bi, const, u, GB_Bi_BITS) - #define GB_BYp_DECLARE(B_Yp,const) GB_JDECL (B_Yp,const, u, GB_Bj_BITS) - #define GB_BYi_DECLARE(B_Yi,const) GB_JDECL (B_Yi,const, u, GB_Bj_BITS) - #define GB_BYx_DECLARE(B_Yx,const) GB_JDECL (B_Yx,const, u, GB_Bj_BITS) + #define GB_Bp_DECLARE(Bp,const) GB_JDECL (Bp, const, u, GB_Bp_BITS) + #define GB_Bh_DECLARE(Bh,const) GB_JDECL (Bh, const, u, GB_Bj_BITS) + #define GB_Bi_DECLARE(Bi,const) GB_JDECL (Bi, const, , GB_Bi_BITS) + #define GB_Bi_DECLARE_U(Bi,const) GB_JDECL (Bi, const, u, GB_Bi_BITS) #define GB_Bp_IS_32 (GB_Bp_BITS == 32) #define GB_Bj_IS_32 (GB_Bj_BITS == 32) #define GB_Bi_IS_32 (GB_Bi_BITS == 32) // S matrix: - #define GB_Sp_DECLARE(Sp,const) GB_JDECL (Sp, const, u, GB_Sp_BITS) - #define GB_Sh_DECLARE(Sh,const) GB_JDECL (Sh, const, u, GB_Sj_BITS) - #define GB_Si_DECLARE(Si,const) GB_JDECL (Si, const, , GB_Si_BITS) - #define GB_Si_DECLARE_U(Si,const) GB_JDECL (Si, const, u, GB_Si_BITS) - #define GB_SYp_DECLARE(S_Yp,const) GB_JDECL (S_Yp,const, u, GB_Sj_BITS) - #define GB_SYi_DECLARE(S_Yi,const) GB_JDECL (S_Yi,const, u, GB_Sj_BITS) - #define GB_SYx_DECLARE(S_Yx,const) GB_JDECL (S_Yx,const, u, GB_Sj_BITS) + #define GB_Sp_DECLARE(Sp,const) GB_JDECL (Sp, const, u, GB_Sp_BITS) + #define GB_Sh_DECLARE(Sh,const) GB_JDECL (Sh, const, u, GB_Sj_BITS) + #define GB_Si_DECLARE(Si,const) GB_JDECL (Si, const, , GB_Si_BITS) + #define GB_Si_DECLARE_U(Si,const) GB_JDECL (Si, const, u, GB_Si_BITS) #define GB_Sp_IS_32 (GB_Sp_BITS == 32) #define GB_Sj_IS_32 (GB_Sj_BITS == 32) #define GB_Si_IS_32 (GB_Si_BITS == 32) // R matrix: - #define GB_Rp_DECLARE(Rp,const) GB_JDECL (Rp, const, u, GB_Rp_BITS) - #define GB_Rh_DECLARE(Rh,const) GB_JDECL (Rh, const, u, GB_Rj_BITS) - #define GB_Ri_DECLARE(Ri,const) GB_JDECL (Ri, const, , GB_Ri_BITS) - #define GB_Ri_DECLARE_U(Ri,const) GB_JDECL (Ri, const, u, GB_Ri_BITS) + #define GB_Rp_DECLARE(Rp,const) GB_JDECL (Rp, const, u, GB_Rp_BITS) + #define GB_Rh_DECLARE(Rh,const) GB_JDECL (Rh, const, u, GB_Rj_BITS) + #define GB_Ri_DECLARE(Ri,const) GB_JDECL (Ri, const, , GB_Ri_BITS) + #define GB_Ri_DECLARE_U(Ri,const) GB_JDECL (Ri, const, u, GB_Ri_BITS) #define GB_Rp_IS_32 (GB_Rp_BITS == 32) #define GB_Rj_IS_32 (GB_Rj_BITS == 32) #define GB_Ri_IS_32 (GB_Ri_BITS == 32) // Z matrix: - #define GB_Zp_DECLARE(Zp,const) GB_JDECL (Zp, const, u, GB_Zp_BITS) - #define GB_Zh_DECLARE(Zh,const) GB_JDECL (Zh, const, u, GB_Zj_BITS) - #define GB_Zi_DECLARE(Zi,const) GB_JDECL (Zi, const, , GB_Zi_BITS) - #define GB_Zi_DECLARE_U(Zi,const) GB_JDECL (Zi, const, u, GB_Zi_BITS) + #define GB_Zp_DECLARE(Zp,const) GB_JDECL (Zp, const, u, GB_Zp_BITS) + #define GB_Zh_DECLARE(Zh,const) GB_JDECL (Zh, const, u, GB_Zj_BITS) + #define GB_Zi_DECLARE(Zi,const) GB_JDECL (Zi, const, , GB_Zi_BITS) + #define GB_Zi_DECLARE_U(Zi,const) GB_JDECL (Zi, const, u, GB_Zi_BITS) #define GB_Zp_IS_32 (GB_Zp_BITS == 32) #define GB_Zj_IS_32 (GB_Zj_BITS == 32) #define GB_Zi_IS_32 (GB_Zi_BITS == 32) @@ -951,60 +906,46 @@ struct GB_Matrix_opaque // content of GrB_Matrix // for getting pointers from specific matrices: // C matrix: - #define GB_Cp_PTR(Cp,C) GB_GET_MATRIX_PTR (Cp, C, p) - #define GB_Ch_PTR(Ch,C) GB_GET_MATRIX_PTR (Ch, C, h) - #define GB_Ci_PTR(Ci,C) GB_GET_MATRIX_PTR (Ci, C, i) - #define GB_CYp_PTR(C_Yp,C) GB_GET_HYPER_PTR (C_Yp, C, p) - #define GB_CYi_PTR(C_Yi,C) GB_GET_HYPER_PTR (C_Yi, C, i) - #define GB_CYx_PTR(C_Yx,C) GB_GET_HYPER_PTR (C_Yx, C, x) + #define GB_Cp_PTR(Cp,C) GB_GET_MATRIX_PTR (Cp, C, p) + #define GB_Ch_PTR(Ch,C) GB_GET_MATRIX_PTR (Ch, C, h) + #define GB_Ci_PTR(Ci,C) GB_GET_MATRIX_PTR (Ci, C, i) #define GB_CPendingi_PTR(Pending_i,C) Pending_i = C->Pending->i #define GB_CPendingj_PTR(Pending_j,C) Pending_j = C->Pending->j // M matrix: - #define GB_Mp_PTR(Mp,M) GB_GET_MATRIX_PTR (Mp, M, p) - #define GB_Mh_PTR(Mh,M) GB_GET_MATRIX_PTR (Mh, M, h) - #define GB_Mi_PTR(Mi,M) GB_GET_MATRIX_PTR (Mi, M, i) - #define GB_MYp_PTR(M_Yp,M) GB_GET_HYPER_PTR (M_Yp, M, p) - #define GB_MYi_PTR(M_Yi,M) GB_GET_HYPER_PTR (M_Yi, M, i) - #define GB_MYx_PTR(M_Yx,M) GB_GET_HYPER_PTR (M_Yx, M, x) + #define GB_Mp_PTR(Mp,M) GB_GET_MATRIX_PTR (Mp, M, p) + #define GB_Mh_PTR(Mh,M) GB_GET_MATRIX_PTR (Mh, M, h) + #define GB_Mi_PTR(Mi,M) GB_GET_MATRIX_PTR (Mi, M, i) // A matrix: - #define GB_Ap_PTR(Ap,A) GB_GET_MATRIX_PTR (Ap, A, p) - #define GB_Ah_PTR(Ah,A) GB_GET_MATRIX_PTR (Ah, A, h) - #define GB_Ai_PTR(Ai,A) GB_GET_MATRIX_PTR (Ai, A, i) - #define GB_AYp_PTR(A_Yp,A) GB_GET_HYPER_PTR (A_Yp, A, p) - #define GB_AYi_PTR(A_Yi,A) GB_GET_HYPER_PTR (A_Yi, A, i) - #define GB_AYx_PTR(A_Yx,A) GB_GET_HYPER_PTR (A_Yx, A, x) + #define GB_Ap_PTR(Ap,A) GB_GET_MATRIX_PTR (Ap, A, p) + #define GB_Ah_PTR(Ah,A) GB_GET_MATRIX_PTR (Ah, A, h) + #define GB_Ai_PTR(Ai,A) GB_GET_MATRIX_PTR (Ai, A, i) // B matrix: - #define GB_Bp_PTR(Bp,B) GB_GET_MATRIX_PTR (Bp, B, p) - #define GB_Bh_PTR(Bh,B) GB_GET_MATRIX_PTR (Bh, B, h) - #define GB_Bi_PTR(Bi,B) GB_GET_MATRIX_PTR (Bi, B, i) - #define GB_BYp_PTR(B_Yp,B) GB_GET_HYPER_PTR (B_Yp, B, p) - #define GB_BYi_PTR(B_Yi,B) GB_GET_HYPER_PTR (B_Yi, B, i) - #define GB_BYx_PTR(B_Yx,B) GB_GET_HYPER_PTR (B_Yx, B, x) + #define GB_Bp_PTR(Bp,B) GB_GET_MATRIX_PTR (Bp, B, p) + #define GB_Bh_PTR(Bh,B) GB_GET_MATRIX_PTR (Bh, B, h) + #define GB_Bi_PTR(Bi,B) GB_GET_MATRIX_PTR (Bi, B, i) // S matrix: - #define GB_Sp_PTR(Sp,S) GB_GET_MATRIX_PTR (Sp, S, p) - #define GB_Sh_PTR(Sh,S) GB_GET_MATRIX_PTR (Sh, S, h) - #define GB_Si_PTR(Si,S) GB_GET_MATRIX_PTR (Si, S, i) - #define GB_SYp_PTR(S_Yp,S) GB_GET_HYPER_PTR (S_Yp, S, p) - #define GB_SYi_PTR(S_Yi,S) GB_GET_HYPER_PTR (S_Yi, S, i) - #define GB_SYx_PTR(S_Yx,S) GB_GET_HYPER_PTR (S_Yx, S, x) + #define GB_Sp_PTR(Sp,S) GB_GET_MATRIX_PTR (Sp, S, p) + #define GB_Sh_PTR(Sh,S) GB_GET_MATRIX_PTR (Sh, S, h) + #define GB_Si_PTR(Si,S) GB_GET_MATRIX_PTR (Si, S, i) // R matrix: - #define GB_Rp_PTR(Rp,R) GB_GET_MATRIX_PTR (Rp, R, p) - #define GB_Rh_PTR(Rh,R) GB_GET_MATRIX_PTR (Rh, R, h) - #define GB_Ri_PTR(Ri,R) GB_GET_MATRIX_PTR (Ri, R, i) + #define GB_Rp_PTR(Rp,R) GB_GET_MATRIX_PTR (Rp, R, p) + #define GB_Rh_PTR(Rh,R) GB_GET_MATRIX_PTR (Rh, R, h) + #define GB_Ri_PTR(Ri,R) GB_GET_MATRIX_PTR (Ri, R, i) // Z matrix: - #define GB_Zp_PTR(Zp,Z) GB_GET_MATRIX_PTR (Zp, Z, p) - #define GB_Zh_PTR(Zh,Z) GB_GET_MATRIX_PTR (Zh, Z, h) - #define GB_Zi_PTR(Zi,Z) GB_GET_MATRIX_PTR (Zi, Z, i) + #define GB_Zp_PTR(Zp,Z) GB_GET_MATRIX_PTR (Zp, Z, p) + #define GB_Zh_PTR(Zh,Z) GB_GET_MATRIX_PTR (Zh, Z, h) + #define GB_Zi_PTR(Zi,Z) GB_GET_MATRIX_PTR (Zi, Z, i) // for getting entries from Ap, Ah, Ai for specific matrices: - // These must be #define'd in each JIT kernel, via GB_macrofy_* + // These must be #define'd in each JIT kernel, via GB_macrofy_sparsity + // and GB_macrofy_nvals. #endif diff --git a/GraphBLAS/Source/dup/GB_dup.c b/GraphBLAS/Source/dup/GB_dup.c index 912c1fef1..67ede5f63 100644 --- a/GraphBLAS/Source/dup/GB_dup.c +++ b/GraphBLAS/Source/dup/GB_dup.c @@ -12,18 +12,17 @@ // if numeric is false, C->x is allocated but not initialized. +// Pending work in A is copied into C; it is not finished. + // There is little use for the following feature, but (*Chandle) and A might be // identical, with GrB_dup (&A, A). The input matrix A will be lost, and will // result in a memory leak, unless the user application does the following // (which is valid and memory-leak free): -// B = A ; - -// GrB_dup (&A, A) ; - -// GrB_free (&A) ; - -// GrB_free (&B) ; +// B = A ; +// GrB_dup (&A, A) ; +// GrB_free (&A) ; +// GrB_free (&B) ; // A is the new copy and B is the old copy. Each should be freed when done. @@ -47,12 +46,6 @@ GrB_Info GB_dup // make an exact copy of a matrix ASSERT_MATRIX_OK (A, "A to duplicate", GB0) ; (*Chandle) = NULL ; - //-------------------------------------------------------------------------- - // delete any lingering zombies and assemble any pending tuples - //-------------------------------------------------------------------------- - - GB_MATRIX_WAIT (A) ; - //-------------------------------------------------------------------------- // C = A //-------------------------------------------------------------------------- diff --git a/GraphBLAS/Source/dup/GB_dup_worker.c b/GraphBLAS/Source/dup/GB_dup_worker.c index cd004af00..8fba2d499 100644 --- a/GraphBLAS/Source/dup/GB_dup_worker.c +++ b/GraphBLAS/Source/dup/GB_dup_worker.c @@ -14,8 +14,13 @@ // If *Chandle is not NULL on input, the header is reused. It may be a static // or dynamic header, depending on C->header_size. +// The input matrix A can include any pending work (pending tuples, zombies, +// or jumbled). The pending work is copied into the output matrix C. It is +// not finished. This case is only supported if numeric is true. + #include "GB.h" #include "get_set/GB_get_set.h" +#include "pending/GB_Pending.h" #define GB_FREE_ALL \ GB_FREE_MEMORY (&C_user_name, C_user_name_size) ; @@ -38,7 +43,7 @@ GrB_Info GB_dup_worker // make an exact copy of a matrix GrB_Info info ; ASSERT_MATRIX_OK (A, "A to duplicate", GB0) ; ASSERT (Chandle != NULL) ; - ASSERT (!GB_PENDING (A)) ; + ASSERT (GB_PENDING_OK (A)) ; ASSERT (GB_JUMBLED_OK (A)) ; ASSERT (GB_ZOMBIES_OK (A)) ; @@ -49,9 +54,12 @@ GrB_Info GB_dup_worker // make an exact copy of a matrix int nthreads_max = GB_Context_nthreads_max ( ) ; //-------------------------------------------------------------------------- - // get A + // get A and C //-------------------------------------------------------------------------- + GrB_Matrix C = (*Chandle) ; + bool preexisting_header = (C != NULL) ; + int64_t anz = GB_nnz_held (A) ; int64_t anvec = A->nvec ; int64_t anvals = A->nvals ; @@ -60,6 +68,7 @@ GrB_Info GB_dup_worker // make an exact copy of a matrix bool A_jumbled = A->jumbled ; int sparsity_control = A->sparsity_control ; GrB_Type atype = A->type ; + GB_Pending A_Pending = A->Pending ; //-------------------------------------------------------------------------- // copy the user_name of A, if present @@ -87,19 +96,40 @@ GrB_Info GB_dup_worker // make an exact copy of a matrix // allocate a new user header for C if (*Chandle) is NULL, or reuse the // existing static or dynamic header if (*Chandle) is not NULL. - GrB_Matrix C = (*Chandle) ; GB_OK (GB_new_bix (Chandle, // can be new or existing header numeric ? atype : ctype, A->vlen, A->vdim, GB_ph_malloc, A->is_csc, GB_sparsity (A), false, A->hyper_switch, A->plen, anz, true, C_iso, A->p_is_32, A->j_is_32, A->i_is_32)) ; C = (*Chandle) ; + //-------------------------------------------------------------------------- + // allocate the pending tuples, if present + //-------------------------------------------------------------------------- + + if (A_Pending != NULL && numeric) + { + // A has pending tuples; allocate space for them in C. This case is + // only supported if numeric is true. + ASSERT (C_iso == A->iso) ; + if (!GB_Pending_alloc (C, A->iso, A_Pending->type, A_Pending->op, + A_Pending->nmax)) + { + // out of memory + GB_FREE_ALL ; + GB_phybix_free (C) ; + if (!preexisting_header) + { + GB_Matrix_free (Chandle) ; + } + return (GrB_OUT_OF_MEMORY) ; + } + } + //-------------------------------------------------------------------------- // copy the contents of A into C //-------------------------------------------------------------------------- C->nvec = anvec ; -// C->nvec_nonempty = anvec_nonempty ; GB_nvec_nonempty_set (C, anvec_nonempty) ; C->nvals = anvals ; C->jumbled = A_jumbled ; // C is jumbled if A is jumbled @@ -133,7 +163,36 @@ GrB_Info GB_dup_worker // make an exact copy of a matrix GB_memcpy (C->x, A->x, (A->iso ? 1:anz) * atype->size, nthreads_max) ; } - C->magic = GB_MAGIC ; // C->p and C->h are now initialized + //-------------------------------------------------------------------------- + // copy the pending tuples + //-------------------------------------------------------------------------- + + if (A_Pending != NULL && numeric) + { + GB_Pending C_Pending = C->Pending ; + int64_t n = A_Pending->n ; + bool is_matrix = (A->vdim > 1) ; + size_t jsize = (A->j_is_32) ? sizeof (uint32_t) : sizeof (uint64_t) ; + size_t isize = (A->i_is_32) ? sizeof (uint32_t) : sizeof (uint64_t) ; + size_t xsize = A_Pending->size ; + GB_memcpy (C_Pending->i, A_Pending->i, n * isize, nthreads_max) ; + if (is_matrix) + { + GB_memcpy (C_Pending->j, A_Pending->j, n * jsize, nthreads_max) ; + } + if (!A->iso) + { + GB_memcpy (C_Pending->x, A_Pending->x, n * xsize, nthreads_max) ; + } + C_Pending->n = n ; + C_Pending->sorted = A_Pending->sorted ; + } + + //-------------------------------------------------------------------------- + // C->p and C->h are now initialized + //-------------------------------------------------------------------------- + + C->magic = GB_MAGIC ; //-------------------------------------------------------------------------- // copy the user_name of A into C, if present @@ -141,6 +200,8 @@ GrB_Info GB_dup_worker // make an exact copy of a matrix C->user_name = C_user_name ; C->user_name_size = C_user_name_size ; + C_user_name = NULL ; + C_user_name_size = 0 ; //-------------------------------------------------------------------------- // return the result diff --git a/GraphBLAS/Source/extract/GB_I_inverse.c b/GraphBLAS/Source/extract/GB_I_inverse.c index 6a54f6273..107bce68a 100644 --- a/GraphBLAS/Source/extract/GB_I_inverse.c +++ b/GraphBLAS/Source/extract/GB_I_inverse.c @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -// GB_I_inverse: invert an index list +// GB_I_inverse: invert an index list, by constructing R = inverse (I) //------------------------------------------------------------------------------ // SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2025, All Rights Reserved. @@ -8,16 +8,25 @@ //------------------------------------------------------------------------------ // I is a large list relative to the vector length, avlen, and it is not -// contiguous. Scatter I into the I inverse buckets (Ihead and Inext) for quick -// lookup. +// contiguous. Construct the matrix R to hold the inverse of the I list for +// quick lookup. If i = I [k1], i = I [k2], and i = I [k3], then row i of the +// R matrix holds entries in columns k1, k2, and k3. R is iso-valued and held +// by row. If R has enough entries, it is converted to sparse. Otherwise, the +// hyper_hash R->Y is constructed to enable fast lookup of R(i,:). + +#define GB_FREE_WORKSPACE \ +{ \ + GB_FREE_MEMORY (&W, W_size) ; \ +} -// FUTURE:: this code is sequential. Constructing the I inverse buckets in -// parallel would require synchronization (a critical section for each bucket, -// or atomics). A more parallel approach might use qsort first, to find -// duplicates in I, and then construct the buckets in parallel after the qsort. -// But the time complexity would be higher. +#define GB_FREE_ALL \ +{ \ + GB_FREE_WORKSPACE ; \ + GB_Matrix_free (&R) ; \ +} #include "extract/GB_subref.h" +#include "builder/GB_build.h" GrB_Info GB_I_inverse // invert the I list for C=A(I,:) ( @@ -26,12 +35,7 @@ GrB_Info GB_I_inverse // invert the I list for C=A(I,:) int64_t nI, // length of I int64_t avlen, // length of the vectors of A // outputs: - void **p_Ihead, // head pointers for buckets, size avlen - size_t *p_Ihead_size, - void **p_Inext, // next pointers for buckets, size nI - size_t *p_Inext_size, - bool *p_Ihead_is_32, // if true, Ihead and Inext are 32-bit; else 64 - int64_t *p_nduplicates, // number of duplicate entries in I + GrB_Matrix *R_handle, // R = inverse (I) GB_Werk Werk ) { @@ -40,104 +44,178 @@ GrB_Info GB_I_inverse // invert the I list for C=A(I,:) // get inputs //-------------------------------------------------------------------------- - GB_MDECL (Ihead, , u) ; size_t Ihead_size = 0 ; - GB_MDECL (Inext, , u) ; size_t Inext_size = 0 ; - int64_t nduplicates = 0 ; - - (*p_Ihead) = NULL ; (*p_Ihead_size) = 0 ; - (*p_Inext) = NULL ; (*p_Inext_size) = 0 ; - (*p_nduplicates) = 0 ; - + GrB_Info info = GrB_SUCCESS ; + GrB_Matrix R = NULL ; + GB_MDECL (W, , u) ; size_t W_size = 0 ; + (*R_handle) = NULL ; GB_IDECL (I, const, u) ; GB_IPTR (I, I_is_32) ; //-------------------------------------------------------------------------- - // allocate workspace + // construct R matrix to hold the inverse of I //-------------------------------------------------------------------------- - // Entries in Ihead and Inext range in value from 0 to nI. Entries equal - // to nI or larger are invalid indices, need to tag the end of each bucket. - // Thus - - bool Ihead_is_32 = (nI < UINT32_MAX) ; - size_t isize = (Ihead_is_32) ? sizeof (uint32_t) : sizeof (uint64_t) ; - - Ihead = GB_MALLOC_MEMORY (avlen, isize, &Ihead_size) ; - Inext = GB_MALLOC_MEMORY (nI, isize, &Inext_size) ; - if (Inext == NULL || Ihead == NULL) + int64_t rvdim = avlen ; + int64_t rvlen = nI ; + int64_t rnvals = nI ; + bool Rp_is_32, Rj_is_32, Ri_is_32 ; + GB_determine_pji_is_32 (&Rp_is_32, &Rj_is_32, &Ri_is_32, + GxB_HYPERSPARSE, rnvals, rvlen, rvdim, Werk) ; + + bool W_is_32 = (nI < INT32_MAX) ; + size_t wsize = (W_is_32) ? sizeof (uint32_t) : sizeof (uint64_t) ; + W = GB_MALLOC_MEMORY (nI, wsize, &W_size) ; + if (W == NULL) { // out of memory - GB_FREE_MEMORY (&Ihead, Ihead_size) ; - GB_FREE_MEMORY (&Inext, Inext_size) ; + GB_FREE_ALL ; return (GrB_OUT_OF_MEMORY) ; } - // set all entries of Ihead to UINT*_MAX (32-bit or 64-bit) - int nthreads_max = GB_Context_nthreads_max ( ) ; - GB_memset (Ihead, 0xFF, Ihead_size, nthreads_max) ; + GB_IPTR (W, W_is_32) ; + for (int64_t k = 0 ; k < nI ; k++) + { + // W [k] = k + GB_ISET (W, k, k) ; + } - GB_IPTR (Ihead, Ihead_is_32) ; - GB_IPTR (Inext, Ihead_is_32) ; + // create R: rvdim-by-rvlen (avlen-by-nI), held by row, iso-valued + GB_OK (GB_new (&R, // new dynamic header, do not allocate content + GrB_UINT64, rvlen, rvdim, GB_ph_null, false, GxB_HYPERSPARSE, -1, 0, + Rp_is_32, Rj_is_32, Ri_is_32)) ; + + uint64_t S_input [1] ; + S_input [0] = 1 ; + + void *no_I_work = NULL ; size_t I_work_size = 0 ; + void *no_J_work = NULL ; size_t J_work_size = 0 ; + GB_void *no_X_work = NULL ; size_t X_work_size = 0 ; + + GB_OK (GB_builder ( + // T + R, // matrix to build, R of size rvdim-by-rvlen + // ttype + GrB_UINT64, // type of R (iso-valued) + // vlen + rvlen, // length of each vector of R (= nI) + // vdim + rvdim, // number of vectors of R (= avlen) + // is_csc + false, // R is CSR + // I_work_handle and size + &no_I_work, &I_work_size, // I_work not used + // J_work_handle and size + &no_J_work, &J_work_size, // J_work not used + // X_work_handle and size + &no_X_work, &X_work_size, // X_work not used + // known_sorted + false, // tuples might not be sorted + // known_no_duplicates + true, // no duplicates are present (W is unique) + // isjlen + nI, // size of I and W arrays + // is_matrix + true, // R is a matrix + // I_input + W, // column indices are W [0..nI-1] = (0:nI-1) + // J_input + I, // row indices are in I [0..nI-1] + // S_input + S_input, // values of R (iso-valued) + // S_iso + true, // R is iso-valued + // nvals + rnvals, // # of tuples in R (= nI) + // dup operator + NULL, // no dup operator + // stype + GrB_UINT64, // type of S_input + // do_burble + true, // allow burble + Werk, + W_is_32, // true if W is 32-bit, false if 64 + I_is_32, // true if I is 32-bit, false if 64 + Rp_is_32, // true if R->p is built as 32-bit, false if 64 + Rj_is_32, // true if R->h is built as 32-bit, false if 64 + Ri_is_32 // true if R->i is built as 32-bit, false if 64 + )) ; + + // R is hypersparse; convert to sparse if possible + ASSERT (GB_IS_HYPERSPARSE (R)) ; + // if needed, the # of duplicates in I is (nI - R->nvec) + if (rvdim < 32 * R->nvec) + { + // R is rvdim-by-rvlen in hypersparse CSR format. Determine if it + // should be held in a sparse format instead of hypersparse. R takes + // O(rnvals) memory as hypersparse and O(rnvals+rvdim) as sparse. + // Switch R to sparse format if rvdim is small enough. + GB_OK (GB_convert_hyper_to_sparse (R, true)) ; + } + else + { + // Keep R as hypersparse, but build its R->Y hyper_hash matrix + GB_OK (GB_hyper_hash_build (R, Werk)) ; + } //-------------------------------------------------------------------------- - // scatter the I indices into buckets + // check result //-------------------------------------------------------------------------- - // At this point, Ihead [0..avlen-1] >= nI = UINT64_MAX. - - // O(nI) time; not parallel - for (int64_t inew = nI-1 ; inew >= 0 ; inew--) - { - int64_t i = GB_IGET (I, inew) ; - ASSERT (i >= 0 && i < avlen) ; - int64_t ihead = GB_IGET (Ihead, i) ; - if (ihead < nI) - { - // i has already been seen in the list I - nduplicates++ ; - } - GB_ISET (Ihead, i, inew) ; // Ihead [i] = inew ; - GB_ISET (Inext, inew, ihead) ; // Inext [inew] = ihead ; - } - - // indices in I are now in buckets. An index i might appear more than once - // in the list I. inew = Ihead [i] is the first position of i in I (i will - // be I [inew]), Ihead [i] is the head of a link list of all places where i - // appears in I. inew = Inext [inew] traverses this list, until inew is >= - // nI, which denotes the end of the bucket. - - // to traverse all entries in bucket i, do: - // GB_for_each_index_in_bucket (inew,i,nI,Ihead,Inext) { ... } - - #define GB_for_each_index_in_bucket(inew,i,nI,Ihead,Inext) \ - for (uint64_t inew = GB_IGET (Ihead, i) ; \ - inew < nI ; \ - inew = GB_IGET (Inext, inew)) - - // If Ihead [i] > nI, then the ith bucket is empty and i is not in I. - // Otherise, the first index in bucket i is Ihead [i]. - #ifdef GB_DEBUG - for (int64_t i = 0 ; i < avlen ; i++) { - GB_for_each_index_in_bucket (inew, i, nI, Ihead, Inext) + // this test can take a very long time if A is hypersparse and + // avlen is huge + bool R_is_hyper = GB_IS_HYPERSPARSE (R) ; + int64_t rnvec = R->nvec ; + void *Rp = R->p ; + void *Rh = R->h ; + void *Ri = R->i ; + GB_IDECL (Rp, const, u) ; GB_IPTR (Rp, Rp_is_32) ; + GB_IDECL (Rh, const, u) ; GB_IPTR (Rh, Rj_is_32) ; + GB_IDECL (Ri, const, u) ; GB_IPTR (Ri, Ri_is_32) ; + GrB_Matrix R_Y = R->Y ; + void *R_Yp = R_Y ? R_Y->p : NULL ; + void *R_Yi = R_Y ? R_Y->i : NULL ; + void *R_Yx = R_Y ? R_Y->x : NULL ; + int64_t R_hash_bits = R_Y ? (R_Y->vdim - 1) : 0 ; + for (int64_t i = 0 ; i < avlen ; i++) { - // inew is the new index in C, and i is the index in A. - // All entries in the ith bucket refer to the same row A(i,:), - // but with different indices C (inew,:) in C. - ASSERT (inew >= 0 && inew < nI) ; - ASSERT (i == GB_IGET (I, inew)) ; + // find R(i,:), which contains one column index inew for each + // position in I where i occurs (i == I [inew]) + int64_t pR, pR_end ; + if (R_is_hyper) + { + // R(i,:) is the kth vector in the hypersparse matrix R; + // find k so that i = Rh [k] using the R->Y hyper_hash, + // and set pR = Rp [k] and pR_end = Rp [k+1]. + GB_hyper_hash_lookup (Rp_is_32, Rj_is_32, + Rh, rnvec, Rp, R_Yp, R_Yi, R_Yx, R_hash_bits, + i, &pR, &pR_end) ; + } + else + { + // R(i,:) is the ith vector in the sparse matrix R + pR = GB_IGET (Rp, i) ; // pR = Rp [i] + pR_end = GB_IGET (Rp, i+1) ; // pR_end = Rp [i+1] + } + // for each entry in the row R(i,:) + for (int64_t p = pR ; p < pR_end ; p++) + { + // get R(i,inew); this is the index i = I [inew] + int64_t inew = GB_IGET (Ri, p) ; // inew = Ri [p] + ASSERT (inew >= 0 && inew < nI) ; + ASSERT (i == GB_IGET (I, inew)) ; + } } } #endif //-------------------------------------------------------------------------- - // return result + // free workspace and return result //-------------------------------------------------------------------------- - (*p_Ihead) = Ihead ; (*p_Ihead_size) = Ihead_size ; - (*p_Inext) = Inext ; (*p_Inext_size) = Inext_size ; - (*p_Ihead_is_32) = Ihead_is_32 ; - (*p_nduplicates) = nduplicates ; + GB_FREE_WORKSPACE ; + ASSERT_MATRIX_OK (R, "R = I_inverse matrix", GB2) ; + (*R_handle) = R ; return (GrB_SUCCESS) ; } diff --git a/GraphBLAS/Source/extract/GB_subref.c b/GraphBLAS/Source/extract/GB_subref.c index cb7e4f4e8..efcef41a1 100644 --- a/GraphBLAS/Source/extract/GB_subref.c +++ b/GraphBLAS/Source/extract/GB_subref.c @@ -72,20 +72,19 @@ #define GB_FREE_WORKSPACE \ { \ - GB_FREE_MEMORY (&TaskList, TaskList_size) ; \ - GB_FREE_MEMORY (&Ap_start, Ap_start_size) ; \ - GB_FREE_MEMORY (&Ap_end, Ap_end_size) ; \ - GB_FREE_MEMORY (&Ihead, Ihead_size) ; \ - GB_FREE_MEMORY (&Inext, Inext_size) ; \ - GB_FREE_MEMORY (&Cwork, Cwork_size) ; \ + GB_FREE_MEMORY (&TaskList, TaskList_size) ; \ + GB_FREE_MEMORY (&Ap_start, Ap_start_size) ; \ + GB_FREE_MEMORY (&Ap_end, Ap_end_size) ; \ + GB_FREE_MEMORY (&Cwork, Cwork_size) ; \ + GB_Matrix_free (&R) ; \ } -#define GB_FREE_ALL \ -{ \ - GB_FREE_MEMORY (&Cp, Cp_size) ; \ - GB_FREE_MEMORY (&Ch, Ch_size) ; \ - GB_phybix_free (C) ; \ - GB_FREE_WORKSPACE ; \ +#define GB_FREE_ALL \ +{ \ + GB_FREE_MEMORY (&Cp, Cp_size) ; \ + GB_FREE_MEMORY (&Ch, Ch_size) ; \ + GB_phybix_free (C) ; \ + GB_FREE_WORKSPACE ; \ } #include "extract/GB_subref.h" @@ -185,13 +184,12 @@ GrB_Info GB_subref // C = A(I,J): either symbolic or numeric void *Ch = NULL ; size_t Ch_size = 0 ; void *Ap_start = NULL ; size_t Ap_start_size = 0 ; void *Ap_end = NULL ; size_t Ap_end_size = 0 ; - void *Ihead = NULL ; size_t Ihead_size = 0 ; - void *Inext = NULL ; size_t Inext_size = 0 ; uint64_t *Cwork = NULL ; size_t Cwork_size = 0 ; GB_task_struct *TaskList = NULL ; size_t TaskList_size = 0 ; - int64_t Cnvec = 0, nI = 0, nJ, Icolon [3], Cnvec_nonempty, ndupl ; - bool post_sort, need_qsort, Cp_is_32, Cj_is_32, Ci_is_32, Ihead_is_32 ; + int64_t Cnvec = 0, nI = 0, nJ, Icolon [3], Cnvec_nonempty ; + bool post_sort, need_qsort, Cp_is_32, Cj_is_32, Ci_is_32 ; int Ikind, ntasks, nthreads ; + GrB_Matrix R = NULL ; //-------------------------------------------------------------------------- // ensure A is unjumbled @@ -224,8 +222,7 @@ GrB_Info GB_subref // C = A(I,J): either symbolic or numeric GB_OK (GB_subref_slice ( // computed by phase1: &TaskList, &TaskList_size, &ntasks, &nthreads, &post_sort, - &Ihead, &Ihead_size, &Inext, &Inext_size, &Ihead_is_32, - &ndupl, &Cwork, &Cwork_size, + &R, &Cwork, &Cwork_size, // computed by phase0: Ap_start, Ap_end, Cnvec, need_qsort, Ikind, nI, Icolon, // original input: @@ -239,8 +236,7 @@ GrB_Info GB_subref // C = A(I,J): either symbolic or numeric // computed by phase2: &Cp, &Cp_is_32, &Cp_size, &Cnvec_nonempty, // computed by phase1: - TaskList, ntasks, nthreads, Ihead, Inext, Ihead_is_32, - ndupl > 0, &Cwork, Cwork_size, + TaskList, ntasks, nthreads, R, &Cwork, Cwork_size, // computed by phase0: Ap_start, Ap_end, Cnvec, need_qsort, Ikind, nI, Icolon, nJ, // original input: @@ -256,7 +252,7 @@ GrB_Info GB_subref // C = A(I,J): either symbolic or numeric // from phase2: &Cp, Cp_is_32, Cp_size, Cnvec_nonempty, // from phase1: - TaskList, ntasks, nthreads, post_sort, Ihead, Inext, Ihead_is_32, ndupl, + TaskList, ntasks, nthreads, post_sort, R, // from phase0: &Ch, Cj_is_32, Ci_is_32, Ch_size, Ap_start, Ap_end, Cnvec, need_qsort, Ikind, nI, Icolon, nJ, diff --git a/GraphBLAS/Source/extract/GB_subref.h b/GraphBLAS/Source/extract/GB_subref.h index ff12b5563..5f990a262 100644 --- a/GraphBLAS/Source/extract/GB_subref.h +++ b/GraphBLAS/Source/extract/GB_subref.h @@ -65,12 +65,7 @@ GrB_Info GB_I_inverse // invert the I list for C=A(I,:) int64_t nI, // length of I int64_t avlen, // length of the vectors of A // outputs: - void **p_Ihead, // head pointers for buckets, size avlen - size_t *p_Ihead_size, - void **p_Inext, // next pointers for buckets, size nI - size_t *p_Inext_size, - bool *p_Ihead_is_32, // if true, Ihead and Inext are 32-bit; else 64 - int64_t *p_nduplicates, // number of duplicate entries in I + GrB_Matrix *R_handle, // R = inverse (I) GB_Werk Werk ) ; @@ -82,12 +77,7 @@ GrB_Info GB_subref_slice // phase 1 of GB_subref int *p_ntasks, // # of tasks constructed int *p_nthreads, // # of threads for subref operation bool *p_post_sort, // true if a final post-sort is needed - void **p_Ihead, // for I inverse, if needed; size avlen - size_t *p_Ihead_size, - void **p_Inext, // for I inverse, if needed; size nI - size_t *p_Inext_size, - bool *p_Ihead_is_32, // if true, Ihead and Inext are 32-bit; else 64 - int64_t *p_nduplicates, // # of duplicates, if I inverse computed + GrB_Matrix *R_handle, // R = inverse (I), if needed uint64_t **p_Cwork, // workspace of size max(2,C->nvec+1) size_t *p_Cwork_size, // from phase0: @@ -118,10 +108,7 @@ GrB_Info GB_subref_phase2 // count nnz in each C(:,j) GB_task_struct *restrict TaskList, // array of structs const int ntasks, // # of tasks const int nthreads, // # of threads to use - const void *Ihead, // for I inverse buckets, size A->vlen - const void *Inext, // for I inverse buckets, size nI - const bool Ihead_is_32, // if true, Ihead,Inext 32-bit; else 64 - const bool I_has_duplicates, // true if I has duplicates + const GrB_Matrix R, // R = inverse (I), if needed uint64_t **p_Cwork, // workspace of size max(2,C->nvec+1) size_t Cwork_size, // analysis from phase0: @@ -154,10 +141,7 @@ GrB_Info GB_subref_phase3 // C=A(I,J) const int ntasks, // # of tasks const int nthreads, // # of threads to use const bool post_sort, // true if post-sort needed - const void *Ihead, // for I inverse buckets, size A->vlen - const void *Inext, // for I inverse buckets, size nI - const bool Ihead_is_32, // if true, Ihead,Inext 32-bit; else 64 - const bool I_has_duplicates, // true if I has duplicates + const GrB_Matrix R, // R = inverse (I), if needed // from phase0: void **Ch_handle, const bool Cj_is_32, // if true, C->h is 32-bit; else 64-bit diff --git a/GraphBLAS/Source/extract/GB_subref_phase0.c b/GraphBLAS/Source/extract/GB_subref_phase0.c index 4d177affe..6881c3f38 100644 --- a/GraphBLAS/Source/extract/GB_subref_phase0.c +++ b/GraphBLAS/Source/extract/GB_subref_phase0.c @@ -190,12 +190,12 @@ static inline void GB_find_Ap_start_end GB_WERK_POP (Count, uint64_t) ; \ } -#define GB_FREE_ALL \ -{ \ - GB_FREE_WORKSPACE ; \ - GB_FREE_MEMORY (&Ch, Ch_size) ; \ - GB_FREE_MEMORY (&Ap_start, Ap_start_size) ; \ - GB_FREE_MEMORY (&Ap_end, Ap_end_size) ; \ +#define GB_FREE_ALL \ +{ \ + GB_FREE_WORKSPACE ; \ + GB_FREE_MEMORY (&Ch, Ch_size) ; \ + GB_FREE_MEMORY (&Ap_start, Ap_start_size) ; \ + GB_FREE_MEMORY (&Ap_end, Ap_end_size) ; \ } GrB_Info GB_subref_phase0 diff --git a/GraphBLAS/Source/extract/GB_subref_phase2.c b/GraphBLAS/Source/extract/GB_subref_phase2.c index 818522ff7..c2260004f 100644 --- a/GraphBLAS/Source/extract/GB_subref_phase2.c +++ b/GraphBLAS/Source/extract/GB_subref_phase2.c @@ -26,10 +26,7 @@ GrB_Info GB_subref_phase2 // count nnz in each C(:,j) GB_task_struct *restrict TaskList, // array of structs const int ntasks, // # of tasks const int nthreads, // # of threads to use - const void *Ihead, // for I inverse buckets, size A->vlen - const void *Inext, // for I inverse buckets, size nI - const bool Ihead_is_32, // if true, Ihead,Inext 32-bit; else 64 - const bool I_has_duplicates, // true if I has duplicates + const GrB_Matrix R, // R = inverse (I), if needed uint64_t **p_Cwork, // workspace of size max(2,C->nvec+1) size_t Cwork_size, // analysis from phase0: @@ -62,8 +59,39 @@ GrB_Info GB_subref_phase2 // count nnz in each C(:,j) GB_IDECL (I , const, u) ; GB_IPTR (I , I_is_32) ; GB_IDECL (Ap_start, const, u) ; GB_IPTR (Ap_start, A->p_is_32) ; GB_IDECL (Ap_end , const, u) ; GB_IPTR (Ap_end , A->p_is_32) ; - GB_IDECL (Ihead , const, u) ; GB_IPTR (Ihead , Ihead_is_32) ; - GB_IDECL (Inext , const, u) ; GB_IPTR (Inext , Ihead_is_32) ; + + bool R_is_hyper = false ; + int64_t rnvec = 0, R_hash_bits = 0 ; + void *Rp = NULL, *Rh = NULL, *Ri = NULL ; + void *R_Yp = NULL, *R_Yi = NULL, *R_Yx = NULL ; + bool Rp_is_32 = false ; + bool Rj_is_32 = false ; + bool Ri_is_32 = false ; + GB_IDECL (Rp, const, u) ; + GB_IDECL (Rh, const, u) ; + GB_IDECL (Ri, const, u) ; + if (R != NULL) + { + R_is_hyper = GB_IS_HYPERSPARSE (R) ; + rnvec = R->nvec ; + Rp = R->p ; + Rh = R->h ; + Ri = R->i ; + GB_IPTR (Rp, R->p_is_32) ; + GB_IPTR (Rh, R->j_is_32) ; + GB_IPTR (Ri, R->i_is_32) ; + Rp_is_32 = R->p_is_32 ; + Rj_is_32 = R->j_is_32 ; + Ri_is_32 = R->i_is_32 ; + GrB_Matrix R_Y = R->Y ; + if (R_Y != NULL) + { + R_Yp = R_Y->p ; + R_Yi = R_Y->i ; + R_Yx = R_Y->x ; + R_hash_bits = (R_Y->vdim - 1) ; + } + } (*Cp_handle) = NULL ; (*Cp_size_handle) = 0 ; @@ -97,7 +125,6 @@ GrB_Info GB_subref_phase2 // count nnz in each C(:,j) #define GB_I_KIND Ikind #define GB_NEED_QSORT need_qsort - #define GB_I_HAS_DUPLICATES I_has_duplicates #define GB_ANALYSIS_PHASE if (symbolic) diff --git a/GraphBLAS/Source/extract/GB_subref_phase3.c b/GraphBLAS/Source/extract/GB_subref_phase3.c index 43112d366..4e39916b2 100644 --- a/GraphBLAS/Source/extract/GB_subref_phase3.c +++ b/GraphBLAS/Source/extract/GB_subref_phase3.c @@ -27,10 +27,7 @@ GrB_Info GB_subref_phase3 // C=A(I,J) const int ntasks, // # of tasks const int nthreads, // # of threads to use const bool post_sort, // true if post-sort needed - const void *Ihead, // for I inverse buckets, size A->vlen - const void *Inext, // for I inverse buckets, size nI - const bool Ihead_is_32, // if true, Ihead,Inext 32-bit; else 64 - const bool I_has_duplicates, // true if I has duplicates + const GrB_Matrix R, // R = inverse (I), if needed // from phase0: void **Ch_handle, const bool Cj_is_32, // if true, C->h is 32-bit; else 64-bit @@ -78,8 +75,39 @@ GrB_Info GB_subref_phase3 // C=A(I,J) GB_IDECL (I , const, u) ; GB_IPTR (I , I_is_32) ; GB_IDECL (Ap_start, const, u) ; GB_IPTR (Ap_start, Ap_is_32) ; GB_IDECL (Ap_end , const, u) ; GB_IPTR (Ap_end , Ap_is_32) ; - GB_IDECL (Ihead , const, u) ; GB_IPTR (Ihead , Ihead_is_32) ; - GB_IDECL (Inext , const, u) ; GB_IPTR (Inext , Ihead_is_32) ; + + bool R_is_hyper = false ; + int64_t rnvec = 0, R_hash_bits = 0 ; + void *Rp = NULL, *Rh = NULL, *Ri = NULL ; + void *R_Yp = NULL, *R_Yi = NULL, *R_Yx = NULL ; + bool Rp_is_32 = false ; + bool Rj_is_32 = false ; + bool Ri_is_32 = false ; + GB_IDECL (Rp, const, u) ; + GB_IDECL (Rh, const, u) ; + GB_IDECL (Ri, const, u) ; + if (R != NULL) + { + R_is_hyper = GB_IS_HYPERSPARSE (R) ; + rnvec = R->nvec ; + Rp = R->p ; + Rh = R->h ; + Ri = R->i ; + GB_IPTR (Rp, R->p_is_32) ; + GB_IPTR (Rh, R->j_is_32) ; + GB_IPTR (Ri, R->i_is_32) ; + Rp_is_32 = R->p_is_32 ; + Rj_is_32 = R->j_is_32 ; + Ri_is_32 = R->i_is_32 ; + GrB_Matrix R_Y = R->Y ; + if (R_Y != NULL) + { + R_Yp = R_Y->p ; + R_Yi = R_Y->i ; + R_Yx = R_Y->x ; + R_hash_bits = (R_Y->vdim - 1) ; + } + } ASSERT (Cp != NULL) ; ASSERT_MATRIX_OK (A, "A for subref phase3", GB0) ; @@ -141,7 +169,6 @@ GrB_Info GB_subref_phase3 // C=A(I,J) #define GB_PHASE_2_OF_2 #define GB_I_KIND Ikind #define GB_NEED_QSORT need_qsort - #define GB_I_HAS_DUPLICATES I_has_duplicates if (symbolic) { @@ -244,8 +271,7 @@ GrB_Info GB_subref_phase3 // C=A(I,J) // using the JIT kernel info = GB_subref_sparse_jit (C, TaskList, ntasks, nthreads, post_sort, - Ihead, Inext, Ihead_is_32, I_has_duplicates, Ap_start, Ap_end, - need_qsort, Ikind, nI, Icolon, A, I, I_is_32) ; + R, Ap_start, Ap_end, need_qsort, Ikind, nI, Icolon, A, I, I_is_32) ; if (info == GrB_NO_VALUE) { diff --git a/GraphBLAS/Source/extract/GB_subref_slice.c b/GraphBLAS/Source/extract/GB_subref_slice.c index d3d8073b8..7ba0ba6d0 100644 --- a/GraphBLAS/Source/extract/GB_subref_slice.c +++ b/GraphBLAS/Source/extract/GB_subref_slice.c @@ -40,10 +40,9 @@ #define GB_FREE_ALL \ { \ GB_FREE_WORKSPACE ; \ - GB_FREE_MEMORY (&Cwork, Cwork_size) ; \ - GB_FREE_MEMORY (&TaskList, TaskList_size) ; \ - GB_FREE_MEMORY (&Ihead, Ihead_size) ; \ - GB_FREE_MEMORY (&Inext, Inext_size) ; \ + GB_FREE_MEMORY (&Cwork, Cwork_size) ; \ + GB_FREE_MEMORY (&TaskList, TaskList_size) ; \ + GB_Matrix_free (&R) ; \ } #define GB_RETURN_RESULTS \ @@ -53,12 +52,7 @@ (*p_ntasks ) = ntasks ; \ (*p_nthreads ) = nthreads ; \ (*p_post_sort ) = post_sort ; \ - (*p_Ihead ) = Ihead ; \ - (*p_Ihead_size ) = Ihead_size ; \ - (*p_Inext ) = Inext ; \ - (*p_Inext_size ) = Inext_size ; \ - (*p_Ihead_is_32 ) = Ihead_is_32 ; \ - (*p_nduplicates ) = nduplicates ; \ + (*R_handle ) = R ; \ (*p_Cwork ) = Cwork ; \ (*p_Cwork_size ) = Cwork_size ; \ } @@ -73,12 +67,7 @@ GrB_Info GB_subref_slice // phase 1 of GB_subref int *p_ntasks, // # of tasks constructed int *p_nthreads, // # of threads for subref operation bool *p_post_sort, // true if a final post-sort is needed - void **p_Ihead, // for I inverse, if needed; size avlen - size_t *p_Ihead_size, - void **p_Inext, // for I inverse, if needed; size nI - size_t *p_Inext_size, - bool *p_Ihead_is_32, // if true, Ihead and Inext are 32-bit; else 64 - int64_t *p_nduplicates, // # of duplicates, if I inverse computed + GrB_Matrix *R_handle, // R = inverse (I), if needed uint64_t **p_Cwork, // workspace of size max(2,C->nvec+1) size_t *p_Cwork_size, // from phase0: @@ -108,34 +97,22 @@ GrB_Info GB_subref_slice // phase 1 of GB_subref ASSERT (p_ntasks != NULL) ; ASSERT (p_nthreads != NULL) ; ASSERT (p_post_sort != NULL) ; - ASSERT (p_Ihead != NULL) ; - ASSERT (p_Ihead_size != NULL) ; - ASSERT (p_Inext != NULL) ; - ASSERT (p_Inext_size != NULL) ; - ASSERT (p_nduplicates != NULL) ; ASSERT (p_Cwork != NULL) ; ASSERT (p_Cwork_size != NULL) ; + ASSERT (R_handle != NULL) ; ASSERT ((Cnvec > 0) == (Ap_start != NULL)) ; ASSERT ((Cnvec > 0) == (Ap_end != NULL)) ; (*p_TaskList) = NULL ; (*p_TaskList_size) = 0 ; - (*p_Ihead) = NULL ; - (*p_Inext) = NULL ; - (*p_Ihead_is_32) = false ; (*p_Cwork) = NULL ; - (*p_Ihead_size) = 0 ; - (*p_Inext_size) = 0 ; (*p_Cwork_size) = 0 ; - (*p_nduplicates) = 0 ; - void *Ihead = NULL ; size_t Ihead_size = 0 ; - void *Inext = NULL ; size_t Inext_size = 0 ; - bool Ihead_is_32 = false ; uint64_t *restrict Cwork = NULL ; size_t Cwork_size = 0 ; GB_WERK_DECLARE (Coarse, int64_t) ; // size ntasks1+1 int ntasks1 = 0 ; + GrB_Matrix R = NULL ; GrB_Info info ; @@ -167,22 +144,9 @@ GrB_Info GB_subref_slice // phase 1 of GB_subref GB_REALLOC_TASK_WORK (TaskList, ntasks0, max_ntasks) ; //-------------------------------------------------------------------------- - // determine if I_inverse can be constructed + // to determine if R needs to be constructed //-------------------------------------------------------------------------- - // I_inverse_ok is true if I might be inverted. If false, then I will not - // be inverted. I can be inverted only if the workspace for the inverse - // does not exceed nnz(A). Note that if I was provided on input as an - // explicit list, but consists of a contiguous range imin:imax, then Ikind - // is now GB_LIST and the list I is ignored. - - // If I_inverse_ok is true, the inverse of I might still not be needed. - // need_I_inverse becomes true if any C(:,kC) = A (I,kA) computation - // requires I inverse. - - int64_t I_inverse_limit = GB_IMAX (4096, anz) ; - bool I_inverse_ok = (Ikind == GB_LIST && - ((nI > avlen / 256) || ((nI + avlen) < I_inverse_limit))) ; bool need_I_inverse = false ; bool post_sort = false ; int64_t iinc = Icolon [GxB_INC] ; @@ -221,7 +185,7 @@ GrB_Info GB_subref_slice // phase 1 of GB_subref bool this_needs_I_inverse ; // true if this vector needs I inverse // amount of work for C(:,kC) = A (I,kA): int64_t work = GB_subref_work (&this_needs_I_inverse, alen, avlen, - Ikind, nI, I_inverse_ok, need_qsort, iinc) ; + Ikind, nI, need_qsort, iinc) ; // log the result need_I_inverse = need_I_inverse || this_needs_I_inverse ; @@ -251,13 +215,9 @@ GrB_Info GB_subref_slice // phase 1 of GB_subref // invert I if required //-------------------------------------------------------------------------- - int64_t nduplicates = 0 ; if (need_I_inverse) { - GB_OK (GB_I_inverse (I, I_is_32, nI, avlen, &Ihead, &Ihead_size, - &Inext, &Inext_size, &Ihead_is_32, &nduplicates, Werk)) ; - ASSERT (Ihead != NULL) ; - ASSERT (Inext != NULL) ; + GB_OK (GB_I_inverse (I, I_is_32, nI, avlen, &R, Werk)) ; } //-------------------------------------------------------------------------- @@ -295,8 +255,6 @@ GrB_Info GB_subref_slice // phase 1 of GB_subref // construct all tasks, both coarse and fine //-------------------------------------------------------------------------- - bool I_has_duplicates = (nduplicates > 0) ; - for (int t = 0 ; t < ntasks1 ; t++) { @@ -404,7 +362,7 @@ GrB_Info GB_subref_slice // phase 1 of GB_subref int64_t alen = pA_end - pA ; // nnz (A (imin:imax,j)) int method = GB_subref_method (alen, avlen, Ikind, nI, - I_inverse_ok, need_qsort, iinc, I_has_duplicates) ; + need_qsort, iinc) ; if (method == 10) { diff --git a/GraphBLAS/Source/extract/include/GB_subref_method.h b/GraphBLAS/Source/extract/include/GB_subref_method.h index 9d06cf9f2..4780e5211 100644 --- a/GraphBLAS/Source/extract/include/GB_subref_method.h +++ b/GraphBLAS/Source/extract/include/GB_subref_method.h @@ -24,11 +24,8 @@ static inline int GB_subref_method // return the method to use (1 to 12) const int64_t avlen, // A->vlen const int Ikind, // GB_ALL, GB_RANGE, GB_STRIDE, or GB_LIST const int64_t nI, // length of I - const bool I_inverse_ok, // true if I is invertable const bool need_qsort, // true if C(:,k) requires sorting - const int64_t iinc, // increment for GB_STRIDE - const bool I_has_duplicates // true if duplicates in I - // (false if not yet known) + const int64_t iinc // increment for GB_STRIDE ) { @@ -68,8 +65,7 @@ static inline int GB_subref_method // return the method to use (1 to 12) // Case 5: C (:,k) = A (ibegin:iend,j) method = 5 ; } - else if ((Ikind == GB_LIST && !I_inverse_ok) || // must do Case 6 - (64 * nI < ajnz)) // Case 6 faster + else if (64 * nI < ajnz) // Case 6 faster in this case { // Case 6: nI not large; binary search of A(:,j) for each i in I method = 6 ; @@ -92,9 +88,9 @@ static inline int GB_subref_method // return the method to use (1 to 12) method = 9 ; } } - else // Ikind == GB_LIST, and I inverse buckets will be used + else // Ikind == GB_LIST, and R = inverse(I) will be used { - // construct the I inverse buckets + // construct the R matrix if (need_qsort) { // Case 10: nI large, need qsort @@ -102,20 +98,10 @@ static inline int GB_subref_method // return the method to use (1 to 12) // use this method, a post sort is needed when all tasks are done. method = 10 ; } - else if (I_has_duplicates) - { - // Case 11: nI large, no qsort, with duplicates - // duplicates are possible so cjnz > ajnz can hold. Note that the - // # of duplicates is only known after I is inverted, which might - // not yet be done. In that case, nuplicates is assumed to be - // zero, and Case 12 is assumed to be used instead. This is - // revised after I is inverted. - method = 11 ; - } else - { - // Case 12: nI large, no qsort, no duplicates - method = 12 ; + { + // Case 11: nI large, no qsort, duplicates are OK + method = 11 ; } } @@ -139,7 +125,6 @@ static inline int64_t GB_subref_work // return the work for a subref method const int64_t avlen, // A->vlen const int Ikind, // GB_ALL, GB_RANGE, GB_STRIDE, or GB_LIST const int64_t nI, // length of I - const bool I_inverse_ok, // true if I is invertable const bool need_qsort, // true if C(:,k) requires sorting const int64_t iinc // increment for GB_STRIDE ) @@ -149,17 +134,7 @@ static inline int64_t GB_subref_work // return the work for a subref method // get the method //-------------------------------------------------------------------------- - // nduplicates in I not yet known; it is found when I is inverted. For - // now, assume I has no duplicate entries. All that is needed for now is - // the work required for each C(:,k), and whether or not I inverse must be - // created. The # of duplicates has no impact on the I inverse decision, - // and a minor effect on the work (which is ignored). Method 11 is only - // used if I_has_duplicates is true. - - const bool I_has_duplicates = false ; // not yet known - - int method = GB_subref_method (ajnz, avlen, Ikind, nI, I_inverse_ok, - need_qsort, iinc, I_has_duplicates) ; + int method = GB_subref_method (ajnz, avlen, Ikind, nI, need_qsort, iinc) ; //-------------------------------------------------------------------------- // get the work @@ -178,10 +153,8 @@ static inline int64_t GB_subref_work // return the work for a subref method case 8 : work = ajnz ; break ; case 9 : work = ajnz ; break ; case 10 : work = ajnz * 32 ; break ; -// case 11 : -// work = ajnz * 2 ; break ; // case not determined yet default : - case 12 : work = ajnz ; break ; + case 11 : work = ajnz * 2 ; break ; } //-------------------------------------------------------------------------- diff --git a/GraphBLAS/Source/extract/template/GB_subref_template.c b/GraphBLAS/Source/extract/template/GB_subref_template.c index 442ba67ad..3da89d6e3 100644 --- a/GraphBLAS/Source/extract/template/GB_subref_template.c +++ b/GraphBLAS/Source/extract/template/GB_subref_template.c @@ -17,11 +17,36 @@ // iso: C = A(I,J), extracting the pattern only, not the values // numeric: C = A(I,J), extracting the pattern and values -// to iterate across all entries in a bucket: -#define GB_for_each_index_in_bucket(inew,i,nI,Ihead,Inext) \ - for (uint64_t inew = GB_IGET (Ihead, i) ; \ - inew < nI ; \ - inew = GB_IGET (Inext, inew)) +// The matrix R holds the "inverse" of I, which is not actually an inverse +// since I can have duplicates. If i = I [k1] = I [k2] = I [k3], then the +// column indices in R(i,:) are {k1, k2, k3}. R is held by row, and is either +// sparse or hypersparse. + +#define GB_for_each_inew_in_I_inverse_hash(i,pR) \ + int64_t pR, pR_end ; \ + if (R_is_hyper) \ + { \ + /* R(i,:) is the kth vector in the hypersparse matrix R; */ \ + /* find k so that i = Rh [k] using the R->Y hyper_hash, */ \ + /* and set pR = Rp [k] and pR_end = Rp [k+1]. */ \ + GB_hyper_hash_lookup (Rp_is_32, Rj_is_32, \ + Rh, rnvec, Rp, R_Yp, R_Yi, R_Yx, R_hash_bits, \ + i, &pR, &pR_end) ; \ + } \ + else \ + { \ + /* R(i,:) is the ith vector in the sparse matrix R */ \ + pR = GB_IGET (Rp, i) ; /* pR = Rp [i] */ \ + pR_end = GB_IGET (Rp, i+1) ; /* pR_end = Rp [i+1] */ \ + } \ + /* for each entry in the row R(i,:) */ \ + for ( ; pR < pR_end ; pR++) + #if 0 + { + // get R(i,inew); this is the index i = I [inew] + int64_t inew = GB_IGET (Ri, pR) ; // inew = Ri [pR] + } + #endif //------------------------------------------------------------------------------ @@ -185,7 +210,7 @@ { // determine the method based on A(*,kA) and I method = GB_subref_method (alen, avlen, GB_I_KIND, nI, - (Ihead != NULL), GB_NEED_QSORT, iinc, GB_I_HAS_DUPLICATES) ; + GB_NEED_QSORT, iinc) ; } //------------------------------------------------------------------ @@ -355,12 +380,10 @@ // properties. For a fine task, A(:,kA) has not been // sliced; I has been sliced instead. - // If the I bucket inverse has not been created, this - // method is the only option. Alternatively, if nI = - // length (I) is << nnz (A (:,kA)), then scanning I and - // doing a binary search of A (:,kA) is faster than doing a - // linear-time search of A(:,kA) and a lookup into the I - // bucket inverse. + // If nI = length (I) is << nnz (A (:,kA)), then scanning I + // and doing a binary search of A (:,kA) is faster than + // doing a linear-time scan of A(:,kA) and a lookup into + // R for each row index i in A(:,kA). // The vector of C is constructed in sorted order, so no // sort is needed. @@ -513,10 +536,8 @@ case 10 : // I unsorted, and C needs qsort, duplicates OK //-------------------------------------------------------------- - // Time: with one thread: 2x slower, probably - // because of the qsort. Good speedup however. This used - // if qsort is needed but ndupl == 0. Try a method that - // needs qsort, but no duplicates? + // Time: with one thread: 2x slower, probably because of + // the qsort. Good speedup however. // Case 10 works well when I has many entries and A(:,kA) // has few entries. C(:,kC) must be sorted after this pass. @@ -524,15 +545,16 @@ ASSERT (GB_I_KIND == GB_LIST) ; for (int64_t k = 0 ; k < alen ; k++) { - // A(i,kA) present, look it up in the I inverse buckets + // A(i,kA) present, look it up in R(i,:) int64_t i = GB_IGET (Ai, pA + k) ; #if defined ( GB_SYMBOLIC ) i = GB_UNZOMBIE (i) ; #endif - // traverse bucket i for all indices inew where + // traverse R(i,:) for all indices inew where // i == I [inew] or where i is from a colon expression - GB_for_each_index_in_bucket (inew, i, nI, Ihead, Inext) + GB_for_each_inew_in_I_inverse_hash (i,pR) { + int64_t inew = GB_IGET (Ri, pR) ; // inew = Ri [pR] ASSERT (inew >= 0 && inew < nI) ; ASSERT (i == GB_IJLIST (I, inew, GB_I_KIND,Icolon)); #if defined ( GB_ANALYSIS_PHASE ) @@ -564,7 +586,7 @@ break ; //-------------------------------------------------------------- - case 11 : // I not contiguous, with duplicates. No qsort needed + case 11 : // I not contiguous, duplicates OK. No qsort needed //-------------------------------------------------------------- // Case 11 works well when I has many entries and A(:,kA) @@ -575,15 +597,16 @@ ASSERT (GB_I_KIND == GB_LIST) ; for (int64_t k = 0 ; k < alen ; k++) { - // A(i,kA) present, look it up in the I inverse buckets + // A(i,kA) present, look it up in R(i,:) int64_t i = GB_IGET (Ai, pA + k) ; #if defined ( GB_SYMBOLIC ) i = GB_UNZOMBIE (i) ; #endif - // traverse bucket i for all indices inew where + // traverse R(i,:) for all indices inew where // i == I [inew] or where i is from a colon expression - GB_for_each_index_in_bucket (inew, i, nI, Ihead, Inext) + GB_for_each_inew_in_I_inverse_hash (i,pR) { + int64_t inew = GB_IGET (Ri, pR) ; // inew = Ri [pR] ASSERT (inew >= 0 && inew < nI) ; ASSERT (i == GB_IJLIST (I, inew, GB_I_KIND,Icolon)); #if defined ( GB_ANALYSIS_PHASE ) @@ -601,43 +624,6 @@ #endif break ; - //-------------------------------------------------------------- - case 12 : // I not contiguous, no duplicates. No qsort needed. - //-------------------------------------------------------------- - - // Identical to Case 11, except GB_for_each_index_in_bucket - // just needs to iterate 0 or 1 times. Works well when I - // has many entries and A(:,kA) has few entries. - - ASSERT (GB_I_KIND == GB_LIST && !GB_I_HAS_DUPLICATES) - for (int64_t k = 0 ; k < alen ; k++) - { - // A(i,kA) present, look it up in the I inverse buckets - int64_t i = GB_IGET (Ai, pA + k) ; - #if defined ( GB_SYMBOLIC ) - i = GB_UNZOMBIE (i) ; - #endif - // bucket i has at most one index inew such that - // i == I [inew] - uint64_t inew = GB_IGET (Ihead, i) ; - if (inew < nI) - { - ASSERT (i == GB_IJLIST (I, inew, GB_I_KIND,Icolon)); - #if defined ( GB_ANALYSIS_PHASE ) - clen++ ; - #else - GB_ISET (Ci, pC, inew) ; // Ci [pC] = inew ; - GB_COPY_ENTRY (pC, pA + k) ; - pC++ ; - #endif - } - } - - #if defined ( GB_PHASE_2_OF_2 ) - ASSERT (pC == pC_end) ; - #endif - break ; - //-------------------------------------------------------------- default: ; //-------------------------------------------------------------- @@ -708,7 +694,7 @@ #endif } -#undef GB_for_each_index_in_bucket +#undef GB_for_each_inew_in_I_inverse_hash #undef GB_COPY_RANGE #undef GB_COPY_ENTRY #undef GB_SYMBOLIC diff --git a/GraphBLAS/Source/gateway/GB_cuda_gateway.h b/GraphBLAS/Source/gateway/GB_cuda_gateway.h index 06fdf642c..ed5b64018 100644 --- a/GraphBLAS/Source/gateway/GB_cuda_gateway.h +++ b/GraphBLAS/Source/gateway/GB_cuda_gateway.h @@ -75,7 +75,7 @@ static inline int GB_ngpus_to_use else if (gpu_hack == 1) { // always use all available GPU(s) - // Fixme for CUDA: allow 1 to gpu_count to be requested + // FIXME for CUDA: allow 1 to gpu_count to be requested return (gpu_count) ; } else diff --git a/GraphBLAS/Source/global/GB_Global.c b/GraphBLAS/Source/global/GB_Global.c index c2a010509..fc7e0a237 100644 --- a/GraphBLAS/Source/global/GB_Global.c +++ b/GraphBLAS/Source/global/GB_Global.c @@ -253,7 +253,7 @@ static GB_Global_struct GB_Global = .gpu_count = 0, // # of GPUs in the system // OpenMP locks - .lock_is_created = {0, 0, 0, 0}, + .lock_is_created = {0, 0, 0, 0, 0, 0, 0, 0}, // of size GB_GLOBAL_NLOCKS } ; //============================================================================== diff --git a/GraphBLAS/Source/init/GB_init.c b/GraphBLAS/Source/init/GB_init.c index d84e51b03..742392bae 100644 --- a/GraphBLAS/Source/init/GB_init.c +++ b/GraphBLAS/Source/init/GB_init.c @@ -88,7 +88,7 @@ GrB_Info GB_init // start up GraphBLAS bool malloc_is_thread_safe = true ; #if defined ( GRAPHBLAS_HAS_CUDA ) - mode = GxB_NONBLOCKING_GPU ; // HACK Fixme for CUDA: force GPU to be used + mode = GxB_NONBLOCKING_GPU ; // HACK FIXME for CUDA: force GPU to be used if (mode == GxB_NONBLOCKING_GPU || mode == GxB_BLOCKING_GPU) { // ignore the memory management function pointers and use rmm_wrap_* @@ -206,9 +206,9 @@ GrB_Info GB_init // start up GraphBLAS #pragma omp flush #if defined ( GRAPHBLAS_HAS_CUDA ) // this hack_get setting is used by GB_ngpus_to_use: -// GB_Global_hack_set (2,0) ; // HACK Fixme for CUDA: default: GPU for big enough probs - GB_Global_hack_set (2,1) ; // HACK Fixme for CUDA: force the GPU always to be used -// GB_Global_hack_set (2,2) ; // HACK Fixme for CUDA: force the GPU never to be used +// GB_Global_hack_set (2,0) ; // HACK FIXME for CUDA: default: GPU for big enough probs + GB_Global_hack_set (2,1) ; // HACK FIXME for CUDA: force the GPU always to be used +// GB_Global_hack_set (2,2) ; // HACK FIXME for CUDA: force the GPU never to be used #endif return (GrB_SUCCESS) ; diff --git a/GraphBLAS/Source/init/GrB_init.c b/GraphBLAS/Source/init/GrB_init.c index 8a3498faa..eb335e70f 100644 --- a/GraphBLAS/Source/init/GrB_init.c +++ b/GraphBLAS/Source/init/GrB_init.c @@ -12,7 +12,7 @@ // and its RMM memory manager: use a mode of GxB_BLOCKING_GPU or // GxB_NONBLOCKING_GPU. -// Fixme for CUDA: rename GxB_*BLOCKING_GPU to GxB_*BLOCKING_CUDA. +// FIXME for CUDA: rename GxB_*BLOCKING_GPU to GxB_*BLOCKING_CUDA. #include "GB.h" #include "init/GB_init.h" diff --git a/GraphBLAS/Source/jit_kernels/include/GB_jit_kernel_proto.h b/GraphBLAS/Source/jit_kernels/include/GB_jit_kernel_proto.h index a9244c3bb..5bdcb6578 100644 --- a/GraphBLAS/Source/jit_kernels/include/GB_jit_kernel_proto.h +++ b/GraphBLAS/Source/jit_kernels/include/GB_jit_kernel_proto.h @@ -662,8 +662,7 @@ GrB_Info GB_jit_kernel_subref_sparse \ const int ntasks, \ const int nthreads, \ const bool post_sort, \ - const void *Ihead_input, \ - const void *Inext_input, \ + const GrB_Matrix R, \ const void *Ap_start_input, \ const void *Ap_end_input, \ const int64_t nI, \ diff --git a/GraphBLAS/Source/jit_kernels/template/GB_jit_kernel_subref_sparse.c b/GraphBLAS/Source/jit_kernels/template/GB_jit_kernel_subref_sparse.c index 845bc4a36..78e83c426 100644 --- a/GraphBLAS/Source/jit_kernels/template/GB_jit_kernel_subref_sparse.c +++ b/GraphBLAS/Source/jit_kernels/template/GB_jit_kernel_subref_sparse.c @@ -37,9 +37,20 @@ GB_JIT_GLOBAL GB_JIT_KERNEL_SUBREF_SPARSE_PROTO (GB_jit_kernel) // get I const GB_I_TYPE *restrict I = I_input ; - // get I inverse lists - const GB_IHEAD_TYPE *restrict Ihead = Ihead_input ; - const GB_IHEAD_TYPE *restrict Inext = Inext_input ; + // get R for the I inverse data structure + GB_Rp_DECLARE (Rp, const) ; GB_Rp_PTR (Rp, R) ; + GB_Rh_DECLARE (Rh, const) ; GB_Rh_PTR (Rh, R) ; + GB_Ri_DECLARE_U (Ri, const) ; GB_Ri_PTR (Ri, R) ; + GrB_Matrix R_Y = (R == NULL) ? NULL : R->Y ; + const void *R_Yp = (R_Y == NULL) ? NULL : R_Y->p ; + const void *R_Yi = (R_Y == NULL) ? NULL : R_Y->i ; + const void *R_Yx = (R_Y == NULL) ? NULL : R_Y->x ; + const int64_t R_hash_bits = (R_Y == NULL) ? 0 : (R_Y->vdim - 1) ; + #define R_is_hyper GB_R_IS_HYPER + #define Rp_is_32 GB_Rp_IS_32 + #define Rj_is_32 GB_Rj_IS_32 + #define Ri_is_32 GB_Ri_IS_32 + int64_t rnvec = (R == NULL) ? 0 : R->nvec ; #ifndef GB_Ai_IS_32 #define GB_Ai_IS_32 (GB_Ai_BITS == 32) diff --git a/GraphBLAS/Source/jit_wrappers/GB_masker_phase1_jit.c b/GraphBLAS/Source/jit_wrappers/GB_masker_phase1_jit.c index f43fe6b91..410939a58 100644 --- a/GraphBLAS/Source/jit_wrappers/GB_masker_phase1_jit.c +++ b/GraphBLAS/Source/jit_wrappers/GB_masker_phase1_jit.c @@ -29,6 +29,7 @@ GrB_Info GB_masker_phase1_jit // count nnz in each R(:,j) const int64_t *restrict R_to_Z, const bool Rp_is_32, // if true, Rp is 32-bit; else 64-bit const bool Rj_is_32, // if true, Rh is 32-bit; else 64-bit + const int R_sparsity, // GxB_SPARSE or GxB_HYPERSPARSE // original input: const GrB_Matrix M, // required mask const bool Mask_comp, // if true, then M is complemented @@ -45,7 +46,8 @@ GrB_Info GB_masker_phase1_jit // count nnz in each R(:,j) GB_jit_encoding encoding ; char *suffix ; uint64_t hash = GB_encodify_masker (&encoding, &suffix, - GB_JIT_KERNEL_MASKER_PHASE1, NULL, Rp_is_32, Rj_is_32, false, + GB_JIT_KERNEL_MASKER_PHASE1, R_sparsity, /* rtype: */ NULL, + Rp_is_32, Rj_is_32, /* Ri is not accessed: */ false, M, Mask_struct, Mask_comp, C, Z) ; //-------------------------------------------------------------------------- diff --git a/GraphBLAS/Source/jit_wrappers/GB_masker_phase2_jit.c b/GraphBLAS/Source/jit_wrappers/GB_masker_phase2_jit.c index c01446735..7897a49ef 100644 --- a/GraphBLAS/Source/jit_wrappers/GB_masker_phase2_jit.c +++ b/GraphBLAS/Source/jit_wrappers/GB_masker_phase2_jit.c @@ -23,6 +23,7 @@ GrB_Info GB_masker_phase2_jit // phase2 for R = masker (C,M,Z) const int64_t *restrict R_to_M, const int64_t *restrict R_to_C, const int64_t *restrict R_to_Z, + const int R_sparsity, // any sparsity format // original input: const GrB_Matrix M, // required mask const bool Mask_comp, // if true, then M is complemented @@ -45,7 +46,8 @@ GrB_Info GB_masker_phase2_jit // phase2 for R = masker (C,M,Z) GB_jit_encoding encoding ; char *suffix ; uint64_t hash = GB_encodify_masker (&encoding, &suffix, - GB_JIT_KERNEL_MASKER_PHASE2, R, R->p_is_32, R->j_is_32, R->i_is_32, + GB_JIT_KERNEL_MASKER_PHASE2, R_sparsity, R->type, + R->p_is_32, R->j_is_32, R->i_is_32, M, Mask_struct, Mask_comp, C, Z) ; //-------------------------------------------------------------------------- diff --git a/GraphBLAS/Source/jit_wrappers/GB_subref_bitmap_jit.c b/GraphBLAS/Source/jit_wrappers/GB_subref_bitmap_jit.c index bb851ec25..8b325ca7d 100644 --- a/GraphBLAS/Source/jit_wrappers/GB_subref_bitmap_jit.c +++ b/GraphBLAS/Source/jit_wrappers/GB_subref_bitmap_jit.c @@ -42,7 +42,7 @@ GrB_Info GB_subref_bitmap_jit char *suffix ; uint64_t hash = GB_encodify_subref (&encoding, &suffix, GB_JIT_KERNEL_BITMAP_SUBREF, C, I_is_32, J_is_32, - Ikind, Jkind, false, false, false, A) ; + Ikind, Jkind, false, NULL, A) ; //-------------------------------------------------------------------------- // get the kernel function pointer, loading or compiling it if needed diff --git a/GraphBLAS/Source/jit_wrappers/GB_subref_sparse_jit.c b/GraphBLAS/Source/jit_wrappers/GB_subref_sparse_jit.c index 56d29ce42..69ec86fa1 100644 --- a/GraphBLAS/Source/jit_wrappers/GB_subref_sparse_jit.c +++ b/GraphBLAS/Source/jit_wrappers/GB_subref_sparse_jit.c @@ -21,10 +21,7 @@ GrB_Info GB_subref_sparse_jit const int ntasks, // # of tasks const int nthreads, // # of threads to use const bool post_sort, // true if post-sort needed - const void *Ihead, // for I inverse buckets, size A->vlen - const void *Inext, // for I inverse buckets, size nI - const bool Ihead_is_32, // if true, Ihead/Inext 32-bit; else 64 - const bool I_has_duplicates, // true if I has duplicates + const GrB_Matrix R, // R = inverse (I), if needed // from phase0: const void *Ap_start, const void *Ap_end, @@ -47,7 +44,7 @@ GrB_Info GB_subref_sparse_jit char *suffix ; uint64_t hash = GB_encodify_subref (&encoding, &suffix, GB_JIT_KERNEL_SUBREF_SPARSE, C, I_is_32, false, Ikind, 0, - need_qsort, Ihead_is_32, I_has_duplicates, A) ; + need_qsort, R, A) ; //-------------------------------------------------------------------------- // get the kernel function pointer, loading or compiling it if needed @@ -66,7 +63,7 @@ GrB_Info GB_subref_sparse_jit #include "include/GB_pedantic_disable.h" GB_jit_dl_function GB_jit_kernel = (GB_jit_dl_function) dl_function ; - return (GB_jit_kernel (C, TaskList, ntasks, nthreads, post_sort, Ihead, - Inext, Ap_start, Ap_end, nI, Icolon, A, I, &GB_callback)) ; + return (GB_jit_kernel (C, TaskList, ntasks, nthreads, post_sort, R, + Ap_start, Ap_end, nI, Icolon, A, I, &GB_callback)) ; } diff --git a/GraphBLAS/Source/jitifyer/GB_encodify_masker.c b/GraphBLAS/Source/jitifyer/GB_encodify_masker.c index f1588eca6..628f881b4 100644 --- a/GraphBLAS/Source/jitifyer/GB_encodify_masker.c +++ b/GraphBLAS/Source/jitifyer/GB_encodify_masker.c @@ -20,7 +20,8 @@ uint64_t GB_encodify_masker // encode a masker problem char **suffix, // suffix for user-defined kernel // input: const GB_jit_kcode kcode, // kernel to encode - const GrB_Matrix R, // may be NULL, for phase1 + const int R_sparsity, // any sparsity format + const GrB_Type rtype, const bool Rp_is_32, // if true, R->p is 32 bit; else 64 bit const bool Rj_is_32, // if true, R->h is 32 bit; else 64 bit const bool Ri_is_32, // if true, R->i is 32 bit; else 64 bit @@ -33,11 +34,10 @@ uint64_t GB_encodify_masker // encode a masker problem { //-------------------------------------------------------------------------- - // check if the R->type is JIT'able + // check if the rtype is JIT'able //-------------------------------------------------------------------------- - GrB_Type rtype = (R == NULL) ? NULL : R->type ; - if (R != NULL && rtype->hash == UINT64_MAX) + if (rtype != NULL && rtype->hash == UINT64_MAX) { // cannot JIT this type memset (encoding, 0, sizeof (GB_jit_encoding)) ; @@ -50,7 +50,8 @@ uint64_t GB_encodify_masker // encode a masker problem //-------------------------------------------------------------------------- GB_encodify_kcode (encoding, kcode) ; - GB_enumify_masker (&encoding->code, R, Rp_is_32, Rj_is_32, Ri_is_32, + GB_enumify_masker (&encoding->code, R_sparsity, rtype, + Rp_is_32, Rj_is_32, Ri_is_32, M, Mask_struct, Mask_comp, C, Z) ; //-------------------------------------------------------------------------- diff --git a/GraphBLAS/Source/jitifyer/GB_encodify_subref.c b/GraphBLAS/Source/jitifyer/GB_encodify_subref.c index d9d030a02..99e030731 100644 --- a/GraphBLAS/Source/jitifyer/GB_encodify_subref.c +++ b/GraphBLAS/Source/jitifyer/GB_encodify_subref.c @@ -26,8 +26,7 @@ uint64_t GB_encodify_subref // encode an subref problem int Ikind, // 0: all (no I), 1: range, 2: stride, 3: list int Jkind, // ditto, or 0 if not used bool need_qsort, // true if qsort needs to be called - bool Ihead_is_32, // if true, Ihead/Inext 32-bit; else 64 - bool I_has_duplicates, // true if I has duplicate entries + GrB_Matrix R, // A matrix: GrB_Matrix A ) @@ -51,8 +50,7 @@ uint64_t GB_encodify_subref // encode an subref problem GB_encodify_kcode (encoding, kcode) ; GB_enumify_subref (&encoding->code, - C, I_is_32, J_is_32, Ikind, Jkind, need_qsort, Ihead_is_32, - I_has_duplicates, A) ; + C, I_is_32, J_is_32, Ikind, Jkind, need_qsort, R, A) ; //-------------------------------------------------------------------------- // determine the suffix and its length diff --git a/GraphBLAS/Source/jitifyer/GB_enumify_masker.c b/GraphBLAS/Source/jitifyer/GB_enumify_masker.c index 2f87cce1b..b6bbff0dc 100644 --- a/GraphBLAS/Source/jitifyer/GB_enumify_masker.c +++ b/GraphBLAS/Source/jitifyer/GB_enumify_masker.c @@ -15,7 +15,8 @@ void GB_enumify_masker // enumify a masker problem // output: uint64_t *method_code, // unique encoding of the entire operation // input: - const GrB_Matrix R, // NULL for phase 1 + const int R_sparsity, // any sparsity format + const GrB_Type rtype, // the type of R (NULL for phase1) const bool Rp_is_32, // if true, R->p is 32-bit; else 64-bit const bool Rj_is_32, // if true, R->h is 32-bit; else 64-bit const bool Ri_is_32, // if true, R->i is 32-bit; else 64-bit @@ -28,12 +29,11 @@ void GB_enumify_masker // enumify a masker problem { //-------------------------------------------------------------------------- - // get the types of R, C, and Z + // check inputs //-------------------------------------------------------------------------- - GrB_Type rtype = (R == NULL) ? NULL : R->type ; - ASSERT (GB_IMPLIES (R != NULL, rtype == C->type)) ; - ASSERT (GB_IMPLIES (R != NULL, rtype == Z->type)) ; + ASSERT (GB_IMPLIES (rtype != NULL, rtype == C->type)) ; + ASSERT (GB_IMPLIES (rtype != NULL, rtype == Z->type)) ; //-------------------------------------------------------------------------- // enumify the types @@ -55,7 +55,6 @@ void GB_enumify_masker // enumify a masker problem // enumify the sparsity structures of R, C, M, and Z //-------------------------------------------------------------------------- - int R_sparsity = GB_sparsity (R) ; int C_sparsity = GB_sparsity (C) ; int M_sparsity = GB_sparsity (M) ; int Z_sparsity = GB_sparsity (Z) ; diff --git a/GraphBLAS/Source/jitifyer/GB_enumify_subref.c b/GraphBLAS/Source/jitifyer/GB_enumify_subref.c index 7cc51f38c..0770de90e 100644 --- a/GraphBLAS/Source/jitifyer/GB_enumify_subref.c +++ b/GraphBLAS/Source/jitifyer/GB_enumify_subref.c @@ -24,8 +24,7 @@ void GB_enumify_subref // enumerate a GrB_extract problem int Ikind, // 0: all (no I), 1: range, 2: stride, 3: list int Jkind, // ditto, or 0 if not used bool need_qsort, // true if qsort needs to be called - bool Ihead_is_32, // if true, Ihead/Inext 32-bit; else 64 - bool I_has_duplicates, // true if I has duplicate entries + GrB_Matrix R, // A matrix: GrB_Matrix A ) @@ -45,12 +44,13 @@ void GB_enumify_subref // enumerate a GrB_extract problem int C_sparsity = GB_sparsity (C) ; int A_sparsity = GB_sparsity (A) ; - int csparsity, asparsity ; + int R_sparsity = GB_sparsity (R) ; + int csparsity, asparsity, rsparsity ; GB_enumify_sparsity (&csparsity, C_sparsity) ; GB_enumify_sparsity (&asparsity, A_sparsity) ; + GB_enumify_sparsity (&rsparsity, R_sparsity) ; int needqsort = (need_qsort) ? 1 : 0 ; - int ihasdupl = (I_has_duplicates) ? 1 : 0 ; int i_is_32 = (I_is_32) ? 1 : 0 ; int j_is_32 = (J_is_32) ? 1 : 0 ; @@ -63,19 +63,26 @@ void GB_enumify_subref // enumerate a GrB_extract problem int aj_is_32 = (A->j_is_32) ? 1 : 0 ; int ai_is_32 = (A->i_is_32) ? 1 : 0 ; - int ihead_is_32 = (Ihead_is_32) ? 1 : 0 ; + int rp_is_32 = (R != NULL && R->p_is_32) ? 1 : 0 ; + int rj_is_32 = (R != NULL && R->j_is_32) ? 1 : 0 ; + int ri_is_32 = (R != NULL && R->i_is_32) ? 1 : 0 ; //-------------------------------------------------------------------------- // construct the subref method_code //-------------------------------------------------------------------------- - // total method_code bits: 23 (6 hex digits) + // total method_code bits: 28 (7 hex digits) (*method_code) = // range bits - // C, A integer sizes (2 hex digits) - GB_LSHIFT (ihead_is_32, 22) | // 0 to 1 1 + // R integer sizes and sparsity + GB_LSHIFT (rp_is_32 , 27) | // 0 to 1 1 + GB_LSHIFT (rj_is_32 , 26) | // 0 to 1 1 + GB_LSHIFT (ri_is_32 , 25) | // 0 to 1 1 + GB_LSHIFT (rsparsity , 23) | // 0 to 3 2 + // 22: unused + // C, A integer sizes (2 hex digits) GB_LSHIFT (cp_is_32 , 21) | // 0 to 1 1 GB_LSHIFT (cj_is_32 , 20) | // 0 to 1 1 GB_LSHIFT (ci_is_32 , 19) | // 0 to 1 1 @@ -84,10 +91,10 @@ void GB_enumify_subref // enumerate a GrB_extract problem GB_LSHIFT (aj_is_32 , 17) | // 0 to 1 1 GB_LSHIFT (ai_is_32 , 16) | // 0 to 1 1 - // need_qsort, I_has_duplicates, I and J bits (1 hex digit) + // need_qsort, I and J bits (1 hex digit) GB_LSHIFT (i_is_32 , 15) | // 0 to 1 1 GB_LSHIFT (j_is_32 , 14) | // 0 to 1 1 - GB_LSHIFT (ihasdupl , 13) | // 0 to 1 1 + // 13: unused GB_LSHIFT (needqsort , 12) | // 0 to 1 1 // Ikind, Jkind (1 hex digit) diff --git a/GraphBLAS/Source/jitifyer/GB_jitifyer.c b/GraphBLAS/Source/jitifyer/GB_jitifyer.c index e2b5dc3cb..385eedd22 100644 --- a/GraphBLAS/Source/jitifyer/GB_jitifyer.c +++ b/GraphBLAS/Source/jitifyer/GB_jitifyer.c @@ -1870,7 +1870,7 @@ GrB_Info GB_jitifyer_load2_worker break ; case GB_jit_subref_family : - method_code_digits = 6 ; + method_code_digits = 7 ; break ; case GB_jit_sort_family : @@ -2580,18 +2580,19 @@ void GB_jitifyer_nvcc_compile // compile: "sh -c \"" // execute with POSIX shell - // Fixme for CUDA: use GB_CUDA_COMPILER here: + // FIXME for CUDA: use GB_CUDA_COMPILER here: "nvcc --version ; " "nvcc " // compiler command "-forward-unknown-to-host-compiler " "-DGB_JIT_RUNTIME=1 " // nvcc flags - // Fixme for CUDA: add GB_CUDA_INC here: + // FIXME for CUDA: add GB_CUDA_INC here: "-I/usr/local/cuda/include -std=c++17 " " --gpu-architecture=compute_%d%d" // major,minor " --gpu-code=sm_%d%d " // major,minor " -fPIC " - // Fixme for CUDA: add GB_CUDA_FLAGS here: - " -O3 " // HACK Fixme for CUDA + // FIXME for CUDA: add GB_CUDA_FLAGS here: + " -O3 " // HACK FIXME for CUDA + " -Wno-deprecated-gpu-targets " "-I'%s/src' " // include source directory "-I'%s/src/template' " "-I'%s/src/include' " @@ -2604,6 +2605,7 @@ void GB_jitifyer_nvcc_compile "nvcc " // compiler "-DGB_JIT_RUNTIME=1 " // nvcc flags "-I/usr/local/cuda/include -std=c++17 " + " -Wno-deprecated-gpu-targets " " --gpu-architecture=compute_%d%d" // major,minor " --gpu-code=sm_%d%d " // major,minor " -shared " diff --git a/GraphBLAS/Source/jitifyer/GB_macrofy_subref.c b/GraphBLAS/Source/jitifyer/GB_macrofy_subref.c index f05a61f42..dbad58bbd 100644 --- a/GraphBLAS/Source/jitifyer/GB_macrofy_subref.c +++ b/GraphBLAS/Source/jitifyer/GB_macrofy_subref.c @@ -24,9 +24,13 @@ void GB_macrofy_subref // construct all macros for GrB_extract // extract the subref method_code //-------------------------------------------------------------------------- - // C, A integer sizes (2 hex digits) - bool Ihead_is_32 = GB_RSHIFT (method_code, 22, 1) ; + // R integer sizes and sparsity + bool Rp_is_32 = GB_RSHIFT (method_code, 27, 1) ; + bool Rj_is_32 = GB_RSHIFT (method_code, 26, 1) ; + bool Ri_is_32 = GB_RSHIFT (method_code, 25, 1) ; + int rsparsity = GB_RSHIFT (method_code, 23, 2) ; + // C, A integer sizes (2 hex digits) bool Cp_is_32 = GB_RSHIFT (method_code, 21, 1) ; bool Cj_is_32 = GB_RSHIFT (method_code, 20, 1) ; bool Ci_is_32 = GB_RSHIFT (method_code, 19, 1) ; @@ -35,10 +39,10 @@ void GB_macrofy_subref // construct all macros for GrB_extract bool Aj_is_32 = GB_RSHIFT (method_code, 17, 1) ; bool Ai_is_32 = GB_RSHIFT (method_code, 16, 1) ; - // need_qsort, I_has_duplicates, I and J bits (1 hex digit) + // need_qsort, I and J bits (1 hex digit) bool I_is_32 = GB_RSHIFT (method_code, 15, 1) ; bool J_is_32 = GB_RSHIFT (method_code, 14, 1) ; - int ihasdupl = GB_RSHIFT (method_code, 13, 1) ; + // 13: unused int needqsort = GB_RSHIFT (method_code, 12, 1) ; // Ikind, Jkind (1 hex digit) @@ -74,12 +78,11 @@ void GB_macrofy_subref // construct all macros for GrB_extract // C and A are sparse/hypersparse // Jkind not needed for sparse subsref fprintf (fp, "#define GB_NEED_QSORT %d\n", needqsort) ; - fprintf (fp, "#define GB_I_HAS_DUPLICATES %d\n", ihasdupl) ; } else { // C and A are bitmap/full - // need_qsort, I_has_duplicates not needed for bitmap subsref + // need_qsort not needed for bitmap subsref fprintf (fp, "#define GB_J_KIND ") ; switch (Jkind) { @@ -92,8 +95,6 @@ void GB_macrofy_subref // construct all macros for GrB_extract fprintf (fp, "#define GB_J_TYPE uint%d_t\n", J_is_32 ? 32 : 64) ; } - fprintf (fp, "#define GB_IHEAD_TYPE uint%d_t\n", Ihead_is_32 ? 32 : 64) ; - //-------------------------------------------------------------------------- // construct the typedefs //-------------------------------------------------------------------------- @@ -101,7 +102,7 @@ void GB_macrofy_subref // construct all macros for GrB_extract GB_macrofy_typedefs (fp, ctype, NULL, NULL, NULL, NULL, NULL, NULL) ; //-------------------------------------------------------------------------- - // construct the macros for C and A + // construct the macros for C, A, and R //-------------------------------------------------------------------------- GB_macrofy_sparsity (fp, "C", csparsity) ; @@ -115,6 +116,11 @@ void GB_macrofy_subref // construct all macros for GrB_extract GB_macrofy_type (fp, "A", "_", atype->name) ; GB_macrofy_bits (fp, "A", Ap_is_32, Aj_is_32, Ai_is_32) ; + // R is always GrB_UINT64, and iso-valued (its values are not used) + GB_macrofy_sparsity (fp, "R", rsparsity) ; + GB_macrofy_nvals (fp, "R", rsparsity, false) ; + GB_macrofy_bits (fp, "R", Rp_is_32, Rj_is_32, Ri_is_32) ; + //-------------------------------------------------------------------------- // include the final default definitions //-------------------------------------------------------------------------- diff --git a/GraphBLAS/Source/jitifyer/GB_stringify.h b/GraphBLAS/Source/jitifyer/GB_stringify.h index 677087166..188f55961 100644 --- a/GraphBLAS/Source/jitifyer/GB_stringify.h +++ b/GraphBLAS/Source/jitifyer/GB_stringify.h @@ -1573,6 +1573,7 @@ GrB_Info GB_masker_phase1_jit // count nnz in each R(:,j) const int64_t *restrict R_to_Z, const bool Rp_is_32, // if true, Rp is 32-bit; else 64-bit const bool Rj_is_32, // if true, Rh is 32-bit; else 64-bit + const int R_sparsity, // GxB_SPARSE or GxB_HYPERSPARSE // original input: const GrB_Matrix M, // required mask const bool Mask_comp, // if true, then M is complemented @@ -1592,6 +1593,7 @@ GrB_Info GB_masker_phase2_jit // phase2 for R = masker (C,M,Z) const int64_t *restrict R_to_M, const int64_t *restrict R_to_C, const int64_t *restrict R_to_Z, + const int R_sparsity, // any sparsity format // original input: const GrB_Matrix M, // required mask const bool Mask_comp, // if true, then M is complemented @@ -1614,7 +1616,8 @@ uint64_t GB_encodify_masker // encode a masker problem char **suffix, // suffix for user-defined kernel // input: const GB_jit_kcode kcode, // kernel to encode - const GrB_Matrix R, // may be NULL, for phase1 + const int R_sparsity, // GxB_SPARSE or GxB_HYPERSPARSE + const GrB_Type rtype, const bool Rp_is_32, // if true, R->p is 32 bit; else 64 bit const bool Rj_is_32, // if true, R->h is 32 bit; else 64 bit const bool Ri_is_32, // if true, R->i is 32 bit; else 64 bit @@ -1630,7 +1633,8 @@ void GB_enumify_masker // enumify a masker problem // output: uint64_t *method_code, // unique encoding of the entire operation // input: - const GrB_Matrix R, // NULL for phase 1 + const int R_sparsity, // GxB_SPARSE or GxB_HYPERSPARSE + const GrB_Type rtype, // the type of R (NULL for phase1) const bool Rp_is_32, // if true, R->p is 32-bit; else 64-bit const bool Rj_is_32, // if true, R->h is 32-bit; else 64-bit const bool Ri_is_32, // if true, R->i is 32-bit; else 64-bit @@ -1670,8 +1674,7 @@ uint64_t GB_encodify_subref // encode an subref problem int Ikind, // 0: all (no I), 1: range, 2: stride, 3: list int Jkind, // ditto, or 0 if not used bool need_qsort, // true if qsort needs to be called - bool Ihead_is_32, // if true, Ihead/Inext 32-bit; else 64 - bool I_has_duplicates, // true if I has duplicate entries + const GrB_Matrix R, // R = inverse (I), if needed // A matrix: GrB_Matrix A ) ; @@ -1688,8 +1691,7 @@ void GB_enumify_subref // enumerate a GrB_extract problem int Ikind, // 0: all (no I), 1: range, 2: stride, 3: list int Jkind, // ditto, or 0 if not used bool need_qsort, // true if qsort needs to be called - bool Ihead_is_32, // if true, Ihead/Inext 32-bit; else 64 - bool I_has_duplicates, // true if I has duplicate entries + const GrB_Matrix R, // R = inverse (I), if needed // A matrix: GrB_Matrix A ) ; @@ -1712,10 +1714,7 @@ GrB_Info GB_subref_sparse_jit const int ntasks, // # of tasks const int nthreads, // # of threads to use const bool post_sort, // true if post-sort needed - const void *Ihead, // for I inverse buckets, size A->vlen - const void *Inext, // for I inverse buckets, size nI - const bool Ihead_is_32, // if true, Ihead/Inext 32-bit; else 64 - const bool I_has_duplicates, // true if I has duplicates + const GrB_Matrix R, // R = inverse (I), if needed // from phase0: const void *Ap_start, const void *Ap_end, diff --git a/GraphBLAS/Source/mask/GB_mask.h b/GraphBLAS/Source/mask/GB_mask.h index a5286fc66..0c2b5b113 100644 --- a/GraphBLAS/Source/mask/GB_mask.h +++ b/GraphBLAS/Source/mask/GB_mask.h @@ -54,6 +54,7 @@ GrB_Info GB_masker_phase1 // count nnz in each R(:,j) const int64_t *restrict R_to_Z, const bool Rp_is_32, const bool Rj_is_32, + const int R_sparsity, // GxB_SPARSE or GxB_HYPERSPARSE // original input: const GrB_Matrix M, // required mask const bool Mask_comp, // if true, then M is complemented @@ -85,7 +86,7 @@ GrB_Info GB_masker_phase2 // phase2 for R = masker (C,M,Z) const bool Rp_is_32, const bool Rj_is_32, const bool Ri_is_32, - const int R_sparsity, + const int R_sparsity, // any sparsity format // original input: const GrB_Matrix M, // required mask const bool Mask_comp, // if true, then M is complemented diff --git a/GraphBLAS/Source/mask/GB_masker.c b/GraphBLAS/Source/mask/GB_masker.c index 8fe8cc2d7..eb1eaf546 100644 --- a/GraphBLAS/Source/mask/GB_masker.c +++ b/GraphBLAS/Source/mask/GB_masker.c @@ -208,7 +208,7 @@ GrB_Info GB_masker // R = masker (C, M, Z) // from phase1a: TaskList, R_ntasks, R_nthreads, // from phase0: - Rnvec, Rh, R_to_M, R_to_C, R_to_Z, Rp_is_32, Rj_is_32, + Rnvec, Rh, R_to_M, R_to_C, R_to_Z, Rp_is_32, Rj_is_32, R_sparsity, // original input: M, Mask_comp, Mask_struct, C, Z, Werk) ; if (info != GrB_SUCCESS) diff --git a/GraphBLAS/Source/mask/GB_masker_phase1.c b/GraphBLAS/Source/mask/GB_masker_phase1.c index 5e23d999b..c7c6a0eaf 100644 --- a/GraphBLAS/Source/mask/GB_masker_phase1.c +++ b/GraphBLAS/Source/mask/GB_masker_phase1.c @@ -43,6 +43,7 @@ GrB_Info GB_masker_phase1 // count nnz in each R(:,j) const int64_t *restrict R_to_Z, const bool Rp_is_32, const bool Rj_is_32, + const int R_sparsity, // GxB_SPARSE or GxB_HYPERSPARSE // original input: const GrB_Matrix M, // required mask const bool Mask_comp, // if true, then M is complemented @@ -60,6 +61,7 @@ GrB_Info GB_masker_phase1 // count nnz in each R(:,j) ASSERT (Rp_handle != NULL) ; ASSERT (Rp_size_handle != NULL) ; ASSERT (Rnvec_nonempty != NULL) ; + ASSERT (R_sparsity == GxB_SPARSE || R_sparsity == GxB_HYPERSPARSE) ; ASSERT_MATRIX_OK (M, "M for mask phase1", GB0) ; ASSERT (!GB_ZOMBIES (M)) ; @@ -109,7 +111,7 @@ GrB_Info GB_masker_phase1 // count nnz in each R(:,j) R_ntasks, // # of tasks R_nthreads, // # of threads to use // analysis from phase0: - Rnvec, Rh, R_to_M, R_to_C, R_to_Z, Rp_is_32, Rj_is_32, + Rnvec, Rh, R_to_M, R_to_C, R_to_Z, Rp_is_32, Rj_is_32, R_sparsity, // original input: M, Mask_comp, Mask_struct, C, Z) ; diff --git a/GraphBLAS/Source/mask/GB_masker_phase2.c b/GraphBLAS/Source/mask/GB_masker_phase2.c index f7b2e4b93..52a01aaa6 100644 --- a/GraphBLAS/Source/mask/GB_masker_phase2.c +++ b/GraphBLAS/Source/mask/GB_masker_phase2.c @@ -65,7 +65,7 @@ GrB_Info GB_masker_phase2 // phase2 for R = masker (C,M,Z) const bool Rp_is_32, const bool Rj_is_32, const bool Ri_is_32, - const int R_sparsity, + const int R_sparsity, // any sparsity format // original input: const GrB_Matrix M, // required mask const bool Mask_comp, // if true, then M is complemented @@ -243,7 +243,8 @@ GrB_Info GB_masker_phase2 // phase2 for R = masker (C,M,Z) //---------------------------------------------------------------------- info = GB_masker_phase2_jit (R, TaskList, R_ntasks, R_nthreads, - R_to_M, R_to_C, R_to_Z, M, Mask_comp, Mask_struct, C, Z, + R_to_M, R_to_C, R_to_Z, R_sparsity, + M, Mask_comp, Mask_struct, C, Z, C_ek_slicing, C_ntasks, C_nthreads, M_ek_slicing, M_ntasks, M_nthreads) ; diff --git a/GraphBLAS/Source/memory/GB_calloc_memory.c b/GraphBLAS/Source/memory/GB_calloc_memory.c index a97ddbe70..b1978c78e 100644 --- a/GraphBLAS/Source/memory/GB_calloc_memory.c +++ b/GraphBLAS/Source/memory/GB_calloc_memory.c @@ -38,6 +38,7 @@ static inline void *GB_calloc_helper { // clear the block of memory with a parallel memset int nthreads_max = GB_Context_nthreads_max ( ) ; + // FIXME for CUDA: need to know if this is on the GPU or CPU GB_memset (p, 0, (*size), nthreads_max) ; } diff --git a/GraphBLAS/Source/memory/GB_memcpy.c b/GraphBLAS/Source/memory/GB_memcpy.c index ff075f957..38d69f230 100644 --- a/GraphBLAS/Source/memory/GB_memcpy.c +++ b/GraphBLAS/Source/memory/GB_memcpy.c @@ -22,7 +22,7 @@ void GB_memcpy // parallel memcpy ) { - // Fixme for CUDA: do: + // FIXME for CUDA: do (cpu,gpu) <= (cpu,gpu) memcpy's // cpu <- cpu (already done below) // cpu <- gpu (effectively done below but could be better) // gpu <- cpu (need this) diff --git a/GraphBLAS/Source/memory/GB_memset.c b/GraphBLAS/Source/memory/GB_memset.c index 0fcd20e0b..95af65c40 100644 --- a/GraphBLAS/Source/memory/GB_memset.c +++ b/GraphBLAS/Source/memory/GB_memset.c @@ -9,6 +9,8 @@ // Note that this function uses its own hard-coded chunk size. +// FIXME for CUDA: use CUDA memset if the array is on the GPU + #include "GB.h" #define GB_MEM_CHUNK (1024*1024) diff --git a/GraphBLAS/Source/mxm/GB_AxB_dot.c b/GraphBLAS/Source/mxm/GB_AxB_dot.c index 8c9be144d..23caedc76 100644 --- a/GraphBLAS/Source/mxm/GB_AxB_dot.c +++ b/GraphBLAS/Source/mxm/GB_AxB_dot.c @@ -200,7 +200,7 @@ GrB_Info GB_AxB_dot // dot product (multiple methods) info = GrB_NO_VALUE ; #if defined ( GRAPHBLAS_HAS_CUDA ) - if (!C_iso && // Fixme for CUDA, remove and create C iso on output + if (!C_iso && // FIXME for CUDA, remove and create C iso on output GB_cuda_AxB_dot3_branch (M, Mask_struct, A, B, semiring, flipxy)) { info = (GB_cuda_AxB_dot3 (C, M, Mask_struct, A, B, semiring, diff --git a/GraphBLAS/Source/pack_unpack/GxB_pack_HyperHash.c b/GraphBLAS/Source/pack_unpack/GxB_pack_HyperHash.c index 4a61ad595..daa884757 100644 --- a/GraphBLAS/Source/pack_unpack/GxB_pack_HyperHash.c +++ b/GraphBLAS/Source/pack_unpack/GxB_pack_HyperHash.c @@ -116,7 +116,7 @@ GrB_Info GxB_pack_HyperHash // move Y into A->Y (*Y) = NULL ; A->Y_shallow = false ; A->no_hyper_hash = false ; // A now has a hyper_hash matrix A->Y - ASSERT_MATRIX_OK (A, "A with new hyperhash", GB0) ; + ASSERT_MATRIX_OK (A, "A with new hyper_hash", GB0) ; return (GrB_SUCCESS) ; } diff --git a/GraphBLAS/Source/print/GB_matvec_check.c b/GraphBLAS/Source/print/GB_matvec_check.c index afe0f6ae2..0b927c175 100644 --- a/GraphBLAS/Source/print/GB_matvec_check.c +++ b/GraphBLAS/Source/print/GB_matvec_check.c @@ -112,13 +112,12 @@ GrB_Info GB_matvec_check // check a GraphBLAS matrix or vector GB_CHECK_MAGIC (A) ; - GB_Ap_DECLARE (Ap, const) ; GB_Ap_PTR (Ap, A) ; - GB_Ah_DECLARE (Ah, const) ; GB_Ah_PTR (Ah, A) ; - GB_Ai_DECLARE (Ai, const) ; GB_Ai_PTR (Ai, A) ; - GB_AYp_DECLARE (A_Yp, const) ; GB_AYp_PTR (A_Yp, A) ; - GB_AYi_DECLARE (A_Yi, const) ; GB_AYi_PTR (A_Yi, A) ; - GB_AYx_DECLARE (A_Yx, const) ; GB_AYx_PTR (A_Yx, A) ; - + GB_Ap_DECLARE (Ap, const) ; GB_Ap_PTR (Ap, A) ; + GB_Ah_DECLARE (Ah, const) ; GB_Ah_PTR (Ah, A) ; + GB_Ai_DECLARE (Ai, const) ; GB_Ai_PTR (Ai, A) ; + GB_MDECL (A_Yp, const, u) ; GB_GET_HYPER_PTR (A_Yp, A, p) ; + GB_MDECL (A_Yi, const, u) ; GB_GET_HYPER_PTR (A_Yi, A, i) ; + GB_MDECL (A_Yx, const, u) ; GB_GET_HYPER_PTR (A_Yx, A, x) ; const int8_t *restrict Ab = A->b ; //-------------------------------------------------------------------------- diff --git a/GraphBLAS/Source/select/GB_select_bitmap.c b/GraphBLAS/Source/select/GB_select_bitmap.c index 0f38cff73..dfd9f5dfd 100644 --- a/GraphBLAS/Source/select/GB_select_bitmap.c +++ b/GraphBLAS/Source/select/GB_select_bitmap.c @@ -86,7 +86,7 @@ GrB_Info GB_select_bitmap else { // Cx [0:anz-1] = Ax [0:anz-1] - // Fixme for CUDA: do this on the GPU if appropriate + // FIXME for CUDA: do this on the GPU if appropriate GB_memcpy (C->x, A->x, anz * asize, nthreads) ; } diff --git a/GraphBLAS/Source/select/GB_selector.c b/GraphBLAS/Source/select/GB_selector.c index 4d86498cc..f150985f2 100644 --- a/GraphBLAS/Source/select/GB_selector.c +++ b/GraphBLAS/Source/select/GB_selector.c @@ -193,7 +193,7 @@ GrB_Info GB_selector // the use_select_bitmap test above (the DIAG operator). The CUDA // select_sparse kernel will not work in this case, so make this go to // the CPU. - // Fixme CUDA: put the test of sparse(A) or hypersparse(A) in + // FIXME CUDA: put the test of sparse(A) or hypersparse(A) in // GB_cuda_select_branch. info = GB_cuda_select_sparse (C, C_iso, op, flipij, A, athunk, ythunk, Werk) ; diff --git a/GraphBLAS/Source/sort/GB_bitonic.c b/GraphBLAS/Source/sort/GB_bitonic.c new file mode 100644 index 000000000..99c4599d6 --- /dev/null +++ b/GraphBLAS/Source/sort/GB_bitonic.c @@ -0,0 +1,80 @@ + +// References: +// https://www.tools-of-computing.com/tc/CS/Sorts/bitonic_sort.htm +// https://sortingalgos.miraheze.org/wiki/Bitonic_Sort + +#include "sort/GB_sort.h" + +//------------------------------------------------------------------------------ +// GB_bitonic: bitonic sort +//------------------------------------------------------------------------------ + +GrB_Info GB_bitonic +( + int32_t *restrict A, // array of size n + int64_t n, // n does not need to be a power of 2 + int nthreads +) +{ + printf ("GB_bitonic: n %ld, nthreads %d\n", n, nthreads) ; + +// for CUDA variant: +// int tid = blockIdx.x * blockDim.x + threadIdx.x ; +// int nthreads = blockDim.x * gridDim.x ; +// int64_t oops = 0 ; + + int64_t Nhalf = n/2 ; + for (int64_t k = 2, stage = 1 ; k < 2*n ; k = k << 1, stage++) + { + bool dir = (((((n-1) >> stage) + 1) & 1) != 0) ; + for (int64_t j = k >> 1 ; j > 0 ; j = j >> 1) + { + uint64_t mask = j-1 ; + + // for CUDA variant: + // parallel loop for all threads in the threadblock: +// for (int64_t ipair = tid ; ipair < Nhalf ; ipair += nthreads) + + int64_t ipair ; + #pragma omp parallel for num_threads(nthreads) schedule(static) + for (ipair = 0 ; ipair < Nhalf ; ipair++) + { + // Consider the pair of entries A [ileft] and A [iright] where + // ileft < iright always holds. The ileft entry is obtained by + // inserting a 0-bit in ipair, where the lower bits of ipair + // (in the mask) are kept and the upper bits are shifted to the + // left by one. For example, when j = 8, mask = 7 = 0111 in + // binary, then ileft is obtained by shifting the upper bits + // (all but the lower 3) of ipair to the left by one bit + // position, inserting a zero bit. Thus, if ipair = 1101111 + // and j=8 then ileft = 1101o111 where o = 0 denotes the + // inserted bit in ileft. Then iright is obtained by setting + // the o bit to 1. Thus ileft < iright always holds. + int64_t ileft = ((ipair & ~mask) << 1) | (ipair & mask) ; + int64_t iright = ileft | j ; + // ensure that A [iright] is in the range A [0..n-1] + if (iright >= n) + { + /* oops++ ; */ + continue ; + } + // if desc is true, swap descending, else swap ascending + bool desc = (((ileft & k) != 0) == dir) ; + int aleft = A [ileft] ; + int aright = A [iright] ; + if (desc ? (aleft < aright) : (aleft > aright)) + { + // swap A [ileft] and A [iright] + A [ileft ] = aright ; + A [iright] = aleft ; + } + } + // for CUDA variant: + // syncthreads here + } + } + + // printf ("oops: %ld\n", oops) ; + return (GrB_SUCCESS) ; +} + diff --git a/GraphBLAS/Source/sort/GB_msort_1.c b/GraphBLAS/Source/sort/GB_msort_1.c index 292a0b28f..26fc42b1e 100644 --- a/GraphBLAS/Source/sort/GB_msort_1.c +++ b/GraphBLAS/Source/sort/GB_msort_1.c @@ -63,6 +63,15 @@ GrB_Info GB_msort_1 // sort array A of size 1-by-n //-------------------------------------------------------------------------- int nthreads = GB_nthreads (n, GB_MSORT_BASECASE, nthreads_max) ; + +#if 0 + // HACK: to test GB_bitonic: + if (A0_is_32) + { + return (GB_bitonic (A_0, n, nthreads)) ; + } +#endif + if (nthreads <= 1 || n <= GB_MSORT_BASECASE) { // sequential quicksort diff --git a/GraphBLAS/Source/sort/GB_sort.h b/GraphBLAS/Source/sort/GB_sort.h index ac480134d..f3cbcfa22 100644 --- a/GraphBLAS/Source/sort/GB_sort.h +++ b/GraphBLAS/Source/sort/GB_sort.h @@ -266,6 +266,17 @@ GrB_Info GB_msort_3 // sort array A of size 3-by-n int nthreads_max // max # of threads to use ) ; +//------------------------------------------------------------------------------ +// bitonic sort +//------------------------------------------------------------------------------ + +GrB_Info GB_bitonic +( + int32_t *restrict A, // array of size n + int64_t n, // n does not need to be a power of 2 + int nthreads +) ; + //------------------------------------------------------------------------------ // matrix sorting (for GxB_Matrix_sort and GxB_Vector_sort) //------------------------------------------------------------------------------ diff --git a/GraphBLAS/Source/wait/GB_wait.c b/GraphBLAS/Source/wait/GB_wait.c index 6cbfab9ac..2f443022c 100644 --- a/GraphBLAS/Source/wait/GB_wait.c +++ b/GraphBLAS/Source/wait/GB_wait.c @@ -339,7 +339,7 @@ GrB_Info GB_wait // finish all pending computations ASSERT_MATRIX_OK (S, "S after GB_wait:add", GB0) ; //-------------------------------------------------------------------------- - // check if the A->Y hyper-hash can be kept + // check if the A->Y hyper_hash can be kept //-------------------------------------------------------------------------- if (A->no_hyper_hash) diff --git a/GraphBLAS/Tcov/log_Dec3.txt b/GraphBLAS/Tcov/log_Dec3.txt new file mode 100644 index 000000000..0a30fa998 --- /dev/null +++ b/GraphBLAS/Tcov/log_Dec3.txt @@ -0,0 +1,335 @@ +03-Dec-2025 12:58:16 grbcov starting +total blocks: 19589 + +---------------------------------------------- [cover] +[malloc debugging turned on] +03-Dec 12:59:54 test303 0:(32,32,32) 0.3 sec 97: 19277 1.6% 297.1/s +03-Dec 12:59:54 test303 0:(32,32,32) 0.1 sec 3: 19273 1.6% 35.6/s +03-Dec 12:59:55 test303 0:(32,32,32) 0.1 sec 6: 19267 1.6% 72.7/s +03-Dec 12:59:55 test300 0:(32,32,32) 0.0 sec 134: 19131 2.3% 4780.4/s +03-Dec 13:00:00 test301 0:(32,32,32) 5.8 sec 309: 18822 3.9% 53.7/s +03-Dec 13:00:05 test301 0:(32,32,32) 4.6 sec 37: 18785 4.1% 8.0/s +03-Dec 13:00:05 test302 0:(32,32,32) 0.0 sec 47: 18738 4.3% 1796.6/s +03-Dec 13:00:05 test155 0:(32,32,32) 0.1 sec 207: 18531 5.4% 3698.2/s +03-Dec 13:00:05 test155 0:(32,32,32) 0.0 sec 33: 18498 5.6% 1424.4/s +03-Dec 13:00:05 test155 2:(32,64,32) 0.0 sec 6: 18492 5.6% 322.0/s +03-Dec 13:00:05 test155 2:(32,64,32) 0.0 sec : 18492 5.6% +03-Dec 13:00:05 test155 4:(64,32,32) 0.0 sec 2: 18490 5.6% 106.1/s +03-Dec 13:00:05 test155 4:(64,32,32) 0.0 sec : 18490 5.6% +[malloc debugging turned off] +03-Dec 13:00:05 test299 0:(32,32,32) 0.0 sec 18: 18472 5.7% 687.7/s +03-Dec 13:00:07 test298 0:(32,32,32) 1.7 sec 119: 18353 6.3% 68.3/s +03-Dec 13:00:07 test298 0:(32,32,32) 0.0 sec 37: 18316 6.5% 1948.1/s +03-Dec 13:00:07 test297 0:(32,32,32) 0.3 sec 129: 18187 7.2% 431.0/s +03-Dec 13:00:07 test295 0:(32,32,32) 0.0 sec 12: 18175 7.2% 440.6/s +03-Dec 13:00:07 test294 0:(32,32,32) 0.1 sec 15: 18160 7.3% 187.7/s +03-Dec 13:00:11 test293 0:(32,32,32) 3.6 sec 44: 18116 7.5% 12.3/s +03-Dec 13:00:11 test291 0:(32,32,32) 0.0 sec 12: 18104 7.6% 476.4/s +03-Dec 13:00:11 test291 1:(32,32,64) 0.0 sec 1: 18103 7.6% 3311.3/s +03-Dec 13:00:11 test291 2:(32,64,32) 0.0 sec 1: 18102 7.6% 4444.4/s +03-Dec 13:00:11 test291 4:(64,32,32) 0.0 sec 1: 18101 7.6% 4784.7/s +03-Dec 13:00:13 test290 0:(32,32,32) 1.6 sec 2: 18099 7.6% 1.2/s +03-Dec 13:00:13 test287 0:(32,32,32) 0.0 sec 32: 18067 7.8% 1053.4/s +03-Dec 13:00:13 test287 4:(64,32,32) 0.0 sec : 18067 7.8% +03-Dec 13:00:13 test286 0:(32,32,32) 0.8 sec 34: 18033 7.9% 45.2/s +03-Dec 13:00:13 test286 0:(32,32,32) 0.0 sec 9: 18024 8.0% 3250.3/s +03-Dec 13:00:14 test286 1:(32,32,64) 0.8 sec : 18024 8.0% +03-Dec 13:00:14 test286 1:(32,32,64) 0.0 sec 1: 18023 8.0% 998.0/s +03-Dec 13:00:15 test286 2:(32,64,32) 0.8 sec : 18023 8.0% +03-Dec 13:00:15 test286 2:(32,64,32) 0.0 sec : 18023 8.0% +03-Dec 13:00:16 test286 4:(64,32,32) 0.9 sec : 18023 8.0% +03-Dec 13:00:16 test286 4:(64,32,32) 0.0 sec : 18023 8.0% +03-Dec 13:00:17 test78 0:(32,32,32) 0.5 sec 18: 18005 8.1% 33.3/s +03-Dec 13:00:17 test78 0:(32,32,32) 0.0 sec : 18005 8.1% +03-Dec 13:00:17 test78 4:(64,32,32) 0.2 sec 1: 18004 8.1% 4.1/s +03-Dec 13:00:17 test78 4:(64,32,32) 0.0 sec : 18004 8.1% +03-Dec 13:00:18 test285 0:(32,32,32) 0.7 sec 33: 17971 8.3% 46.4/s +03-Dec 13:00:18 test285 0:(32,32,32) 0.0 sec 8: 17963 8.3% 1299.5/s +03-Dec 13:00:18 test247 0:(32,32,32) 0.2 sec 22: 17941 8.4% 109.1/s +03-Dec 13:00:18 test247 0:(32,32,32) 0.1 sec 5: 17936 8.4% 47.5/s +03-Dec 13:00:18 test109 0:(32,32,32) 0.2 sec 31: 17905 8.6% 184.0/s +03-Dec 13:00:18 test109 0:(32,32,32) 0.0 sec 2: 17903 8.6% 1693.5/s +03-Dec 13:00:18 test109 0:(32,32,32) 0.1 sec 21: 17882 8.7% 183.9/s +03-Dec 13:00:18 test109 0:(32,32,32) 0.0 sec 1: 17881 8.7% 1137.7/s +03-Dec 13:00:18 test138 0:(32,32,32) 0.1 sec 27: 17854 8.9% 199.3/s +03-Dec 13:00:18 test138 0:(32,32,32) 0.0 sec 1: 17853 8.9% 50.7/s +03-Dec 13:00:18 test172 0:(32,32,32) 0.1 sec 41: 17811 9.1% 642.7/s +03-Dec 13:00:18 test172 0:(32,32,32) 0.0 sec 4: 17807 9.1% 135.4/s +03-Dec 13:00:19 test174 0:(32,32,32) 0.2 sec 19: 17788 9.2% 92.6/s +03-Dec 13:00:19 test174 0:(32,32,32) 0.0 sec 6: 17782 9.2% 1139.2/s +03-Dec 13:00:19 test203 0:(32,32,32) 0.0 sec 14: 17768 9.3% 497.3/s +03-Dec 13:00:19 test213 0:(32,32,32) 0.1 sec 10: 17758 9.3% 96.1/s +03-Dec 13:00:19 test213 0:(32,32,32) 0.0 sec 1: 17757 9.4% 760.5/s +03-Dec 13:00:19 test216 0:(32,32,32) 0.0 sec 11: 17746 9.4% 347.7/s +03-Dec 13:00:19 test225 0:(32,32,32) 0.3 sec 23: 17723 9.5% 85.3/s +03-Dec 13:00:19 test225 0:(32,32,32) 0.1 sec 29: 17694 9.7% 574.3/s +03-Dec 13:00:19 test226 0:(32,32,32) 0.2 sec 11: 17683 9.7% 60.9/s +03-Dec 13:00:19 test226 0:(32,32,32) 0.0 sec 2: 17681 9.7% 451.0/s +03-Dec 13:00:19 test235 0:(32,32,32) 0.1 sec 19: 17662 9.8% 281.7/s +03-Dec 13:00:19 test235 0:(32,32,32) 0.0 sec 3: 17659 9.9% 302.0/s +03-Dec 13:00:19 test252 0:(32,32,32) 0.0 sec 15: 17644 9.9% 575.7/s +03-Dec 13:00:20 test253 0:(32,32,32) 0.1 sec 30: 17614 10.1% 513.4/s +03-Dec 13:00:20 test255 0:(32,32,32) 0.0 sec 8: 17606 10.1% 310.4/s +03-Dec 13:00:20 test257 0:(32,32,32) 0.5 sec 51: 17555 10.4% 101.2/s +03-Dec 13:00:20 test257 0:(32,32,32) 0.0 sec 2: 17553 10.4% 2314.8/s +03-Dec 13:00:20 test260 0:(32,32,32) 0.0 sec 3: 17550 10.4% 110.1/s +03-Dec 13:00:20 test261 0:(32,32,32) 0.0 sec 37: 17513 10.6% 1534.1/s +03-Dec 13:00:20 test262 0:(32,32,32) 0.0 sec 15: 17498 10.7% 618.7/s +03-Dec 13:00:20 test263 0:(32,32,32) 0.3 sec 12: 17486 10.7% 44.3/s +03-Dec 13:00:20 test263 0:(32,32,32) 0.0 sec 1: 17485 10.7% 660.9/s +03-Dec 13:00:20 test264 0:(32,32,32) 0.0 sec 146: 17339 11.5% 5611.1/s +03-Dec 13:00:21 test265 0:(32,32,32) 0.5 sec 11: 17328 11.5% 20.2/s +03-Dec 13:00:21 test265 0:(32,32,32) 0.0 sec 1: 17327 11.5% 944.3/s +03-Dec 13:00:21 test267 0:(32,32,32) 0.3 sec 16: 17311 11.6% 63.2/s +03-Dec 13:00:21 test269 0:(32,32,32) 0.0 sec 121: 17190 12.2% 3611.9/s +03-Dec 13:00:21 test271 0:(32,32,32) 0.0 sec 543: 16647 15.0% 11925.9/s +03-Dec 13:00:21 test272 0:(32,32,32) 0.0 sec 8: 16639 15.1% 302.2/s +03-Dec 13:00:21 test273 0:(32,32,32) 0.1 sec 122: 16517 15.7% 2091.9/s +03-Dec 13:00:22 test274 0:(32,32,32) 0.0 sec 119: 16398 16.3% 3592.3/s +03-Dec 13:00:22 test276 0:(32,32,32) 0.2 sec 1697: 14701 25.0% 6989.2/s +03-Dec 13:00:22 test277 0:(32,32,32) 0.0 sec 26: 14675 25.1% 1013.1/s +03-Dec 13:00:22 test279 0:(32,32,32) 0.0 sec 69: 14606 25.4% 2556.4/s +03-Dec 13:00:22 test281 0:(32,32,32) 0.0 sec 14: 14592 25.5% 529.8/s +03-Dec 13:00:22 test268 0:(32,32,32) 0.2 sec 4: 14588 25.5% 20.1/s +03-Dec 13:00:22 test268 0:(32,32,32) 0.0 sec 4: 14584 25.6% 650.1/s +03-Dec 13:00:22 test207 0:(32,32,32) 0.0 sec 11: 14573 25.6% 2383.5/s +03-Dec 13:00:22 test207 1:(32,32,64) 0.0 sec 1: 14572 25.6% 1136.4/s +03-Dec 13:00:23 test211 0:(32,32,32) 0.4 sec 14: 14558 25.7% 31.2/s +03-Dec 13:00:23 test211 0:(32,32,32) 0.0 sec 6: 14552 25.7% 1219.8/s +03-Dec 13:00:23 test183 0:(32,32,32) 0.1 sec 16: 14536 25.8% 108.1/s +03-Dec 13:00:23 test212 0:(32,32,32) 0.3 sec 9: 14527 25.8% 35.5/s +03-Dec 13:00:23 test212 0:(32,32,32) 0.0 sec 5: 14522 25.9% 2038.3/s +03-Dec 13:00:23 test219 0:(32,32,32) 0.0 sec 8: 14514 25.9% 279.1/s +03-Dec 13:00:23 test219 0:(32,32,32) 0.0 sec 4: 14510 25.9% 6369.4/s +[malloc debugging turned on] +03-Dec 13:00:23 test296 0:(32,32,32) 0.0 sec 23: 14487 26.0% 5738.5/s +03-Dec 13:00:23 test289 0:(32,32,32) 0.2 sec 74: 14413 26.4% 340.6/s +03-Dec 13:00:23 test288 0:(32,32,32) 0.0 sec 17: 14396 26.5% 644.4/s +03-Dec 13:00:23 test244 0:(32,32,32) 0.1 sec 23: 14373 26.6% 299.2/s +03-Dec 13:00:23 test244 1:(32,32,64) 0.0 sec 2: 14371 26.6% 67.7/s +03-Dec 13:00:23 test194 0:(32,32,32) 0.1 sec 24: 14347 26.8% 210.0/s +03-Dec 13:00:24 test09 0:(32,32,32) 0.3 sec 8: 14339 26.8% 29.0/s +03-Dec 13:00:24 test09 0:(32,32,32) 0.0 sec 4: 14335 26.8% 2059.7/s +03-Dec 13:00:24 test108 0:(32,32,32) 0.2 sec 51: 14284 27.1% 268.1/s +03-Dec 13:00:24 test108 0:(32,32,32) 0.0 sec 25: 14259 27.2% 654.3/s +03-Dec 13:00:24 test137 0:(32,32,32) 0.1 sec 13: 14246 27.3% 100.7/s +03-Dec 13:00:24 test137 0:(32,32,32) 0.0 sec 1: 14245 27.3% 338.4/s +03-Dec 13:00:24 test137 0:(32,32,32) 0.0 sec 1: 14244 27.3% 244.7/s +03-Dec 13:00:24 test124 0:(32,32,32) 0.2 sec 6: 14238 27.3% 31.3/s +03-Dec 13:00:29 test133 0:(32,32,32) 4.2 sec 10: 14228 27.4% 2.4/s +03-Dec 13:00:34 test133 0:(32,32,32) 5.0 sec 21: 14207 27.5% 4.2/s +03-Dec 13:00:35 test176 0:(32,32,32) 1.6 sec 25: 14182 27.6% 15.7/s +03-Dec 13:00:35 test176 0:(32,32,32) 0.1 sec 10: 14172 27.7% 132.9/s +03-Dec 13:00:35 test197 0:(32,32,32) 0.2 sec 12: 14160 27.7% 58.5/s +03-Dec 13:00:36 test197 0:(32,32,32) 0.2 sec 3: 14157 27.7% 15.4/s +03-Dec 13:00:36 test201 0:(32,32,32) 0.1 sec 23: 14134 27.8% 363.6/s +03-Dec 13:00:36 test208 0:(32,32,32) 0.1 sec 17: 14117 27.9% 252.7/s +03-Dec 13:00:36 test214 0:(32,32,32) 0.0 sec 39: 14078 28.1% 7656.1/s +03-Dec 13:00:36 test214 0:(32,32,32) 0.0 sec 5: 14073 28.2% 1702.4/s +03-Dec 13:00:36 test214 1:(32,32,64) 0.0 sec 1: 14072 28.2% 317.6/s +03-Dec 13:00:36 test214 1:(32,32,64) 0.0 sec : 14072 28.2% +03-Dec 13:00:36 test223 0:(32,32,32) 0.0 sec 11: 14061 28.2% 1262.0/s +03-Dec 13:00:36 test223 0:(32,32,32) 0.0 sec 1: 14060 28.2% 68.2/s +03-Dec 13:00:36 test241 0:(32,32,32) 0.1 sec 54: 14006 28.5% 784.0/s +03-Dec 13:00:36 test241 0:(32,32,32) 0.0 sec 8: 13998 28.5% 224.5/s +03-Dec 13:00:36 test270 0:(32,32,32) 0.0 sec 288: 13710 30.0% 8027.0/s +03-Dec 13:00:36 test199 0:(32,32,32) 0.0 sec 16: 13694 30.1% 4250.8/s +03-Dec 13:00:36 test210 0:(32,32,32) 0.1 sec : 13694 30.1% +03-Dec 13:00:36 test210 0:(32,32,32) 0.0 sec 3: 13691 30.1% 2765.0/s +03-Dec 13:00:36 test165 0:(32,32,32) 0.0 sec 13: 13678 30.2% 4701.6/s +03-Dec 13:00:36 test221 0:(32,32,32) 0.1 sec 6: 13672 30.2% 69.8/s +03-Dec 13:00:36 test221 0:(32,32,32) 0.0 sec 1: 13671 30.2% 624.2/s +03-Dec 13:00:36 test278 0:(32,32,32) 0.0 sec 53: 13618 30.5% 1847.8/s +03-Dec 13:00:36 test162 0:(32,32,32) 0.0 sec 20: 13598 30.6% 941.9/s +03-Dec 13:00:36 test162 0:(32,32,32) 0.0 sec 1: 13597 30.6% 40.4/s +03-Dec 13:00:36 test275 0:(32,32,32) 0.0 sec 27: 13570 30.7% 798.4/s +03-Dec 13:00:37 test220 0:(32,32,32) 0.2 sec 9: 13561 30.8% 54.7/s +03-Dec 13:00:37 test83 0:(32,32,32) 0.3 sec 7: 13554 30.8% 26.2/s +03-Dec 13:00:37 test83 0:(32,32,32) 0.0 sec 1: 13553 30.8% 1479.3/s +03-Dec 13:00:37 test04 0:(32,32,32) 0.6 sec 12: 13541 30.9% 20.1/s +03-Dec 13:00:37 test04 0:(32,32,32) 0.0 sec 8: 13533 30.9% 1220.8/s +03-Dec 13:00:37 test132 0:(32,32,32) 0.0 sec 9: 13524 31.0% 245.6/s +03-Dec 13:00:38 test82 0:(32,32,32) 0.4 sec 9: 13515 31.0% 23.1/s +03-Dec 13:00:38 test202 0:(32,32,32) 0.0 sec 71: 13444 31.4% 3970.9/s +03-Dec 13:00:38 test202 0:(32,32,32) 0.0 sec 2: 13442 31.4% 177.1/s +03-Dec 13:00:38 test202 0:(32,32,32) 0.0 sec 4: 13438 31.4% 372.4/s +03-Dec 13:00:38 test202 1:(32,32,64) 0.0 sec : 13438 31.4% +03-Dec 13:00:38 test202 1:(32,32,64) 0.0 sec 1: 13437 31.4% 86.5/s +03-Dec 13:00:38 test202 1:(32,32,64) 0.0 sec : 13437 31.4% +03-Dec 13:00:38 test202 2:(32,64,32) 0.0 sec 1: 13436 31.4% 105.8/s +03-Dec 13:00:38 test202 2:(32,64,32) 0.0 sec : 13436 31.4% +03-Dec 13:00:38 test202 2:(32,64,32) 0.0 sec : 13436 31.4% +03-Dec 13:00:38 test222 0:(32,32,32) 0.1 sec 40: 13396 31.6% 716.0/s +03-Dec 13:00:38 test204 0:(32,32,32) 0.0 sec 9: 13387 31.7% 356.8/s +03-Dec 13:00:38 test258 0:(32,32,32) 0.2 sec 13: 13374 31.7% 61.4/s +03-Dec 13:00:38 test258 0:(32,32,32) 0.0 sec 2: 13372 31.7% 1156.7/s +03-Dec 13:00:38 test258 1:(32,32,64) 0.1 sec 1: 13371 31.7% 18.4/s +03-Dec 13:00:38 test258 1:(32,32,64) 0.0 sec : 13371 31.7% +03-Dec 13:00:39 test136 0:(32,32,32) 1.0 sec 4: 13367 31.8% 3.8/s +03-Dec 13:00:39 test136 0:(32,32,32) 0.0 sec 53: 13314 32.0% 3349.3/s +03-Dec 13:00:40 test128 0:(32,32,32) 0.8 sec 52: 13262 32.3% 67.1/s +03-Dec 13:00:40 test128 0:(32,32,32) 0.1 sec 1: 13261 32.3% 8.9/s +03-Dec 13:00:41 test144 0:(32,32,32) 0.2 sec 5: 13256 32.3% 22.6/s +03-Dec 13:00:43 test81 0:(32,32,32) 2.3 sec 39: 13217 32.5% 16.6/s +[malloc debugging turned off] +03-Dec 13:00:43 testc2(0,0) 0:(32,32,32) 0.4 sec 172: 13045 33.4% 390.2/s +03-Dec 13:00:44 testc2(0,0) 1:(32,32,64) 0.3 sec 1: 13044 33.4% 3.6/s +03-Dec 13:00:44 test239 0:(32,32,32) 0.0 sec 10: 13034 33.5% 1143.1/s +03-Dec 13:00:44 test239 0:(32,32,32) 0.3 sec 1: 13033 33.5% 3.1/s +03-Dec 13:00:44 test245 0:(32,32,32) 0.3 sec 32: 13001 33.6% 93.5/s +03-Dec 13:00:44 test245 0:(32,32,32) 0.0 sec 8: 12993 33.7% 1889.9/s +03-Dec 13:00:45 test159 0:(32,32,32) 0.3 sec 39: 12954 33.9% 127.0/s +03-Dec 13:00:46 test259 0:(32,32,32) 1.0 sec 27: 12927 34.0% 28.3/s +03-Dec 13:00:46 test259 0:(32,32,32) 0.0 sec 1: 12926 34.0% 147.7/s +03-Dec 13:00:47 testc4(0) 0:(32,32,32) 1.1 sec 11: 12915 34.1% 10.3/s +03-Dec 13:00:47 test157 0:(32,32,32) 0.6 sec 42: 12873 34.3% 66.2/s +03-Dec 13:00:49 test182 0:(32,32,32) 1.9 sec 22: 12851 34.4% 11.9/s +03-Dec 13:00:49 test182 0:(32,32,32) 0.3 sec 13: 12838 34.5% 49.9/s +03-Dec 13:00:51 test195 0:(32,32,32) 1.9 sec 62: 12776 34.8% 32.7/s +03-Dec 13:00:55 test135 0:(32,32,32) 3.8 sec 43: 12733 35.0% 11.3/s +03-Dec 13:00:55 test215 0:(32,32,32) 0.1 sec 2: 12731 35.0% 23.9/s +03-Dec 13:00:57 test80 0:(32,32,32) 2.2 sec 11: 12720 35.1% 4.9/s +03-Dec 13:00:58 test200 0:(32,32,32) 0.7 sec 11: 12709 35.1% 15.8/s +03-Dec 13:01:00 test283 0:(32,32,32) 2.2 sec 94: 12615 35.6% 43.0/s +03-Dec 13:01:02 test283 1:(32,32,64) 1.5 sec 1: 12614 35.6% 0.7/s +03-Dec 13:01:02 test254 0:(32,32,32) 0.3 sec 25: 12589 35.7% 93.2/s +03-Dec 13:01:03 test254 0:(32,32,32) 1.1 sec 1: 12588 35.7% 0.9/s +03-Dec 13:01:06 test54 0:(32,32,32) 3.1 sec 26: 12561 35.9% 8.4/s +03-Dec 13:01:08 test54 0:(32,32,32) 1.3 sec 13: 12548 35.9% 10.2/s +03-Dec 13:01:10 testcc(1) 0:(32,32,32) 2.2 sec 10: 12538 36.0% 4.4/s +03-Dec 13:01:11 testcc(1) 0:(32,32,32) 1.4 sec 6: 12532 36.0% 4.3/s +03-Dec 13:01:12 testc2(1,1) 0:(32,32,32) 0.3 sec 11: 12521 36.1% 37.6/s +03-Dec 13:01:14 testc2(1,1) 0:(32,32,32) 2.7 sec 3: 12518 36.1% 1.1/s +03-Dec 13:01:16 test141 0:(32,32,32) 1.4 sec 521: 11997 38.8% 378.2/s +03-Dec 13:01:16 test179 0:(32,32,32) 0.0 sec 22: 11975 38.9% 481.3/s +03-Dec 13:01:16 test179 0:(32,32,32) 0.7 sec 10: 11965 38.9% 14.4/s +03-Dec 13:01:16 test188b 0:(32,32,32) 0.0 sec 39: 11926 39.1% 1009.2/s +03-Dec 13:01:17 test185 0:(32,32,32) 0.0 sec 23: 11903 39.2% 511.2/s +03-Dec 13:01:17 test256 0:(32,32,32) 0.2 sec 38: 11865 39.4% 174.0/s +03-Dec 13:01:17 test256 0:(32,32,32) 0.0 sec : 11865 39.4% +03-Dec 13:01:17 test256 1:(32,32,64) 0.2 sec 1: 11864 39.4% 5.3/s +03-Dec 13:01:17 test256 1:(32,32,64) 0.0 sec : 11864 39.4% +03-Dec 13:01:18 test238b 0:(32,32,32) 0.7 sec 31: 11833 39.6% 44.5/s +03-Dec 13:01:18 test238 0:(32,32,32) 0.5 sec 64: 11769 39.9% 131.7/s +03-Dec 13:01:19 test186 0:(32,32,32) 0.9 sec 25: 11744 40.0% 27.5/s +03-Dec 13:01:19 test186 0:(32,32,32) 0.1 sec : 11744 40.0% +03-Dec 13:01:19 test186 0:(32,32,32) 0.1 sec : 11744 40.0% +[malloc debugging turned on] +03-Dec 13:01:21 testca(1) 0:(32,32,32) 1.7 sec 38: 11706 40.2% 21.8/s +03-Dec 13:01:23 testca(1) 0:(32,32,32) 1.7 sec 2: 11704 40.3% 1.2/s +03-Dec 13:01:23 test148 0:(32,32,32) 0.5 sec 7: 11697 40.3% 14.2/s +03-Dec 13:01:23 test148 0:(32,32,32) 0.0 sec 4: 11693 40.3% 1497.6/s +03-Dec 13:01:25 test231 0:(32,32,32) 1.7 sec 385: 11308 42.3% 231.3/s +03-Dec 13:01:26 test129 0:(32,32,32) 0.7 sec 10: 11298 42.3% 15.1/s +03-Dec 13:01:31 test69 0:(32,32,32) 5.2 sec 31: 11267 42.5% 6.0/s +03-Dec 13:01:35 test69 0:(32,32,32) 4.0 sec 12: 11255 42.5% 3.0/s +03-Dec 13:01:37 test29 0:(32,32,32) 2.0 sec 151: 11104 43.3% 77.0/s +03-Dec 13:01:39 test29 0:(32,32,32) 1.9 sec 2: 11102 43.3% 1.1/s +03-Dec 13:01:40 test29 1:(32,32,64) 1.8 sec 2: 11100 43.3% 1.1/s +03-Dec 13:01:42 test29 1:(32,32,64) 1.8 sec : 11100 43.3% +03-Dec 13:01:43 test282 0:(32,32,32) 0.3 sec 15: 11085 43.4% 45.1/s +03-Dec 13:01:43 test249 0:(32,32,32) 0.4 sec 18: 11067 43.5% 44.6/s +03-Dec 13:01:43 test249 0:(32,32,32) 0.4 sec 1: 11066 43.5% 2.7/s +03-Dec 13:01:44 test196 0:(32,32,32) 0.5 sec 18: 11048 43.6% 33.6/s +03-Dec 13:01:44 test250 0:(32,32,32) 0.5 sec 69: 10979 44.0% 137.0/s +03-Dec 13:01:45 test250 0:(32,32,32) 0.6 sec 4: 10975 44.0% 6.2/s +03-Dec 13:01:46 test145 0:(32,32,32) 0.7 sec 22: 10953 44.1% 30.4/s +03-Dec 13:01:46 test145 0:(32,32,32) 0.0 sec 6: 10947 44.1% 1109.1/s +03-Dec 13:01:52 test229 0:(32,32,32) 6.6 sec 14: 10933 44.2% 2.1/s +03-Dec 13:01:54 test209 0:(32,32,32) 2.0 sec 43: 10890 44.4% 21.5/s +03-Dec 13:01:56 test209 1:(32,32,64) 2.0 sec 1: 10889 44.4% 0.5/s +03-Dec 13:01:58 test224 0:(32,32,32) 1.5 sec 60: 10829 44.7% 39.7/s +03-Dec 13:01:58 test191 0:(32,32,32) 0.4 sec 26: 10803 44.9% 61.5/s +03-Dec 13:01:58 test191 0:(32,32,32) 0.1 sec 2: 10801 44.9% 20.8/s +03-Dec 13:01:59 test150 0:(32,32,32) 0.0 sec 20: 10781 45.0% 553.7/s +03-Dec 13:01:59 test240 0:(32,32,32) 0.3 sec 26: 10755 45.1% 86.5/s +03-Dec 13:01:59 test240 0:(32,32,32) 0.4 sec 1: 10754 45.1% 2.8/s +03-Dec 13:02:00 test237 0:(32,32,32) 0.3 sec 10: 10744 45.2% 32.4/s +03-Dec 13:02:00 test237 0:(32,32,32) 0.0 sec 1: 10743 45.2% 103.3/s +03-Dec 13:02:00 test237 0:(32,32,32) 0.0 sec 1: 10742 45.2% 95.9/s +03-Dec 13:02:00 test237 0:(32,32,32) 0.0 sec 1: 10741 45.2% 110.8/s +03-Dec 13:02:01 test184 0:(32,32,32) 1.1 sec 7: 10734 45.2% 6.3/s +03-Dec 13:02:04 test236 0:(32,32,32) 3.4 sec 117: 10617 45.8% 33.9/s +[malloc debugging turned off] +03-Dec 13:02:15 test84 0:(32,32,32) 10.8 sec 15: 10602 45.9% 1.4/s +03-Dec 13:02:15 test84 0:(32,32,32) 0.4 sec 32: 10570 46.0% 76.7/s +03-Dec 13:02:25 test84 2:(32,64,32) 9.3 sec 1: 10569 46.0% 0.1/s +03-Dec 13:02:25 test84 2:(32,64,32) 0.4 sec : 10569 46.0% +03-Dec 13:02:26 test84 0:(32,32,32) 0.5 sec : 10569 46.0% +03-Dec 13:02:26 test84 0:(32,32,32) 0.5 sec 4: 10565 46.1% 8.3/s +03-Dec 13:02:26 test84 2:(32,64,32) 0.5 sec 1: 10564 46.1% 2.2/s +03-Dec 13:02:27 test84 2:(32,64,32) 0.5 sec : 10564 46.1% +03-Dec 13:02:45 test173 0:(32,32,32) 17.6 sec 20: 10544 46.2% 1.1/s +03-Dec 13:02:45 test173 0:(32,32,32) 0.4 sec 4: 10540 46.2% 9.9/s +03-Dec 13:02:57 test230 0:(32,32,32) 11.8 sec 250: 10290 47.5% 21.3/s +03-Dec 13:02:58 test230 0:(32,32,32) 1.7 sec 2: 10288 47.5% 1.2/s +03-Dec 13:03:10 test18 0:(32,32,32) 12.0 sec 91: 10197 47.9% 7.6/s +03-Dec 13:03:13 test18 0:(32,32,32) 2.9 sec 7: 10190 48.0% 2.4/s +03-Dec 13:03:55 testc7(0) 0:(32,32,32) 41.5 sec 12: 10178 48.0% 0.3/s +03-Dec 13:04:01 testc7(0) 0:(32,32,32) 6.1 sec 11: 10167 48.1% 1.8/s +03-Dec 13:04:27 test193 0:(32,32,32) 25.9 sec 200: 9967 49.1% 7.7/s +03-Dec 13:04:30 test127 0:(32,32,32) 2.8 sec 929: 9038 53.9% 335.7/s +03-Dec 13:04:34 test23 0:(32,32,32) 4.5 sec 61: 8977 54.2% 13.7/s +03-Dec 13:04:41 test243 0:(32,32,32) 6.5 sec 7: 8970 54.2% 1.1/s +03-Dec 13:05:43 test53 0:(32,32,32) 61.8 sec 38: 8932 54.4% 0.6/s +03-Dec 13:05:47 test53 0:(32,32,32) 4.1 sec 5: 8927 54.4% 1.2/s +03-Dec 13:05:59 test242 0:(32,32,32) 12.4 sec 45: 8882 54.7% 3.6/s +03-Dec 13:06:10 test17 0:(32,32,32) 11.2 sec 32: 8850 54.8% 2.9/s +03-Dec 13:06:20 test246 0:(32,32,32) 9.8 sec 5: 8845 54.8% 0.5/s +03-Dec 13:06:25 test251b 0:(32,32,32) 5.3 sec 26: 8819 55.0% 4.9/s +03-Dec 13:06:36 test251 0:(32,32,32) 10.9 sec 100: 8719 55.5% 9.1/s +03-Dec 13:06:49 test152 0:(32,32,32) 12.5 sec 190: 8529 56.5% 15.2/s +03-Dec 13:07:03 test152 0:(32,32,32) 13.9 sec 123: 8406 57.1% 8.9/s +03-Dec 13:07:05 test160 0:(32,32,32) 2.6 sec 17: 8389 57.2% 6.6/s +03-Dec 13:07:41 test232 0:(32,32,32) 35.5 sec 58: 8331 57.5% 1.6/s +03-Dec 13:07:41 test232 0:(32,32,32) 0.5 sec 5: 8326 57.5% 10.5/s +03-Dec 13:07:43 test142b 0:(32,32,32) 1.7 sec 10: 8316 57.5% 6.0/s +03-Dec 13:07:43 test142b 0:(32,32,32) 0.0 sec 3: 8313 57.6% 147.7/s +03-Dec 13:08:36 test142 0:(32,32,32) 53.2 sec 304: 8009 59.1% 5.7/s +03-Dec 13:09:46 test227 0:(32,32,32) 69.9 sec 15: 7994 59.2% 0.2/s +03-Dec 13:09:55 test292 0:(32,32,32) 8.2 sec 1: 7993 59.2% 0.1/s +03-Dec 13:09:56 test192 0:(32,32,32) 1.2 sec 3: 7990 59.2% 2.6/s +03-Dec 13:10:05 test181 0:(32,32,32) 8.8 sec 4: 7986 59.2% 0.5/s +03-Dec 13:10:09 test181 0:(32,32,32) 4.7 sec 11: 7975 59.3% 2.3/s +[malloc debugging turned on] +03-Dec 13:10:27 test130 0:(32,32,32) 17.3 sec 8: 7967 59.3% 0.5/s +03-Dec 13:10:27 test130 0:(32,32,32) 0.4 sec 5: 7962 59.4% 12.8/s +03-Dec 13:10:28 test206 0:(32,32,32) 0.7 sec 86: 7876 59.8% 124.6/s +03-Dec 13:10:33 test206 0:(32,32,32) 4.9 sec 12: 7864 59.9% 2.4/s +03-Dec 13:10:48 test02 0:(32,32,32) 15.5 sec 3: 7861 59.9% 0.2/s +03-Dec 13:11:40 test11 0:(32,32,32) 51.3 sec 17: 7844 60.0% 0.3/s +03-Dec 13:11:46 test187 0:(32,32,32) 5.5 sec 5: 7839 60.0% 0.9/s +03-Dec 13:11:48 test187 0:(32,32,32) 2.2 sec 1: 7838 60.0% 0.5/s +03-Dec 13:11:50 test169 0:(32,32,32) 2.7 sec 32: 7806 60.2% 12.0/s +03-Dec 13:11:54 test76 0:(32,32,32) 4.0 sec 14: 7792 60.2% 3.5/s +03-Dec 13:12:03 test01 0:(32,32,32) 8.4 sec 591: 7201 63.2% 70.0/s +03-Dec 13:12:08 test01 0:(32,32,32) 4.9 sec 4: 7197 63.3% 0.8/s +03-Dec 13:12:12 test228 0:(32,32,32) 4.1 sec 25: 7172 63.4% 6.1/s +03-Dec 13:12:17 test104 0:(32,32,32) 5.2 sec 35: 7137 63.6% 6.7/s +03-Dec 13:13:20 test284 0:(32,32,32) 63.3 sec 68: 7069 63.9% 1.1/s +03-Dec 13:13:23 test284 0:(32,32,32) 2.1 sec 4: 7065 63.9% 1.9/s +03-Dec 13:13:44 test180 0:(32,32,32) 21.2 sec 21: 7044 64.0% 1.0/s +03-Dec 13:13:51 test180 0:(32,32,32) 7.1 sec 91: 6953 64.5% 12.8/s +03-Dec 13:14:00 test188 0:(32,32,32) 8.6 sec 169: 6784 65.4% 19.7/s +03-Dec 13:14:29 test151b 0:(32,32,32) 28.9 sec 34: 6750 65.5% 1.2/s +03-Dec 13:14:29 test151b 0:(32,32,32) 0.2 sec 18: 6732 65.6% 81.2/s +03-Dec 13:14:52 test14b 0:(32,32,32) 22.9 sec 95: 6637 66.1% 4.2/s +03-Dec 13:15:19 test14 0:(32,32,32) 27.1 sec 257: 6380 67.4% 9.5/s +[malloc debugging turned off] +03-Dec 13:15:50 test125 0:(32,32,32) 31.2 sec 319: 6061 69.1% 10.2/s +03-Dec 13:17:02 test10 0:(32,32,32) 72.0 sec 702: 5359 72.6% 9.8/s +03-Dec 13:17:39 test75b 0:(32,32,32) 37.0 sec 293: 5066 74.1% 7.9/s +03-Dec 13:18:09 test74 0:(32,32,32) 29.9 sec 4101: 965 95.1% 137.4/s +03-Dec 13:20:40 test234 0:(32,32,32) 150.9 sec 198: 767 96.1% 1.3/s +[malloc debugging turned on] +03-Dec 13:20:40 test154b 0:(32,32,32) 0.0 sec 12: 755 96.1% 506.2/s +03-Dec 13:22:44 test154 0:(32,32,32) 124.2 sec 657: 98 99.5% 5.3/s +03-Dec 13:23:58 test21b 0:(32,32,32) 73.1 sec 64: 34 99.8% 0.9/s +03-Dec 13:28:08 test19b 0:(32,32,32) 249.9 sec 20: 14 99.9% 0.1/s +03-Dec 13:28:10 test19b 0:(32,32,32) 1.6 sec 4: 10 99.9% 2.5/s +[malloc debugging turned off] +03-Dec 13:30:46 test19 0:(32,32,32) 155.8 sec 7: 3 99.9% 0.0/s +03-Dec 13:30:47 test19 0:(32,32,32) 1.0 sec 2: 1 99.9% 2.1/s +03-Dec 13:30:47 test280(0) 0:(32,32,32) 0.0 sec 1: all 100% 20.3/s +[malloc debugging turned off] +03-Dec-2025 13:30:47 grbcov ending diff --git a/GraphBLAS/Tcov/log_Nov5.txt b/GraphBLAS/Tcov/log_Nov5.txt new file mode 100644 index 000000000..11a4cabb9 --- /dev/null +++ b/GraphBLAS/Tcov/log_Nov5.txt @@ -0,0 +1,332 @@ +05-Nov-2025 15:02:41 grbcov starting +total blocks: 19591 + +---------------------------------------------- [cover] +[malloc debugging turned on] +05-Nov 15:04:18 test300 0:(32,32,32) 0.0 sec 139: 19236 1.8% 9610.1/s +05-Nov 15:04:24 test301 0:(32,32,32) 5.8 sec 370: 18866 3.7% 63.3/s +05-Nov 15:04:29 test301 0:(32,32,32) 4.8 sec 38: 18828 3.9% 7.9/s +05-Nov 15:04:29 test302 0:(32,32,32) 0.0 sec 47: 18781 4.1% 3032.5/s +05-Nov 15:04:29 test155 0:(32,32,32) 0.0 sec 227: 18554 5.3% 5462.9/s +05-Nov 15:04:29 test155 0:(32,32,32) 0.0 sec 33: 18521 5.5% 1378.2/s +05-Nov 15:04:29 test155 2:(32,64,32) 0.0 sec 9: 18512 5.5% 460.1/s +05-Nov 15:04:29 test155 2:(32,64,32) 0.0 sec : 18512 5.5% +05-Nov 15:04:29 test155 4:(64,32,32) 0.0 sec 3: 18509 5.5% 156.6/s +05-Nov 15:04:29 test155 4:(64,32,32) 0.0 sec : 18509 5.5% +[malloc debugging turned off] +05-Nov 15:04:29 test299 0:(32,32,32) 0.0 sec 13: 18496 5.6% 816.5/s +05-Nov 15:04:31 test298 0:(32,32,32) 1.6 sec 142: 18354 6.3% 86.7/s +05-Nov 15:04:31 test298 0:(32,32,32) 0.0 sec 38: 18316 6.5% 1968.5/s +05-Nov 15:04:31 test297 0:(32,32,32) 0.3 sec 129: 18187 7.2% 452.8/s +05-Nov 15:04:31 test295 0:(32,32,32) 0.0 sec 12: 18173 7.2% 752.1/s +05-Nov 15:04:31 test294 0:(32,32,32) 0.1 sec 14: 18159 7.3% 190.0/s +05-Nov 15:04:34 test293 0:(32,32,32) 3.2 sec 44: 18115 7.5% 13.8/s +05-Nov 15:04:34 test291 0:(32,32,32) 0.0 sec 12: 18103 7.6% 767.9/s +05-Nov 15:04:34 test291 1:(32,32,64) 0.0 sec 1: 18102 7.6% 3225.8/s +05-Nov 15:04:34 test291 2:(32,64,32) 0.0 sec 1: 18101 7.6% 3773.6/s +05-Nov 15:04:34 test291 4:(64,32,32) 0.0 sec 1: 18100 7.6% 3703.7/s +05-Nov 15:04:36 test290 0:(32,32,32) 1.7 sec 2: 18098 7.6% 1.2/s +05-Nov 15:04:36 test287 0:(32,32,32) 0.0 sec 29: 18069 7.8% 1400.2/s +05-Nov 15:04:36 test287 4:(64,32,32) 0.0 sec : 18069 7.8% +05-Nov 15:04:37 test286 0:(32,32,32) 0.8 sec 40: 18029 8.0% 49.4/s +05-Nov 15:04:37 test286 0:(32,32,32) 0.0 sec 9: 18020 8.0% 2328.0/s +05-Nov 15:04:38 test286 1:(32,32,64) 0.9 sec : 18020 8.0% +05-Nov 15:04:38 test286 1:(32,32,64) 0.0 sec 1: 18019 8.0% 854.7/s +05-Nov 15:04:39 test286 2:(32,64,32) 0.8 sec : 18019 8.0% +05-Nov 15:04:39 test286 2:(32,64,32) 0.0 sec : 18019 8.0% +05-Nov 15:04:40 test286 4:(64,32,32) 0.9 sec : 18019 8.0% +05-Nov 15:04:40 test286 4:(64,32,32) 0.0 sec : 18019 8.0% +05-Nov 15:04:40 test78 0:(32,32,32) 0.5 sec 23: 17996 8.1% 42.0/s +05-Nov 15:04:40 test78 0:(32,32,32) 0.0 sec : 17996 8.1% +05-Nov 15:04:40 test78 4:(64,32,32) 0.2 sec 1: 17995 8.1% 4.4/s +05-Nov 15:04:40 test78 4:(64,32,32) 0.0 sec : 17995 8.1% +05-Nov 15:04:41 test285 0:(32,32,32) 0.7 sec 33: 17962 8.3% 47.0/s +05-Nov 15:04:41 test285 0:(32,32,32) 0.0 sec 8: 17954 8.4% 1215.1/s +05-Nov 15:04:41 test247 0:(32,32,32) 0.1 sec 22: 17932 8.5% 159.9/s +05-Nov 15:04:41 test247 0:(32,32,32) 0.1 sec 5: 17927 8.5% 49.9/s +05-Nov 15:04:42 test109 0:(32,32,32) 0.2 sec 31: 17896 8.7% 193.4/s +05-Nov 15:04:42 test109 0:(32,32,32) 0.0 sec 2: 17894 8.7% 1537.3/s +05-Nov 15:04:42 test109 0:(32,32,32) 0.1 sec 21: 17873 8.8% 177.1/s +05-Nov 15:04:42 test109 0:(32,32,32) 0.0 sec 1: 17872 8.8% 1023.5/s +05-Nov 15:04:42 test138 0:(32,32,32) 0.1 sec 27: 17845 8.9% 199.9/s +05-Nov 15:04:42 test138 0:(32,32,32) 0.0 sec 1: 17844 8.9% 45.0/s +05-Nov 15:04:42 test172 0:(32,32,32) 0.1 sec 41: 17802 9.1% 774.5/s +05-Nov 15:04:42 test172 0:(32,32,32) 0.0 sec 4: 17798 9.2% 119.2/s +05-Nov 15:04:42 test174 0:(32,32,32) 0.2 sec 19: 17779 9.2% 91.3/s +05-Nov 15:04:42 test174 0:(32,32,32) 0.0 sec 6: 17773 9.3% 1174.6/s +05-Nov 15:04:42 test203 0:(32,32,32) 0.0 sec 14: 17759 9.4% 747.5/s +05-Nov 15:04:42 test213 0:(32,32,32) 0.1 sec 10: 17749 9.4% 93.5/s +05-Nov 15:04:42 test213 0:(32,32,32) 0.0 sec 1: 17748 9.4% 723.6/s +05-Nov 15:04:42 test216 0:(32,32,32) 0.0 sec 11: 17737 9.5% 470.6/s +05-Nov 15:04:43 test225 0:(32,32,32) 0.3 sec 23: 17714 9.6% 85.7/s +05-Nov 15:04:43 test225 0:(32,32,32) 0.1 sec 29: 17685 9.7% 559.9/s +05-Nov 15:04:43 test226 0:(32,32,32) 0.2 sec 11: 17674 9.8% 71.0/s +05-Nov 15:04:43 test226 0:(32,32,32) 0.0 sec 2: 17672 9.8% 418.3/s +05-Nov 15:04:43 test235 0:(32,32,32) 0.0 sec 19: 17653 9.9% 393.4/s +05-Nov 15:04:43 test235 0:(32,32,32) 0.0 sec 3: 17650 9.9% 263.8/s +05-Nov 15:04:43 test252 0:(32,32,32) 0.0 sec 15: 17635 10.0% 951.2/s +05-Nov 15:04:43 test253 0:(32,32,32) 0.0 sec 30: 17605 10.1% 708.8/s +05-Nov 15:04:43 test255 0:(32,32,32) 0.0 sec 8: 17597 10.2% 471.6/s +05-Nov 15:04:44 test257 0:(32,32,32) 0.5 sec 51: 17546 10.4% 103.2/s +05-Nov 15:04:44 test257 0:(32,32,32) 0.0 sec 2: 17544 10.4% 2617.8/s +05-Nov 15:04:44 test260 0:(32,32,32) 0.0 sec 3: 17541 10.5% 199.1/s +05-Nov 15:04:44 test261 0:(32,32,32) 0.0 sec 37: 17504 10.7% 2386.0/s +05-Nov 15:04:44 test262 0:(32,32,32) 0.0 sec 15: 17489 10.7% 1039.7/s +05-Nov 15:04:44 test263 0:(32,32,32) 0.3 sec 12: 17477 10.8% 46.8/s +05-Nov 15:04:44 test263 0:(32,32,32) 0.0 sec 1: 17476 10.8% 590.3/s +05-Nov 15:04:44 test264 0:(32,32,32) 0.0 sec 146: 17330 11.5% 9213.1/s +05-Nov 15:04:44 test265 0:(32,32,32) 0.5 sec 11: 17319 11.6% 22.1/s +05-Nov 15:04:44 test265 0:(32,32,32) 0.0 sec 1: 17318 11.6% 1200.5/s +05-Nov 15:04:45 test267 0:(32,32,32) 0.2 sec 16: 17302 11.7% 84.9/s +05-Nov 15:04:45 test269 0:(32,32,32) 0.0 sec 120: 17182 12.3% 6208.0/s +05-Nov 15:04:45 test271 0:(32,32,32) 0.0 sec 539: 16643 15.0% 16773.5/s +05-Nov 15:04:45 test272 0:(32,32,32) 0.0 sec 8: 16635 15.1% 521.6/s +05-Nov 15:04:45 test273 0:(32,32,32) 0.0 sec 122: 16513 15.7% 2473.3/s +05-Nov 15:04:45 test274 0:(32,32,32) 0.0 sec 119: 16394 16.3% 6064.0/s +05-Nov 15:04:45 test276 0:(32,32,32) 0.2 sec 1697: 14697 25.0% 7648.5/s +05-Nov 15:04:45 test277 0:(32,32,32) 0.0 sec 26: 14671 25.1% 1663.4/s +05-Nov 15:04:45 test279 0:(32,32,32) 0.0 sec 69: 14602 25.5% 3642.9/s +05-Nov 15:04:45 test281 0:(32,32,32) 0.0 sec 14: 14588 25.5% 862.8/s +05-Nov 15:04:45 test268 0:(32,32,32) 0.2 sec 4: 14584 25.6% 20.1/s +05-Nov 15:04:45 test268 0:(32,32,32) 0.0 sec 4: 14580 25.6% 807.3/s +05-Nov 15:04:45 test207 0:(32,32,32) 0.0 sec 7: 14573 25.6% 3634.5/s +05-Nov 15:04:45 test207 1:(32,32,64) 0.0 sec 1: 14572 25.6% 1477.1/s +05-Nov 15:04:46 test211 0:(32,32,32) 0.4 sec 14: 14558 25.7% 33.9/s +05-Nov 15:04:46 test211 0:(32,32,32) 0.0 sec 6: 14552 25.7% 935.9/s +05-Nov 15:04:46 test183 0:(32,32,32) 0.2 sec 16: 14536 25.8% 102.6/s +05-Nov 15:04:46 test212 0:(32,32,32) 0.2 sec 9: 14527 25.8% 36.1/s +05-Nov 15:04:46 test212 0:(32,32,32) 0.0 sec 5: 14522 25.9% 1748.9/s +05-Nov 15:04:46 test219 0:(32,32,32) 0.0 sec 8: 14514 25.9% 467.6/s +05-Nov 15:04:46 test219 0:(32,32,32) 0.0 sec 4: 14510 25.9% 5442.2/s +[malloc debugging turned on] +05-Nov 15:04:46 test296 0:(32,32,32) 0.0 sec 23: 14487 26.1% 8505.9/s +05-Nov 15:04:46 test289 0:(32,32,32) 0.2 sec 76: 14411 26.4% 353.8/s +05-Nov 15:04:46 test288 0:(32,32,32) 0.0 sec 20: 14391 26.5% 1078.4/s +05-Nov 15:04:46 test244 0:(32,32,32) 0.1 sec 23: 14368 26.7% 379.5/s +05-Nov 15:04:46 test244 1:(32,32,64) 0.0 sec 2: 14366 26.7% 63.2/s +05-Nov 15:04:47 test194 0:(32,32,32) 0.1 sec 24: 14342 26.8% 243.9/s +05-Nov 15:04:47 test09 0:(32,32,32) 0.2 sec 9: 14333 26.8% 37.8/s +05-Nov 15:04:47 test09 0:(32,32,32) 0.0 sec 4: 14329 26.9% 2326.9/s +05-Nov 15:04:47 test108 0:(32,32,32) 0.2 sec 51: 14278 27.1% 297.1/s +05-Nov 15:04:47 test108 0:(32,32,32) 0.0 sec 25: 14253 27.2% 628.6/s +05-Nov 15:04:47 test137 0:(32,32,32) 0.1 sec 13: 14240 27.3% 118.9/s +05-Nov 15:04:47 test137 0:(32,32,32) 0.0 sec 1: 14239 27.3% 367.8/s +05-Nov 15:04:47 test137 0:(32,32,32) 0.0 sec 1: 14238 27.3% 267.1/s +05-Nov 15:04:47 test124 0:(32,32,32) 0.1 sec 6: 14232 27.4% 40.3/s +05-Nov 15:04:51 test133 0:(32,32,32) 4.1 sec 10: 14222 27.4% 2.5/s +05-Nov 15:04:56 test133 0:(32,32,32) 4.5 sec 21: 14201 27.5% 4.6/s +05-Nov 15:04:58 test176 0:(32,32,32) 1.6 sec 26: 14175 27.6% 16.0/s +05-Nov 15:04:58 test176 0:(32,32,32) 0.1 sec 10: 14165 27.7% 153.1/s +05-Nov 15:04:58 test197 0:(32,32,32) 0.2 sec 12: 14153 27.8% 60.9/s +05-Nov 15:04:58 test197 0:(32,32,32) 0.2 sec 3: 14150 27.8% 15.0/s +05-Nov 15:04:58 test201 0:(32,32,32) 0.0 sec 23: 14127 27.9% 686.1/s +05-Nov 15:04:58 test208 0:(32,32,32) 0.0 sec 16: 14111 28.0% 350.0/s +05-Nov 15:04:58 test214 0:(32,32,32) 0.0 sec 39: 14072 28.2% 10918.3/s +05-Nov 15:04:58 test214 0:(32,32,32) 0.0 sec 5: 14067 28.2% 1812.3/s +05-Nov 15:04:58 test214 1:(32,32,64) 0.0 sec 1: 14066 28.2% 355.5/s +05-Nov 15:04:58 test214 1:(32,32,64) 0.0 sec : 14066 28.2% +05-Nov 15:04:58 test223 0:(32,32,32) 0.0 sec 11: 14055 28.3% 1320.7/s +05-Nov 15:04:58 test223 0:(32,32,32) 0.0 sec 1: 14054 28.3% 59.6/s +05-Nov 15:04:58 test241 0:(32,32,32) 0.1 sec 54: 14000 28.5% 992.8/s +05-Nov 15:04:58 test241 0:(32,32,32) 0.0 sec 8: 13992 28.6% 229.4/s +05-Nov 15:04:58 test270 0:(32,32,32) 0.0 sec 288: 13704 30.0% 13072.5/s +05-Nov 15:04:58 test199 0:(32,32,32) 0.0 sec 16: 13688 30.1% 5873.7/s +05-Nov 15:04:58 test210 0:(32,32,32) 0.1 sec : 13688 30.1% +05-Nov 15:04:58 test210 0:(32,32,32) 0.0 sec 3: 13685 30.1% 3456.2/s +05-Nov 15:04:58 test165 0:(32,32,32) 0.0 sec 13: 13672 30.2% 6238.0/s +05-Nov 15:04:59 test221 0:(32,32,32) 0.1 sec 6: 13666 30.2% 69.1/s +05-Nov 15:04:59 test221 0:(32,32,32) 0.0 sec 1: 13665 30.2% 759.3/s +05-Nov 15:04:59 test278 0:(32,32,32) 0.0 sec 53: 13612 30.5% 3070.7/s +05-Nov 15:04:59 test162 0:(32,32,32) 0.0 sec 20: 13592 30.6% 1079.9/s +05-Nov 15:04:59 test162 0:(32,32,32) 0.0 sec 1: 13591 30.6% 37.0/s +05-Nov 15:04:59 test275 0:(32,32,32) 0.0 sec 27: 13564 30.8% 1074.4/s +05-Nov 15:04:59 test220 0:(32,32,32) 0.2 sec 9: 13555 30.8% 47.6/s +05-Nov 15:04:59 test83 0:(32,32,32) 0.3 sec 7: 13548 30.8% 26.7/s +05-Nov 15:04:59 test83 0:(32,32,32) 0.0 sec 1: 13547 30.9% 1040.6/s +05-Nov 15:05:00 test04 0:(32,32,32) 0.6 sec 12: 13535 30.9% 19.1/s +05-Nov 15:05:00 test04 0:(32,32,32) 0.0 sec 8: 13527 31.0% 1208.6/s +05-Nov 15:05:00 test132 0:(32,32,32) 0.0 sec 9: 13518 31.0% 351.2/s +05-Nov 15:05:00 test82 0:(32,32,32) 0.4 sec 13: 13505 31.1% 35.9/s +05-Nov 15:05:00 test202 0:(32,32,32) 0.0 sec 71: 13434 31.4% 4118.6/s +05-Nov 15:05:00 test202 0:(32,32,32) 0.0 sec 2: 13432 31.4% 169.5/s +05-Nov 15:05:00 test202 0:(32,32,32) 0.0 sec 4: 13428 31.5% 365.8/s +05-Nov 15:05:00 test202 1:(32,32,64) 0.0 sec : 13428 31.5% +05-Nov 15:05:00 test202 1:(32,32,64) 0.0 sec 1: 13427 31.5% 83.3/s +05-Nov 15:05:00 test202 1:(32,32,64) 0.0 sec : 13427 31.5% +05-Nov 15:05:00 test202 2:(32,64,32) 0.0 sec 1: 13426 31.5% 103.2/s +05-Nov 15:05:00 test202 2:(32,64,32) 0.0 sec : 13426 31.5% +05-Nov 15:05:00 test202 2:(32,64,32) 0.0 sec : 13426 31.5% +05-Nov 15:05:00 test222 0:(32,32,32) 0.0 sec 40: 13386 31.7% 1031.8/s +05-Nov 15:05:00 test204 0:(32,32,32) 0.0 sec 9: 13377 31.7% 542.8/s +05-Nov 15:05:01 test258 0:(32,32,32) 0.2 sec 13: 13364 31.8% 62.2/s +05-Nov 15:05:01 test258 0:(32,32,32) 0.0 sec 2: 13362 31.8% 834.0/s +05-Nov 15:05:01 test258 1:(32,32,64) 0.1 sec 1: 13361 31.8% 17.3/s +05-Nov 15:05:01 test258 1:(32,32,64) 0.0 sec : 13361 31.8% +05-Nov 15:05:02 test136 0:(32,32,32) 1.0 sec 7: 13354 31.8% 7.1/s +05-Nov 15:05:02 test136 0:(32,32,32) 0.0 sec 53: 13301 32.1% 2996.6/s +05-Nov 15:05:02 test128 0:(32,32,32) 0.8 sec 52: 13249 32.4% 65.7/s +05-Nov 15:05:03 test128 0:(32,32,32) 0.1 sec 1: 13248 32.4% 8.5/s +05-Nov 15:05:03 test144 0:(32,32,32) 0.2 sec 5: 13243 32.4% 23.0/s +05-Nov 15:05:05 test81 0:(32,32,32) 2.3 sec 39: 13204 32.6% 16.7/s +[malloc debugging turned off] +05-Nov 15:05:06 testc2(0,0) 0:(32,32,32) 0.4 sec 172: 13032 33.5% 454.9/s +05-Nov 15:05:06 testc2(0,0) 1:(32,32,64) 0.3 sec 1: 13031 33.5% 3.6/s +05-Nov 15:05:06 test239 0:(32,32,32) 0.0 sec 10: 13021 33.5% 1207.1/s +05-Nov 15:05:06 test239 0:(32,32,32) 0.3 sec 1: 13020 33.5% 2.9/s +05-Nov 15:05:07 test245 0:(32,32,32) 0.3 sec 33: 12987 33.7% 102.8/s +05-Nov 15:05:07 test245 0:(32,32,32) 0.0 sec 8: 12979 33.8% 1675.7/s +05-Nov 15:05:07 test159 0:(32,32,32) 0.3 sec 39: 12940 33.9% 127.7/s +05-Nov 15:05:08 test259 0:(32,32,32) 0.9 sec 27: 12913 34.1% 30.0/s +05-Nov 15:05:08 test259 0:(32,32,32) 0.0 sec 1: 12912 34.1% 181.8/s +05-Nov 15:05:09 testc4(0) 0:(32,32,32) 1.0 sec 11: 12901 34.1% 10.9/s +05-Nov 15:05:09 test157 0:(32,32,32) 0.6 sec 29: 12872 34.3% 48.4/s +05-Nov 15:05:11 test182 0:(32,32,32) 1.9 sec 22: 12850 34.4% 11.6/s +05-Nov 15:05:12 test182 0:(32,32,32) 0.3 sec 13: 12837 34.5% 51.6/s +05-Nov 15:05:13 test195 0:(32,32,32) 2.0 sec 62: 12775 34.8% 31.7/s +05-Nov 15:05:17 test135 0:(32,32,32) 3.7 sec 43: 12732 35.0% 11.7/s +05-Nov 15:05:17 test215 0:(32,32,32) 0.1 sec 2: 12730 35.0% 22.8/s +05-Nov 15:05:19 test80 0:(32,32,32) 2.2 sec 11: 12719 35.1% 4.9/s +05-Nov 15:05:20 test200 0:(32,32,32) 0.7 sec 11: 12708 35.1% 15.9/s +05-Nov 15:05:22 test283 0:(32,32,32) 2.1 sec 94: 12614 35.6% 44.5/s +05-Nov 15:05:24 test283 1:(32,32,64) 1.5 sec 1: 12613 35.6% 0.7/s +05-Nov 15:05:24 test254 0:(32,32,32) 0.3 sec 25: 12588 35.7% 91.0/s +05-Nov 15:05:25 test254 0:(32,32,32) 1.1 sec 1: 12587 35.8% 0.9/s +05-Nov 15:05:28 test54 0:(32,32,32) 3.1 sec 26: 12560 35.9% 8.5/s +05-Nov 15:05:30 test54 0:(32,32,32) 1.3 sec 13: 12547 36.0% 10.4/s +05-Nov 15:05:32 testcc(1) 0:(32,32,32) 2.2 sec 10: 12537 36.0% 4.6/s +05-Nov 15:05:33 testcc(1) 0:(32,32,32) 1.4 sec 6: 12531 36.0% 4.3/s +05-Nov 15:05:33 testc2(1,1) 0:(32,32,32) 0.3 sec 11: 12520 36.1% 37.5/s +05-Nov 15:05:36 testc2(1,1) 0:(32,32,32) 2.7 sec 3: 12517 36.1% 1.1/s +05-Nov 15:05:38 test141 0:(32,32,32) 1.4 sec 521: 11996 38.8% 371.1/s +05-Nov 15:05:38 test179 0:(32,32,32) 0.0 sec 22: 11974 38.9% 751.1/s +05-Nov 15:05:38 test179 0:(32,32,32) 0.7 sec 10: 11964 38.9% 14.6/s +05-Nov 15:05:38 test188b 0:(32,32,32) 0.0 sec 39: 11925 39.1% 1474.9/s +05-Nov 15:05:38 test185 0:(32,32,32) 0.0 sec 23: 11902 39.2% 554.0/s +05-Nov 15:05:39 test256 0:(32,32,32) 0.2 sec 38: 11864 39.4% 217.6/s +05-Nov 15:05:39 test256 0:(32,32,32) 0.0 sec : 11864 39.4% +05-Nov 15:05:39 test256 1:(32,32,64) 0.2 sec 1: 11863 39.4% 5.6/s +05-Nov 15:05:39 test256 1:(32,32,64) 0.0 sec : 11863 39.4% +05-Nov 15:05:39 test238b 0:(32,32,32) 0.8 sec 31: 11832 39.6% 41.0/s +05-Nov 15:05:40 test238 0:(32,32,32) 0.5 sec 64: 11768 39.9% 133.0/s +05-Nov 15:05:41 test186 0:(32,32,32) 0.9 sec 25: 11743 40.1% 27.6/s +05-Nov 15:05:41 test186 0:(32,32,32) 0.1 sec : 11743 40.1% +05-Nov 15:05:41 test186 0:(32,32,32) 0.1 sec : 11743 40.1% +[malloc debugging turned on] +05-Nov 15:05:43 testca(1) 0:(32,32,32) 1.7 sec 38: 11705 40.3% 22.6/s +05-Nov 15:05:44 testca(1) 0:(32,32,32) 1.7 sec 2: 11703 40.3% 1.2/s +05-Nov 15:05:45 test148 0:(32,32,32) 0.4 sec 7: 11696 40.3% 15.9/s +05-Nov 15:05:45 test148 0:(32,32,32) 0.0 sec 4: 11692 40.3% 1431.1/s +05-Nov 15:05:46 test231 0:(32,32,32) 1.6 sec 385: 11307 42.3% 246.8/s +05-Nov 15:05:47 test129 0:(32,32,32) 0.7 sec 10: 11297 42.3% 15.1/s +05-Nov 15:05:52 test69 0:(32,32,32) 4.9 sec 31: 11266 42.5% 6.3/s +05-Nov 15:05:56 test69 0:(32,32,32) 3.7 sec 12: 11254 42.6% 3.2/s +05-Nov 15:05:58 test29 0:(32,32,32) 2.0 sec 151: 11103 43.3% 77.3/s +05-Nov 15:06:00 test29 0:(32,32,32) 1.9 sec 2: 11101 43.3% 1.1/s +05-Nov 15:06:02 test29 1:(32,32,64) 1.9 sec 2: 11099 43.3% 1.1/s +05-Nov 15:06:03 test29 1:(32,32,64) 1.9 sec : 11099 43.3% +05-Nov 15:06:04 test282 0:(32,32,32) 0.3 sec 15: 11084 43.4% 46.1/s +05-Nov 15:06:04 test249 0:(32,32,32) 0.3 sec 19: 11065 43.5% 56.2/s +05-Nov 15:06:04 test249 0:(32,32,32) 0.3 sec 1: 11064 43.5% 3.1/s +05-Nov 15:06:05 test196 0:(32,32,32) 0.9 sec 18: 11046 43.6% 20.4/s +05-Nov 15:06:06 test250 0:(32,32,32) 0.5 sec 69: 10977 44.0% 141.2/s +05-Nov 15:06:07 test250 0:(32,32,32) 0.7 sec 4: 10973 44.0% 5.4/s +05-Nov 15:06:07 test145 0:(32,32,32) 0.7 sec 22: 10951 44.1% 31.3/s +05-Nov 15:06:07 test145 0:(32,32,32) 0.0 sec 6: 10945 44.1% 628.2/s +05-Nov 15:06:14 test229 0:(32,32,32) 6.6 sec 14: 10931 44.2% 2.1/s +05-Nov 15:06:16 test209 0:(32,32,32) 2.0 sec 44: 10887 44.4% 22.2/s +05-Nov 15:06:18 test209 1:(32,32,64) 2.1 sec 1: 10886 44.4% 0.5/s +05-Nov 15:06:20 test224 0:(32,32,32) 1.8 sec 59: 10827 44.7% 33.2/s +05-Nov 15:06:20 test191 0:(32,32,32) 0.4 sec 26: 10801 44.9% 60.2/s +05-Nov 15:06:20 test191 0:(32,32,32) 0.1 sec 2: 10799 44.9% 20.1/s +05-Nov 15:06:20 test150 0:(32,32,32) 0.0 sec 20: 10779 45.0% 544.1/s +05-Nov 15:06:21 test240 0:(32,32,32) 0.3 sec 26: 10753 45.1% 89.7/s +05-Nov 15:06:21 test240 0:(32,32,32) 0.4 sec 1: 10752 45.1% 2.8/s +05-Nov 15:06:21 test237 0:(32,32,32) 0.3 sec 10: 10742 45.2% 31.8/s +05-Nov 15:06:21 test237 0:(32,32,32) 0.0 sec 1: 10741 45.2% 101.2/s +05-Nov 15:06:21 test237 0:(32,32,32) 0.0 sec 1: 10740 45.2% 94.1/s +05-Nov 15:06:21 test237 0:(32,32,32) 0.0 sec 1: 10739 45.2% 106.1/s +05-Nov 15:06:22 test184 0:(32,32,32) 1.1 sec 7: 10732 45.2% 6.5/s +05-Nov 15:06:26 test236 0:(32,32,32) 3.3 sec 117: 10615 45.8% 35.2/s +[malloc debugging turned off] +05-Nov 15:06:36 test84 0:(32,32,32) 10.6 sec 15: 10600 45.9% 1.4/s +05-Nov 15:06:37 test84 0:(32,32,32) 0.4 sec 32: 10568 46.1% 77.4/s +05-Nov 15:06:46 test84 2:(32,64,32) 9.0 sec 1: 10567 46.1% 0.1/s +05-Nov 15:06:46 test84 2:(32,64,32) 0.4 sec : 10567 46.1% +05-Nov 15:06:47 test84 0:(32,32,32) 0.5 sec : 10567 46.1% +05-Nov 15:06:47 test84 0:(32,32,32) 0.5 sec 4: 10563 46.1% 8.3/s +05-Nov 15:06:48 test84 2:(32,64,32) 0.5 sec 1: 10562 46.1% 2.2/s +05-Nov 15:06:48 test84 2:(32,64,32) 0.5 sec : 10562 46.1% +05-Nov 15:07:06 test173 0:(32,32,32) 17.5 sec 20: 10542 46.2% 1.1/s +05-Nov 15:07:06 test173 0:(32,32,32) 0.4 sec 4: 10538 46.2% 10.0/s +05-Nov 15:07:18 test230 0:(32,32,32) 11.6 sec 250: 10288 47.5% 21.6/s +05-Nov 15:07:19 test230 0:(32,32,32) 1.7 sec 2: 10286 47.5% 1.2/s +05-Nov 15:07:31 test18 0:(32,32,32) 12.1 sec 91: 10195 48.0% 7.5/s +05-Nov 15:07:34 test18 0:(32,32,32) 2.9 sec 7: 10188 48.0% 2.4/s +05-Nov 15:08:16 testc7(0) 0:(32,32,32) 41.3 sec 12: 10176 48.1% 0.3/s +05-Nov 15:08:22 testc7(0) 0:(32,32,32) 6.0 sec 11: 10165 48.1% 1.8/s +05-Nov 15:08:48 test193 0:(32,32,32) 25.9 sec 200: 9965 49.1% 7.7/s +05-Nov 15:08:51 test127 0:(32,32,32) 2.8 sec 929: 9036 53.9% 326.7/s +05-Nov 15:08:55 test23 0:(32,32,32) 4.5 sec 61: 8975 54.2% 13.5/s +05-Nov 15:09:02 test243 0:(32,32,32) 6.6 sec 7: 8968 54.2% 1.1/s +05-Nov 15:10:02 test53 0:(32,32,32) 60.5 sec 38: 8930 54.4% 0.6/s +05-Nov 15:10:06 test53 0:(32,32,32) 4.1 sec 5: 8925 54.4% 1.2/s +05-Nov 15:10:19 test242 0:(32,32,32) 12.3 sec 45: 8880 54.7% 3.7/s +05-Nov 15:10:30 test17 0:(32,32,32) 11.1 sec 32: 8848 54.8% 2.9/s +05-Nov 15:10:41 test246 0:(32,32,32) 10.7 sec 5: 8843 54.9% 0.5/s +05-Nov 15:10:45 test251b 0:(32,32,32) 5.0 sec 26: 8817 55.0% 5.2/s +05-Nov 15:10:56 test251 0:(32,32,32) 10.6 sec 100: 8717 55.5% 9.4/s +05-Nov 15:11:08 test152 0:(32,32,32) 12.3 sec 190: 8527 56.5% 15.4/s +05-Nov 15:11:22 test152 0:(32,32,32) 13.6 sec 123: 8404 57.1% 9.1/s +05-Nov 15:11:25 test160 0:(32,32,32) 2.5 sec 17: 8387 57.2% 6.7/s +05-Nov 15:12:00 test232 0:(32,32,32) 35.5 sec 58: 8329 57.5% 1.6/s +05-Nov 15:12:01 test232 0:(32,32,32) 0.5 sec 5: 8324 57.5% 10.4/s +05-Nov 15:12:02 test142b 0:(32,32,32) 1.6 sec 10: 8314 57.6% 6.3/s +05-Nov 15:12:02 test142b 0:(32,32,32) 0.0 sec 3: 8311 57.6% 206.9/s +05-Nov 15:12:55 test142 0:(32,32,32) 53.1 sec 304: 8007 59.1% 5.7/s +05-Nov 15:14:03 test227 0:(32,32,32) 67.7 sec 15: 7992 59.2% 0.2/s +05-Nov 15:14:12 test292 0:(32,32,32) 8.2 sec 1: 7991 59.2% 0.1/s +05-Nov 15:14:13 test192 0:(32,32,32) 1.2 sec 3: 7988 59.2% 2.5/s +05-Nov 15:14:22 test181 0:(32,32,32) 8.6 sec 4: 7984 59.2% 0.5/s +05-Nov 15:14:26 test181 0:(32,32,32) 4.8 sec 11: 7973 59.3% 2.3/s +[malloc debugging turned on] +05-Nov 15:14:44 test130 0:(32,32,32) 17.3 sec 8: 7965 59.3% 0.5/s +05-Nov 15:14:44 test130 0:(32,32,32) 0.4 sec 5: 7960 59.4% 12.7/s +05-Nov 15:14:45 test206 0:(32,32,32) 0.7 sec 86: 7874 59.8% 127.3/s +05-Nov 15:14:50 test206 0:(32,32,32) 4.8 sec 12: 7862 59.9% 2.5/s +05-Nov 15:15:04 test02 0:(32,32,32) 14.7 sec 3: 7859 59.9% 0.2/s +05-Nov 15:15:54 test11 0:(32,32,32) 49.9 sec 17: 7842 60.0% 0.3/s +05-Nov 15:16:00 test187 0:(32,32,32) 5.6 sec 5: 7837 60.0% 0.9/s +05-Nov 15:16:03 test187 0:(32,32,32) 2.3 sec 1: 7836 60.0% 0.4/s +05-Nov 15:16:05 test169 0:(32,32,32) 2.6 sec 32: 7804 60.2% 12.2/s +05-Nov 15:16:09 test76 0:(32,32,32) 4.1 sec 14: 7790 60.2% 3.4/s +05-Nov 15:16:17 test01 0:(32,32,32) 8.2 sec 590: 7200 63.2% 71.6/s +05-Nov 15:16:22 test01 0:(32,32,32) 4.8 sec 4: 7196 63.3% 0.8/s +05-Nov 15:16:27 test228 0:(32,32,32) 4.1 sec 25: 7171 63.4% 6.0/s +05-Nov 15:16:33 test104 0:(32,32,32) 6.3 sec 35: 7136 63.6% 5.6/s +05-Nov 15:17:36 test284 0:(32,32,32) 63.3 sec 68: 7068 63.9% 1.1/s +05-Nov 15:17:38 test284 0:(32,32,32) 2.1 sec 4: 7064 63.9% 1.9/s +05-Nov 15:17:58 test180 0:(32,32,32) 20.1 sec 21: 7043 64.0% 1.0/s +05-Nov 15:18:05 test180 0:(32,32,32) 6.3 sec 91: 6952 64.5% 14.5/s +05-Nov 15:18:13 test188 0:(32,32,32) 8.4 sec 169: 6783 65.4% 20.0/s +05-Nov 15:18:42 test151b 0:(32,32,32) 28.8 sec 34: 6749 65.6% 1.2/s +05-Nov 15:18:42 test151b 0:(32,32,32) 0.2 sec 18: 6731 65.6% 82.5/s +05-Nov 15:19:05 test14b 0:(32,32,32) 22.4 sec 95: 6636 66.1% 4.2/s +05-Nov 15:19:32 test14 0:(32,32,32) 27.0 sec 257: 6379 67.4% 9.5/s +[malloc debugging turned off] +05-Nov 15:20:03 test125 0:(32,32,32) 30.8 sec 319: 6060 69.1% 10.4/s +05-Nov 15:21:14 test10 0:(32,32,32) 71.4 sec 702: 5358 72.7% 9.8/s +05-Nov 15:21:51 test75b 0:(32,32,32) 36.7 sec 293: 5065 74.1% 8.0/s +05-Nov 15:22:20 test74 0:(32,32,32) 29.5 sec 4101: 964 95.1% 139.1/s +05-Nov 15:24:52 test234 0:(32,32,32) 151.6 sec 198: 766 96.1% 1.3/s +[malloc debugging turned on] +05-Nov 15:24:52 test154b 0:(32,32,32) 0.0 sec 11: 755 96.1% 575.0/s +05-Nov 15:26:53 test154 0:(32,32,32) 121.0 sec 657: 98 99.5% 5.4/s +05-Nov 15:28:03 test21b 0:(32,32,32) 69.7 sec 64: 34 99.8% 0.9/s +05-Nov 15:32:10 test19b 0:(32,32,32) 246.5 sec 20: 14 99.9% 0.1/s +05-Nov 15:32:12 test19b 0:(32,32,32) 1.6 sec 4: 10 99.9% 2.6/s +[malloc debugging turned off] +05-Nov 15:34:47 test19 0:(32,32,32) 154.5 sec 7: 3 99.9% 0.0/s +05-Nov 15:34:48 test19 0:(32,32,32) 0.9 sec 2: 1 99.9% 2.2/s +05-Nov 15:34:48 test280(0) 0:(32,32,32) 0.0 sec 1: all 100% 28.5/s +[malloc debugging turned off] +05-Nov-2025 15:34:48 grbcov ending diff --git a/GraphBLAS/Tcov/log_Oct31.txt b/GraphBLAS/Tcov/log_Oct31.txt deleted file mode 100644 index 160625451..000000000 --- a/GraphBLAS/Tcov/log_Oct31.txt +++ /dev/null @@ -1,332 +0,0 @@ -31-Oct-2025 15:02:32 grbcov starting -total blocks: 19585 - ----------------------------------------------- [cover] -[malloc debugging turned on] -31-Oct 15:04:15 test300 0:(32,32,32) 0.0 sec 139: 19232 1.8% 8984.0/s -31-Oct 15:04:21 test301 0:(32,32,32) 5.7 sec 365: 18867 3.7% 63.9/s -31-Oct 15:04:25 test301 0:(32,32,32) 4.7 sec 38: 18829 3.9% 8.1/s -31-Oct 15:04:26 test302 0:(32,32,32) 0.0 sec 47: 18782 4.1% 2803.0/s -[malloc debugging turned off] -31-Oct 15:04:26 test299 0:(32,32,32) 0.0 sec 62: 18720 4.4% 4009.3/s -31-Oct 15:04:27 test298 0:(32,32,32) 1.6 sec 196: 18524 5.4% 123.4/s -31-Oct 15:04:27 test298 0:(32,32,32) 0.0 sec 58: 18466 5.7% 2898.6/s -31-Oct 15:04:27 test297 0:(32,32,32) 0.3 sec 129: 18337 6.4% 459.5/s -31-Oct 15:04:27 test295 0:(32,32,32) 0.0 sec 12: 18323 6.4% 689.0/s -31-Oct 15:04:28 test294 0:(32,32,32) 0.1 sec 15: 18308 6.5% 185.4/s -31-Oct 15:04:31 test293 0:(32,32,32) 3.3 sec 46: 18262 6.8% 14.1/s -31-Oct 15:04:31 test291 0:(32,32,32) 0.0 sec 12: 18250 6.8% 697.1/s -31-Oct 15:04:31 test291 1:(32,32,64) 0.0 sec 1: 18247 6.8% 3496.5/s -31-Oct 15:04:31 test291 2:(32,64,32) 0.0 sec 4: 18243 6.9% 17699.1/s -31-Oct 15:04:31 test291 4:(64,32,32) 0.0 sec 1: 18242 6.9% 4629.6/s -31-Oct 15:04:33 test290 0:(32,32,32) 1.7 sec 2: 18240 6.9% 1.2/s -31-Oct 15:04:33 test287 0:(32,32,32) 0.0 sec 33: 18207 7.0% 1433.2/s -31-Oct 15:04:33 test287 4:(64,32,32) 0.0 sec : 18207 7.0% -31-Oct 15:04:33 test286 0:(32,32,32) 0.7 sec 40: 18167 7.2% 54.8/s -31-Oct 15:04:33 test286 0:(32,32,32) 0.0 sec 9: 18158 7.3% 2999.0/s -31-Oct 15:04:34 test286 1:(32,32,64) 0.8 sec : 18158 7.3% -31-Oct 15:04:34 test286 1:(32,32,64) 0.0 sec 1: 18157 7.3% 848.9/s -31-Oct 15:04:35 test286 2:(32,64,32) 0.7 sec : 18157 7.3% -31-Oct 15:04:35 test286 2:(32,64,32) 0.0 sec : 18157 7.3% -31-Oct 15:04:36 test286 4:(64,32,32) 0.8 sec 1: 18156 7.3% 1.2/s -31-Oct 15:04:36 test286 4:(64,32,32) 0.0 sec : 18156 7.3% -31-Oct 15:04:36 test78 0:(32,32,32) 0.5 sec 24: 18132 7.4% 48.1/s -31-Oct 15:04:36 test78 0:(32,32,32) 0.0 sec : 18132 7.4% -31-Oct 15:04:36 test78 4:(64,32,32) 0.2 sec 1: 18131 7.4% 4.3/s -31-Oct 15:04:36 test78 4:(64,32,32) 0.0 sec : 18131 7.4% -31-Oct 15:04:37 test285 0:(32,32,32) 0.7 sec 33: 18098 7.6% 49.1/s -31-Oct 15:04:37 test285 0:(32,32,32) 0.0 sec 8: 18090 7.6% 1223.2/s -31-Oct 15:04:37 test247 0:(32,32,32) 0.1 sec 22: 18068 7.7% 178.4/s -31-Oct 15:04:37 test247 0:(32,32,32) 0.1 sec 5: 18063 7.8% 52.0/s -31-Oct 15:04:38 test109 0:(32,32,32) 0.2 sec 31: 18032 7.9% 194.2/s -31-Oct 15:04:38 test109 0:(32,32,32) 0.0 sec 2: 18030 7.9% 1596.2/s -31-Oct 15:04:38 test109 0:(32,32,32) 0.1 sec 21: 18009 8.0% 190.3/s -31-Oct 15:04:38 test109 0:(32,32,32) 0.0 sec 1: 18008 8.1% 1242.2/s -31-Oct 15:04:38 test138 0:(32,32,32) 0.1 sec 27: 17981 8.2% 188.7/s -31-Oct 15:04:38 test138 0:(32,32,32) 0.0 sec 1: 17980 8.2% 32.6/s -31-Oct 15:04:38 test172 0:(32,32,32) 0.1 sec 41: 17938 8.4% 784.9/s -31-Oct 15:04:38 test172 0:(32,32,32) 0.0 sec 4: 17934 8.4% 125.0/s -31-Oct 15:04:38 test155 0:(32,32,32) 0.0 sec 102: 17832 9.0% 2444.9/s -31-Oct 15:04:38 test155 0:(32,32,32) 0.0 sec 5: 17827 9.0% 220.2/s -31-Oct 15:04:38 test155 2:(32,64,32) 0.0 sec 1: 17826 9.0% 54.6/s -31-Oct 15:04:38 test155 2:(32,64,32) 0.0 sec : 17826 9.0% -31-Oct 15:04:38 test155 4:(64,32,32) 0.0 sec 1: 17825 9.0% 53.5/s -31-Oct 15:04:38 test155 4:(64,32,32) 0.0 sec : 17825 9.0% -31-Oct 15:04:38 test174 0:(32,32,32) 0.2 sec 19: 17806 9.1% 99.3/s -31-Oct 15:04:38 test174 0:(32,32,32) 0.0 sec 6: 17800 9.1% 1340.5/s -31-Oct 15:04:38 test203 0:(32,32,32) 0.0 sec 14: 17786 9.2% 771.6/s -31-Oct 15:04:38 test213 0:(32,32,32) 0.1 sec 10: 17776 9.2% 95.9/s -31-Oct 15:04:38 test213 0:(32,32,32) 0.0 sec 1: 17775 9.2% 787.4/s -31-Oct 15:04:38 test216 0:(32,32,32) 0.0 sec 11: 17764 9.3% 446.0/s -31-Oct 15:04:39 test225 0:(32,32,32) 0.3 sec 23: 17741 9.4% 88.6/s -31-Oct 15:04:39 test225 0:(32,32,32) 0.1 sec 29: 17712 9.6% 505.8/s -31-Oct 15:04:39 test226 0:(32,32,32) 0.2 sec 11: 17701 9.6% 65.3/s -31-Oct 15:04:39 test226 0:(32,32,32) 0.0 sec 2: 17699 9.6% 222.0/s -31-Oct 15:04:39 test235 0:(32,32,32) 0.0 sec 19: 17680 9.7% 384.1/s -31-Oct 15:04:39 test235 0:(32,32,32) 0.0 sec 3: 17677 9.7% 253.9/s -31-Oct 15:04:39 test252 0:(32,32,32) 0.0 sec 15: 17662 9.8% 887.2/s -31-Oct 15:04:39 test253 0:(32,32,32) 0.0 sec 32: 17630 10.0% 695.5/s -31-Oct 15:04:39 test255 0:(32,32,32) 0.0 sec 8: 17622 10.0% 475.9/s -31-Oct 15:04:40 test257 0:(32,32,32) 0.5 sec 51: 17571 10.3% 112.0/s -31-Oct 15:04:40 test257 0:(32,32,32) 0.0 sec 2: 17569 10.3% 3149.6/s -31-Oct 15:04:40 test260 0:(32,32,32) 0.0 sec 3: 17566 10.3% 178.4/s -31-Oct 15:04:40 test261 0:(32,32,32) 0.0 sec 37: 17529 10.5% 2391.9/s -31-Oct 15:04:40 test262 0:(32,32,32) 0.0 sec 15: 17514 10.6% 977.8/s -31-Oct 15:04:40 test263 0:(32,32,32) 0.2 sec 12: 17502 10.6% 49.1/s -31-Oct 15:04:40 test263 0:(32,32,32) 0.0 sec 1: 17501 10.6% 621.1/s -31-Oct 15:04:40 test264 0:(32,32,32) 0.0 sec 146: 17355 11.4% 8079.2/s -31-Oct 15:04:40 test265 0:(32,32,32) 0.4 sec 11: 17344 11.4% 24.5/s -31-Oct 15:04:40 test265 0:(32,32,32) 0.0 sec 1: 17343 11.4% 591.7/s -31-Oct 15:04:41 test267 0:(32,32,32) 0.2 sec 16: 17327 11.5% 86.7/s -31-Oct 15:04:41 test269 0:(32,32,32) 0.0 sec 121: 17206 12.1% 6311.6/s -31-Oct 15:04:41 test271 0:(32,32,32) 0.0 sec 543: 16663 14.9% 16011.1/s -31-Oct 15:04:41 test272 0:(32,32,32) 0.0 sec 8: 16655 15.0% 475.1/s -31-Oct 15:04:41 test273 0:(32,32,32) 0.1 sec 122: 16533 15.6% 2397.6/s -31-Oct 15:04:41 test274 0:(32,32,32) 0.0 sec 119: 16414 16.2% 5565.9/s -31-Oct 15:04:41 test276 0:(32,32,32) 0.2 sec 1697: 14717 24.9% 7619.0/s -31-Oct 15:04:41 test277 0:(32,32,32) 0.0 sec 26: 14691 25.0% 1548.0/s -31-Oct 15:04:41 test279 0:(32,32,32) 0.0 sec 69: 14622 25.3% 3894.3/s -31-Oct 15:04:41 test281 0:(32,32,32) 0.0 sec 14: 14608 25.4% 861.6/s -31-Oct 15:04:41 test268 0:(32,32,32) 0.2 sec 4: 14604 25.4% 20.8/s -31-Oct 15:04:41 test268 0:(32,32,32) 0.0 sec 4: 14600 25.5% 788.0/s -31-Oct 15:04:41 test207 0:(32,32,32) 0.0 sec 7: 14593 25.5% 3558.7/s -31-Oct 15:04:41 test207 1:(32,32,64) 0.0 sec 1: 14592 25.5% 1371.7/s -31-Oct 15:04:42 test211 0:(32,32,32) 0.4 sec 14: 14578 25.6% 34.1/s -31-Oct 15:04:42 test211 0:(32,32,32) 0.0 sec 6: 14572 25.6% 970.2/s -31-Oct 15:04:42 test183 0:(32,32,32) 0.2 sec 16: 14556 25.7% 105.0/s -31-Oct 15:04:42 test212 0:(32,32,32) 0.2 sec 9: 14547 25.7% 37.6/s -31-Oct 15:04:42 test212 0:(32,32,32) 0.0 sec 5: 14542 25.7% 1814.2/s -31-Oct 15:04:42 test219 0:(32,32,32) 0.0 sec 8: 14534 25.8% 421.2/s -31-Oct 15:04:42 test219 0:(32,32,32) 0.0 sec 4: 14530 25.8% 4683.8/s -[malloc debugging turned on] -31-Oct 15:04:42 test296 0:(32,32,32) 0.0 sec 23: 14507 25.9% 8058.9/s -31-Oct 15:04:42 test289 0:(32,32,32) 0.2 sec 78: 14429 26.3% 364.3/s -31-Oct 15:04:42 test288 0:(32,32,32) 0.0 sec 20: 14409 26.4% 1083.2/s -31-Oct 15:04:42 test244 0:(32,32,32) 0.1 sec 23: 14386 26.5% 361.0/s -31-Oct 15:04:43 test244 1:(32,32,64) 0.0 sec 2: 14384 26.6% 61.7/s -31-Oct 15:04:43 test194 0:(32,32,32) 0.1 sec 24: 14360 26.7% 262.6/s -31-Oct 15:04:43 test09 0:(32,32,32) 0.2 sec 9: 14351 26.7% 41.1/s -31-Oct 15:04:43 test09 0:(32,32,32) 0.0 sec 4: 14347 26.7% 2293.6/s -31-Oct 15:04:43 test108 0:(32,32,32) 0.2 sec 51: 14296 27.0% 303.4/s -31-Oct 15:04:43 test108 0:(32,32,32) 0.0 sec 25: 14271 27.1% 665.9/s -31-Oct 15:04:43 test137 0:(32,32,32) 0.1 sec 13: 14258 27.2% 120.8/s -31-Oct 15:04:43 test137 0:(32,32,32) 0.0 sec 1: 14257 27.2% 383.3/s -31-Oct 15:04:43 test137 0:(32,32,32) 0.0 sec 1: 14256 27.2% 267.7/s -31-Oct 15:04:43 test124 0:(32,32,32) 0.2 sec 6: 14250 27.2% 39.9/s -31-Oct 15:04:48 test133 0:(32,32,32) 4.4 sec 12: 14238 27.3% 2.7/s -31-Oct 15:04:52 test133 0:(32,32,32) 4.7 sec 21: 14217 27.4% 4.5/s -31-Oct 15:04:54 test176 0:(32,32,32) 1.6 sec 26: 14191 27.5% 16.7/s -31-Oct 15:04:54 test176 0:(32,32,32) 0.1 sec 10: 14181 27.6% 150.7/s -31-Oct 15:04:54 test197 0:(32,32,32) 0.2 sec 12: 14169 27.7% 65.7/s -31-Oct 15:04:54 test197 0:(32,32,32) 0.2 sec 3: 14166 27.7% 16.3/s -31-Oct 15:04:55 test201 0:(32,32,32) 0.0 sec 23: 14143 27.8% 638.9/s -31-Oct 15:04:55 test208 0:(32,32,32) 0.0 sec 17: 14126 27.9% 344.7/s -31-Oct 15:04:55 test214 0:(32,32,32) 0.0 sec 39: 14087 28.1% 10623.8/s -31-Oct 15:04:55 test214 0:(32,32,32) 0.0 sec 5: 14082 28.1% 1756.9/s -31-Oct 15:04:55 test214 1:(32,32,64) 0.0 sec 1: 14081 28.1% 348.6/s -31-Oct 15:04:55 test214 1:(32,32,64) 0.0 sec : 14081 28.1% -31-Oct 15:04:55 test223 0:(32,32,32) 0.0 sec 11: 14070 28.2% 1276.3/s -31-Oct 15:04:55 test223 0:(32,32,32) 0.0 sec 1: 14069 28.2% 65.8/s -31-Oct 15:04:55 test241 0:(32,32,32) 0.1 sec 54: 14015 28.4% 948.2/s -31-Oct 15:04:55 test241 0:(32,32,32) 0.0 sec 8: 14007 28.5% 210.2/s -31-Oct 15:04:55 test270 0:(32,32,32) 0.0 sec 288: 13719 30.0% 11877.3/s -31-Oct 15:04:55 test199 0:(32,32,32) 0.0 sec 16: 13703 30.0% 6204.0/s -31-Oct 15:04:55 test210 0:(32,32,32) 0.1 sec : 13703 30.0% -31-Oct 15:04:55 test210 0:(32,32,32) 0.0 sec 3: 13700 30.0% 3517.0/s -31-Oct 15:04:55 test165 0:(32,32,32) 0.0 sec 13: 13687 30.1% 5917.2/s -31-Oct 15:04:55 test221 0:(32,32,32) 0.1 sec 6: 13681 30.1% 75.0/s -31-Oct 15:04:55 test221 0:(32,32,32) 0.0 sec 1: 13680 30.2% 834.0/s -31-Oct 15:04:55 test278 0:(32,32,32) 0.0 sec 53: 13627 30.4% 2798.9/s -31-Oct 15:04:55 test162 0:(32,32,32) 0.0 sec 20: 13607 30.5% 1012.2/s -31-Oct 15:04:55 test162 0:(32,32,32) 0.0 sec 1: 13606 30.5% 37.6/s -31-Oct 15:04:55 test275 0:(32,32,32) 0.0 sec 27: 13579 30.7% 1119.4/s -31-Oct 15:04:55 test220 0:(32,32,32) 0.2 sec 9: 13570 30.7% 56.9/s -31-Oct 15:04:56 test83 0:(32,32,32) 0.3 sec 7: 13563 30.7% 27.2/s -31-Oct 15:04:56 test83 0:(32,32,32) 0.0 sec 1: 13562 30.8% 1019.4/s -31-Oct 15:04:56 test04 0:(32,32,32) 0.6 sec 12: 13550 30.8% 20.2/s -31-Oct 15:04:56 test04 0:(32,32,32) 0.0 sec 8: 13542 30.9% 1173.0/s -31-Oct 15:04:56 test132 0:(32,32,32) 0.0 sec 9: 13533 30.9% 339.9/s -31-Oct 15:04:57 test82 0:(32,32,32) 0.3 sec 13: 13520 31.0% 37.2/s -31-Oct 15:04:57 test202 0:(32,32,32) 0.0 sec 71: 13449 31.3% 3938.8/s -31-Oct 15:04:57 test202 0:(32,32,32) 0.0 sec 2: 13447 31.3% 172.2/s -31-Oct 15:04:57 test202 0:(32,32,32) 0.0 sec 4: 13443 31.4% 361.8/s -31-Oct 15:04:57 test202 1:(32,32,64) 0.0 sec : 13443 31.4% -31-Oct 15:04:57 test202 1:(32,32,64) 0.0 sec 1: 13442 31.4% 85.5/s -31-Oct 15:04:57 test202 1:(32,32,64) 0.0 sec : 13442 31.4% -31-Oct 15:04:57 test202 2:(32,64,32) 0.0 sec 1: 13441 31.4% 102.7/s -31-Oct 15:04:57 test202 2:(32,64,32) 0.0 sec : 13441 31.4% -31-Oct 15:04:57 test202 2:(32,64,32) 0.0 sec : 13441 31.4% -31-Oct 15:04:57 test222 0:(32,32,32) 0.0 sec 40: 13401 31.6% 1057.8/s -31-Oct 15:04:57 test204 0:(32,32,32) 0.0 sec 9: 13392 31.6% 553.7/s -31-Oct 15:04:57 test258 0:(32,32,32) 0.2 sec 13: 13379 31.7% 65.0/s -31-Oct 15:04:57 test258 0:(32,32,32) 0.0 sec 2: 13377 31.7% 1310.6/s -31-Oct 15:04:57 test258 1:(32,32,64) 0.0 sec 1: 13376 31.7% 20.2/s -31-Oct 15:04:57 test258 1:(32,32,64) 0.0 sec : 13376 31.7% -31-Oct 15:04:58 test136 0:(32,32,32) 1.2 sec 7: 13369 31.7% 5.6/s -31-Oct 15:04:58 test136 0:(32,32,32) 0.0 sec 53: 13316 32.0% 3753.8/s -31-Oct 15:05:00 test128 0:(32,32,32) 1.5 sec 52: 13264 32.3% 34.0/s -31-Oct 15:05:00 test128 0:(32,32,32) 0.6 sec 1: 13263 32.3% 1.7/s -31-Oct 15:05:01 test144 0:(32,32,32) 0.4 sec 5: 13258 32.3% 11.2/s -31-Oct 15:05:07 test81 0:(32,32,32) 6.5 sec 39: 13219 32.5% 6.0/s -[malloc debugging turned off] -31-Oct 15:05:08 testc2(0,0) 0:(32,32,32) 0.5 sec 172: 13047 33.4% 359.0/s -31-Oct 15:05:08 testc2(0,0) 1:(32,32,64) 0.3 sec 1: 13046 33.4% 3.4/s -31-Oct 15:05:08 test239 0:(32,32,32) 0.0 sec 10: 13036 33.4% 1106.2/s -31-Oct 15:05:09 test239 0:(32,32,32) 0.3 sec 1: 13035 33.4% 3.0/s -31-Oct 15:05:09 test245 0:(32,32,32) 0.3 sec 32: 13003 33.6% 115.7/s -31-Oct 15:05:09 test245 0:(32,32,32) 0.0 sec 8: 12995 33.6% 1483.7/s -31-Oct 15:05:09 test159 0:(32,32,32) 0.3 sec 39: 12956 33.8% 117.4/s -31-Oct 15:05:10 test259 0:(32,32,32) 0.8 sec 27: 12929 34.0% 33.2/s -31-Oct 15:05:10 test259 0:(32,32,32) 0.0 sec 1: 12928 34.0% 210.0/s -31-Oct 15:05:11 testc4(0) 0:(32,32,32) 1.0 sec 11: 12917 34.0% 11.1/s -31-Oct 15:05:12 test157 0:(32,32,32) 0.6 sec 42: 12875 34.3% 73.5/s -31-Oct 15:05:13 test182 0:(32,32,32) 1.8 sec 22: 12853 34.4% 11.9/s -31-Oct 15:05:14 test182 0:(32,32,32) 0.3 sec 13: 12840 34.4% 52.0/s -31-Oct 15:05:16 test195 0:(32,32,32) 2.1 sec 62: 12778 34.8% 30.0/s -31-Oct 15:05:20 test135 0:(32,32,32) 3.8 sec 43: 12735 35.0% 11.2/s -31-Oct 15:05:20 test215 0:(32,32,32) 0.1 sec 2: 12733 35.0% 23.0/s -31-Oct 15:05:22 test80 0:(32,32,32) 2.6 sec 11: 12722 35.0% 4.2/s -31-Oct 15:05:23 test200 0:(32,32,32) 0.9 sec 11: 12711 35.1% 11.9/s -31-Oct 15:05:26 test283 0:(32,32,32) 2.7 sec 93: 12618 35.6% 34.5/s -31-Oct 15:05:28 test283 1:(32,32,64) 1.8 sec 1: 12617 35.6% 0.6/s -31-Oct 15:05:28 test254 0:(32,32,32) 0.2 sec 25: 12592 35.7% 115.9/s -31-Oct 15:05:29 test254 0:(32,32,32) 1.1 sec 1: 12591 35.7% 0.9/s -31-Oct 15:05:32 test54 0:(32,32,32) 3.1 sec 26: 12564 35.8% 8.5/s -31-Oct 15:05:33 test54 0:(32,32,32) 1.3 sec 13: 12551 35.9% 10.3/s -31-Oct 15:05:36 testcc(1) 0:(32,32,32) 2.2 sec 10: 12541 36.0% 4.6/s -31-Oct 15:05:37 testcc(1) 0:(32,32,32) 1.4 sec 6: 12535 36.0% 4.3/s -31-Oct 15:05:37 testc2(1,1) 0:(32,32,32) 0.3 sec 11: 12524 36.1% 36.8/s -31-Oct 15:05:40 testc2(1,1) 0:(32,32,32) 2.7 sec 3: 12521 36.1% 1.1/s -31-Oct 15:05:41 test141 0:(32,32,32) 1.3 sec 521: 12000 38.7% 392.9/s -31-Oct 15:05:41 test179 0:(32,32,32) 0.0 sec 22: 11978 38.8% 714.2/s -31-Oct 15:05:42 test179 0:(32,32,32) 0.7 sec 10: 11968 38.9% 14.4/s -31-Oct 15:05:42 test188b 0:(32,32,32) 0.0 sec 39: 11929 39.1% 1397.2/s -31-Oct 15:05:42 test185 0:(32,32,32) 0.0 sec 23: 11906 39.2% 583.2/s -31-Oct 15:05:42 test256 0:(32,32,32) 0.2 sec 38: 11868 39.4% 214.4/s -31-Oct 15:05:42 test256 0:(32,32,32) 0.0 sec : 11868 39.4% -31-Oct 15:05:42 test256 1:(32,32,64) 0.2 sec 1: 11867 39.4% 5.6/s -31-Oct 15:05:42 test256 1:(32,32,64) 0.0 sec : 11867 39.4% -31-Oct 15:05:43 test238b 0:(32,32,32) 0.7 sec 31: 11836 39.6% 43.8/s -31-Oct 15:05:44 test238 0:(32,32,32) 0.5 sec 64: 11772 39.9% 134.1/s -31-Oct 15:05:45 test186 0:(32,32,32) 0.9 sec 25: 11747 40.0% 28.0/s -31-Oct 15:05:45 test186 0:(32,32,32) 0.1 sec : 11747 40.0% -31-Oct 15:05:45 test186 0:(32,32,32) 0.1 sec : 11747 40.0% -[malloc debugging turned on] -31-Oct 15:05:47 testca(1) 0:(32,32,32) 1.7 sec 38: 11709 40.2% 21.9/s -31-Oct 15:05:48 testca(1) 0:(32,32,32) 1.7 sec 2: 11707 40.2% 1.2/s -31-Oct 15:05:49 test148 0:(32,32,32) 0.4 sec 7: 11700 40.3% 16.1/s -31-Oct 15:05:49 test148 0:(32,32,32) 0.0 sec 4: 11696 40.3% 1480.9/s -31-Oct 15:05:50 test231 0:(32,32,32) 1.3 sec 385: 11311 42.2% 305.5/s -31-Oct 15:05:50 test129 0:(32,32,32) 0.6 sec 10: 11301 42.3% 17.8/s -31-Oct 15:05:55 test69 0:(32,32,32) 4.9 sec 31: 11270 42.5% 6.3/s -31-Oct 15:05:59 test69 0:(32,32,32) 3.7 sec 12: 11258 42.5% 3.3/s -31-Oct 15:06:01 test29 0:(32,32,32) 1.9 sec 151: 11107 43.3% 80.2/s -31-Oct 15:06:03 test29 0:(32,32,32) 1.8 sec 2: 11105 43.3% 1.1/s -31-Oct 15:06:05 test29 1:(32,32,64) 1.8 sec 2: 11103 43.3% 1.1/s -31-Oct 15:06:06 test29 1:(32,32,64) 1.8 sec : 11103 43.3% -31-Oct 15:06:07 test282 0:(32,32,32) 0.3 sec 15: 11088 43.4% 46.4/s -31-Oct 15:06:07 test249 0:(32,32,32) 0.3 sec 19: 11069 43.5% 56.3/s -31-Oct 15:06:07 test249 0:(32,32,32) 0.3 sec 1: 11068 43.5% 3.1/s -31-Oct 15:06:08 test196 0:(32,32,32) 0.5 sec 18: 11050 43.6% 33.8/s -31-Oct 15:06:08 test250 0:(32,32,32) 0.5 sec 69: 10981 43.9% 135.5/s -31-Oct 15:06:09 test250 0:(32,32,32) 0.7 sec 4: 10977 44.0% 5.8/s -31-Oct 15:06:10 test145 0:(32,32,32) 0.7 sec 22: 10955 44.1% 32.2/s -31-Oct 15:06:10 test145 0:(32,32,32) 0.0 sec 6: 10949 44.1% 720.5/s -31-Oct 15:06:16 test229 0:(32,32,32) 5.9 sec 14: 10935 44.2% 2.4/s -31-Oct 15:06:18 test209 0:(32,32,32) 2.0 sec 44: 10891 44.4% 22.1/s -31-Oct 15:06:20 test209 1:(32,32,64) 2.1 sec 1: 10890 44.4% 0.5/s -31-Oct 15:06:21 test224 0:(32,32,32) 1.5 sec 60: 10830 44.7% 40.3/s -31-Oct 15:06:22 test191 0:(32,32,32) 0.4 sec 26: 10804 44.8% 62.6/s -31-Oct 15:06:22 test191 0:(32,32,32) 0.1 sec 2: 10802 44.8% 20.9/s -31-Oct 15:06:22 test150 0:(32,32,32) 0.0 sec 20: 10782 44.9% 585.1/s -31-Oct 15:06:22 test240 0:(32,32,32) 0.3 sec 26: 10756 45.1% 88.1/s -31-Oct 15:06:23 test240 0:(32,32,32) 0.3 sec 1: 10755 45.1% 2.9/s -31-Oct 15:06:23 test237 0:(32,32,32) 0.3 sec 10: 10745 45.1% 31.8/s -31-Oct 15:06:23 test237 0:(32,32,32) 0.0 sec 1: 10744 45.1% 100.6/s -31-Oct 15:06:23 test237 0:(32,32,32) 0.0 sec 1: 10743 45.1% 94.7/s -31-Oct 15:06:23 test237 0:(32,32,32) 0.0 sec 1: 10742 45.2% 115.7/s -31-Oct 15:06:24 test184 0:(32,32,32) 1.1 sec 7: 10735 45.2% 6.5/s -31-Oct 15:06:27 test236 0:(32,32,32) 3.0 sec 117: 10618 45.8% 39.4/s -[malloc debugging turned off] -31-Oct 15:06:38 test84 0:(32,32,32) 10.7 sec 15: 10603 45.9% 1.4/s -31-Oct 15:06:38 test84 0:(32,32,32) 0.4 sec 32: 10571 46.0% 75.9/s -31-Oct 15:06:47 test84 2:(32,64,32) 9.1 sec 1: 10570 46.0% 0.1/s -31-Oct 15:06:48 test84 2:(32,64,32) 0.4 sec : 10570 46.0% -31-Oct 15:06:48 test84 0:(32,32,32) 0.5 sec : 10570 46.0% -31-Oct 15:06:49 test84 0:(32,32,32) 0.5 sec 4: 10566 46.1% 8.4/s -31-Oct 15:06:49 test84 2:(32,64,32) 0.5 sec 1: 10565 46.1% 2.2/s -31-Oct 15:06:50 test84 2:(32,64,32) 0.5 sec : 10565 46.1% -31-Oct 15:07:07 test173 0:(32,32,32) 17.6 sec 20: 10545 46.2% 1.1/s -31-Oct 15:07:08 test173 0:(32,32,32) 0.4 sec 4: 10541 46.2% 10.1/s -31-Oct 15:07:19 test230 0:(32,32,32) 11.3 sec 250: 10291 47.5% 22.0/s -31-Oct 15:07:21 test230 0:(32,32,32) 1.7 sec 2: 10289 47.5% 1.2/s -31-Oct 15:07:32 test18 0:(32,32,32) 11.9 sec 91: 10198 47.9% 7.7/s -31-Oct 15:07:35 test18 0:(32,32,32) 2.8 sec 7: 10191 48.0% 2.5/s -31-Oct 15:08:16 testc7(0) 0:(32,32,32) 41.0 sec 12: 10179 48.0% 0.3/s -31-Oct 15:08:22 testc7(0) 0:(32,32,32) 5.9 sec 11: 10168 48.1% 1.9/s -31-Oct 15:08:47 test193 0:(32,32,32) 24.8 sec 200: 9968 49.1% 8.1/s -31-Oct 15:08:50 test127 0:(32,32,32) 2.7 sec 929: 9039 53.8% 342.6/s -31-Oct 15:08:54 test23 0:(32,32,32) 4.3 sec 61: 8978 54.2% 14.2/s -31-Oct 15:09:00 test243 0:(32,32,32) 6.3 sec 7: 8971 54.2% 1.1/s -31-Oct 15:10:01 test53 0:(32,32,32) 60.2 sec 38: 8933 54.4% 0.6/s -31-Oct 15:10:05 test53 0:(32,32,32) 4.0 sec 5: 8928 54.4% 1.2/s -31-Oct 15:10:17 test242 0:(32,32,32) 12.1 sec 45: 8883 54.6% 3.7/s -31-Oct 15:10:28 test17 0:(32,32,32) 10.7 sec 32: 8851 54.8% 3.0/s -31-Oct 15:10:37 test246 0:(32,32,32) 9.7 sec 5: 8846 54.8% 0.5/s -31-Oct 15:10:42 test251b 0:(32,32,32) 5.0 sec 26: 8820 55.0% 5.2/s -31-Oct 15:10:53 test251 0:(32,32,32) 10.7 sec 100: 8720 55.5% 9.4/s -31-Oct 15:11:05 test152 0:(32,32,32) 11.9 sec 190: 8530 56.4% 15.9/s -31-Oct 15:11:18 test152 0:(32,32,32) 13.6 sec 123: 8407 57.1% 9.1/s -31-Oct 15:11:21 test160 0:(32,32,32) 2.7 sec 17: 8390 57.2% 6.3/s -31-Oct 15:11:57 test232 0:(32,32,32) 35.4 sec 58: 8332 57.5% 1.6/s -31-Oct 15:11:57 test232 0:(32,32,32) 0.4 sec 5: 8327 57.5% 11.1/s -31-Oct 15:11:59 test142b 0:(32,32,32) 1.6 sec 10: 8317 57.5% 6.2/s -31-Oct 15:11:59 test142b 0:(32,32,32) 0.0 sec 3: 8314 57.5% 206.9/s -31-Oct 15:12:52 test142 0:(32,32,32) 52.7 sec 304: 8010 59.1% 5.8/s -31-Oct 15:14:00 test227 0:(32,32,32) 68.7 sec 15: 7995 59.2% 0.2/s -31-Oct 15:14:09 test292 0:(32,32,32) 8.5 sec 1: 7994 59.2% 0.1/s -31-Oct 15:14:10 test192 0:(32,32,32) 1.2 sec 3: 7991 59.2% 2.6/s -31-Oct 15:14:19 test181 0:(32,32,32) 8.5 sec 4: 7987 59.2% 0.5/s -31-Oct 15:14:23 test181 0:(32,32,32) 4.7 sec 11: 7976 59.3% 2.4/s -[malloc debugging turned on] -31-Oct 15:14:40 test130 0:(32,32,32) 16.9 sec 8: 7968 59.3% 0.5/s -31-Oct 15:14:41 test130 0:(32,32,32) 0.4 sec 5: 7963 59.3% 13.0/s -31-Oct 15:14:41 test206 0:(32,32,32) 0.6 sec 86: 7877 59.8% 132.4/s -31-Oct 15:14:46 test206 0:(32,32,32) 4.9 sec 12: 7865 59.8% 2.5/s -31-Oct 15:15:01 test02 0:(32,32,32) 14.9 sec 3: 7862 59.9% 0.2/s -31-Oct 15:15:52 test11 0:(32,32,32) 50.5 sec 17: 7845 59.9% 0.3/s -31-Oct 15:15:57 test187 0:(32,32,32) 5.3 sec 5: 7840 60.0% 0.9/s -31-Oct 15:15:59 test187 0:(32,32,32) 2.1 sec 1: 7839 60.0% 0.5/s -31-Oct 15:16:02 test169 0:(32,32,32) 2.6 sec 32: 7807 60.1% 12.2/s -31-Oct 15:16:06 test76 0:(32,32,32) 3.9 sec 14: 7793 60.2% 3.6/s -31-Oct 15:16:14 test01 0:(32,32,32) 7.9 sec 592: 7201 63.2% 75.2/s -31-Oct 15:16:19 test01 0:(32,32,32) 4.9 sec 4: 7197 63.3% 0.8/s -31-Oct 15:16:23 test228 0:(32,32,32) 4.0 sec 25: 7172 63.4% 6.2/s -31-Oct 15:16:28 test104 0:(32,32,32) 5.1 sec 35: 7137 63.6% 6.8/s -31-Oct 15:17:30 test284 0:(32,32,32) 62.0 sec 68: 7069 63.9% 1.1/s -31-Oct 15:17:32 test284 0:(32,32,32) 2.1 sec 4: 7065 63.9% 1.9/s -31-Oct 15:17:53 test180 0:(32,32,32) 20.6 sec 21: 7044 64.0% 1.0/s -31-Oct 15:17:59 test180 0:(32,32,32) 6.2 sec 91: 6953 64.5% 14.7/s -31-Oct 15:18:08 test188 0:(32,32,32) 8.8 sec 169: 6784 65.4% 19.2/s -31-Oct 15:18:37 test151b 0:(32,32,32) 28.9 sec 34: 6750 65.5% 1.2/s -31-Oct 15:18:37 test151b 0:(32,32,32) 0.2 sec 18: 6732 65.6% 83.2/s -31-Oct 15:18:59 test14b 0:(32,32,32) 22.3 sec 95: 6637 66.1% 4.3/s -31-Oct 15:19:26 test14 0:(32,32,32) 26.4 sec 257: 6380 67.4% 9.7/s -[malloc debugging turned off] -31-Oct 15:19:57 test125 0:(32,32,32) 30.7 sec 319: 6061 69.1% 10.4/s -31-Oct 15:21:08 test10 0:(32,32,32) 71.7 sec 702: 5359 72.6% 9.8/s -31-Oct 15:21:46 test75b 0:(32,32,32) 37.0 sec 293: 5066 74.1% 7.9/s -31-Oct 15:22:15 test74 0:(32,32,32) 29.5 sec 4101: 965 95.1% 139.2/s -31-Oct 15:24:46 test234 0:(32,32,32) 150.8 sec 198: 767 96.1% 1.3/s -[malloc debugging turned on] -31-Oct 15:24:46 test154b 0:(32,32,32) 0.0 sec 12: 755 96.1% 563.6/s -31-Oct 15:26:48 test154 0:(32,32,32) 122.1 sec 657: 98 99.5% 5.4/s -31-Oct 15:27:57 test21b 0:(32,32,32) 68.2 sec 64: 34 99.8% 0.9/s -31-Oct 15:32:04 test19b 0:(32,32,32) 246.9 sec 20: 14 99.9% 0.1/s -31-Oct 15:32:06 test19b 0:(32,32,32) 1.6 sec 4: 10 99.9% 2.6/s -[malloc debugging turned off] -31-Oct 15:34:41 test19 0:(32,32,32) 154.9 sec 7: 3 99.9% 0.0/s -31-Oct 15:34:42 test19 0:(32,32,32) 0.9 sec 2: 1 99.9% 2.1/s -31-Oct 15:34:42 test280(0) 0:(32,32,32) 0.0 sec 1: all 100% 26.1/s -[malloc debugging turned off] -31-Oct-2025 15:34:42 grbcov ending diff --git a/GraphBLAS/Test/GB_mex_edit.c b/GraphBLAS/Test/GB_mex_edit.c index 2d559c41f..eab0b6847 100644 --- a/GraphBLAS/Test/GB_mex_edit.c +++ b/GraphBLAS/Test/GB_mex_edit.c @@ -8,15 +8,18 @@ //------------------------------------------------------------------------------ #include "GB_mex.h" +#include "GB_mex_errors.h" #define USAGE "C = GB_mex_edit (C, I, J, X, Action)" #define FREE_ALL \ { \ GrB_Matrix_free_(&C) ; \ + GrB_Matrix_free_(&B) ; \ GB_mx_put_global (true) ; \ } +#undef OK #define OK(method) \ { \ info = method ; \ @@ -27,6 +30,9 @@ } \ } +#define GET_DEEP_COPY +#define FREE_DEEP_COPY ; + void mexFunction ( int nargout, @@ -36,7 +42,7 @@ void mexFunction ) { - GrB_Matrix C = NULL ; + GrB_Matrix C = NULL, B = NULL ; uint64_t *I = NULL, ni = 0, I_range [3] ; // OK uint64_t *J = NULL, nj = 0, J_range [3] ; // OK bool ignore ; @@ -170,6 +176,16 @@ void mexFunction OK (GrB_Scalar_free (&Scalar)) ; GB_Global_malloc_debug_set (save) ; + //-------------------------------------------------------------------------- + // duplicate the matrix and check if it stays the same + //-------------------------------------------------------------------------- + + METHOD (GrB_Matrix_dup (&B, C)) ; + CHECK (GB_mx_isequal (B, C, 0)) ; + OK (GrB_Matrix_wait (C, GrB_MATERIALIZE)) ; + OK (GrB_Matrix_wait (B, GrB_MATERIALIZE)) ; + CHECK (GB_mx_isequal (B, C, 0)) ; + //-------------------------------------------------------------------------- // return C as a built-in sparse matrix //-------------------------------------------------------------------------- diff --git a/GraphBLAS/Test/GB_mex_msort_1.c b/GraphBLAS/Test/GB_mex_msort_1.c index 9e9bd05fe..54f4874d0 100644 --- a/GraphBLAS/Test/GB_mex_msort_1.c +++ b/GraphBLAS/Test/GB_mex_msort_1.c @@ -11,6 +11,8 @@ #define USAGE "[I] = GB_mex_msort_1 (I,nthreads)" +#define WALLCLOCK GB_omp_get_wtime ( ) + void mexFunction ( int nargout, @@ -52,7 +54,10 @@ void mexFunction void *Iout = mxGetData (pargout [0]) ; memcpy (Iout, I, n * (I_is_32 ? sizeof (uint32_t) : sizeof (uint64_t))) ; + double t = WALLCLOCK ; GB_msort_1 (Iout, I_is_32, n, nthreads) ; + t = WALLCLOCK - t ; + printf ("nthreads %d, n: %ld, time: %g\n", nthreads, n, t) ; GB_mx_put_global (true) ; } diff --git a/GraphBLAS/Test/GB_mex_test2.c b/GraphBLAS/Test/GB_mex_test2.c index b56b5e12c..df1690a7d 100644 --- a/GraphBLAS/Test/GB_mex_test2.c +++ b/GraphBLAS/Test/GB_mex_test2.c @@ -267,6 +267,7 @@ void mexFunction OK (GrB_Matrix_new (&A, GrB_INT32, n, n)) ; OK (GrB_Matrix_setElement_INT32 (A, 12345, 0, 0)) ; + OK (GrB_Matrix_wait (A, GrB_MATERIALIZE)) ; OK (GrB_Matrix_dup (&C, A)) ; CHECK (!GB_any_aliased (A, C)) ; GB_free_memory (&(C->p), C->p_size) ; diff --git a/GraphBLAS/Test/test303.m b/GraphBLAS/Test/test303.m new file mode 100644 index 000000000..667383710 --- /dev/null +++ b/GraphBLAS/Test/test303.m @@ -0,0 +1,28 @@ +function test303 +%TEST303 test C=A(I,J), method 6 + +% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2025, All Rights Reserved. +% SPDX-License-Identifier: Apache-2.0 + +fprintf ('test303 ------------------ C=A(I,J)\n') ; + +% construct the problem +n = 2000 ; +rng ('default') ; +A = sprand (n, n, 0.5) ; +nI = 4 ; +I = randi (2000, nI, 1) ; +I0 = uint64 (I-1) ; +I0 + +% test method 6 in GrB_extract +% C1 = A (I,:) ; +C1 = GB_mex_Matrix_subref (A, I0, [ ]) ; + +% compare with MATLAB +B = double (A) ; +C2 = B (I,:) ; +assert (isequal (C1, C2)) ; + +fprintf ('\ntest303: tests passed\n') ; + diff --git a/GraphBLAS/Test/testall.m b/GraphBLAS/Test/testall.m index 19210ee4e..05025e279 100644 --- a/GraphBLAS/Test/testall.m +++ b/GraphBLAS/Test/testall.m @@ -120,9 +120,11 @@ function testall (threads, mdebug) % < 1 second: debug_on set_malloc_debug (mdebug, 1) ; +logstat ('test303' ,t, J404 , F110 ) ; % C=A(I,J), method 6 logstat ('test300' ,t, J0 , F0 ) ; % print function for a type logstat ('test301' ,t, J40 , F11 ) ; % assign method27, C+=A logstat ('test302' ,t, J0 , F0 ) ; % GPU controls +logstat ('test155' ,t, J40 , F10 , [0 2 4]) ; % setElement, removeElement % < 1 second: debug_off set_malloc_debug (mdebug, 0) ; @@ -142,7 +144,6 @@ function testall (threads, mdebug) logstat ('test109' ,t, J4040, F1100) ; % terminal monoid with user-defn type logstat ('test138' ,s, J40 , F10 ) ; % assign, coarse-only in IxJ slice logstat ('test172' ,t, J40 , F10 ) ; % eWiseMult with M bitmap/full -logstat ('test155' ,t, J40 , F10 , [0 2 4]) ; % setElement, removeElement logstat ('test174' ,t, J40 , F10 ) ; % GrB_assign C=A logstat ('test203' ,t, J4 , F1 ) ; % iso subref logstat ('test213' ,t, J40 , F10 ) ; % iso assign (method 05d) diff --git a/GraphBLAS/cmake_modules/GraphBLASReport.cmake b/GraphBLAS/cmake_modules/GraphBLASReport.cmake index 70ec9765c..f5852bd13 100644 --- a/GraphBLAS/cmake_modules/GraphBLASReport.cmake +++ b/GraphBLAS/cmake_modules/GraphBLASReport.cmake @@ -28,4 +28,13 @@ else ( ) endif ( ) get_property ( CDEFN DIRECTORY PROPERTY COMPILE_DEFINITIONS ) message ( STATUS "compile definitions: ${CDEFN}") +message ( STATUS "GraphBLAS has CUDA: ${GRAPHBLAS_HAS_CUDA}") + +if ( GRAPHBLAS_HAS_CUDA ) + message ( STATUS "CUDA compiler: ${CMAKE_CUDA_COMPILER} ") + message ( STATUS "CUDA flags: ${CMAKE_CUDA_FLAGS} ") + message ( STATUS "CUDA release: ${CMAKE_CUDA_FLAGS_RELEASE} ") + message ( STATUS "CUDA flags debug: ${CMAKE_CUDA_FLAGS_DEBUG} ") +endif ( ) + message ( STATUS "------------------------------------------------------------------------" ) diff --git a/GraphBLAS/cmake_modules/GraphBLAS_JIT_configure.cmake b/GraphBLAS/cmake_modules/GraphBLAS_JIT_configure.cmake index ba988c468..9c3665e79 100644 --- a/GraphBLAS/cmake_modules/GraphBLAS_JIT_configure.cmake +++ b/GraphBLAS/cmake_modules/GraphBLAS_JIT_configure.cmake @@ -73,11 +73,18 @@ if ( GRAPHBLAS_JIT_ENABLE_RELOCATE ) # convert to -l flags to avoid relocation issues, i.e.: "-lgomp -lpthread -lm" set ( GB_C_LIBRARIES "" ) foreach ( _lib ${GB_CMAKE_LIBRARIES} ) + + # skip CUDA::cuda_driver, etc + if ( ${_lib} MATCHES "CUDA::" ) + continue ( ) + endif ( ) + string ( FIND ${_lib} "." _pos REVERSE ) if ( ${_pos} EQUAL "-1" ) set ( GB_C_LIBRARIES "${GB_C_LIBRARIES} -l${_lib}" ) continue () endif ( ) + set ( _kinds "SHARED" "STATIC" ) if ( WIN32 ) list ( PREPEND _kinds "IMPORT" ) @@ -101,16 +108,20 @@ else ( ) string ( REPLACE "." "\\." LIBSUFFIX2 ${CMAKE_STATIC_LIBRARY_SUFFIX} ) set ( GB_C_LIBRARIES "" ) foreach ( LIB_NAME ${GB_CMAKE_LIBRARIES} ) - if (( LIB_NAME MATCHES ${LIBSUFFIX1} ) OR ( LIB_NAME MATCHES ${LIBSUFFIX2} )) + message ( STATUS "lib: ${LIB_NAME} " ) + if ( LIB_NAME MATCHES "CUDA::" ) + continue ( ) + elseif (( LIB_NAME MATCHES ${LIBSUFFIX1} ) OR ( LIB_NAME MATCHES ${LIBSUFFIX2} )) string ( APPEND GB_C_LIBRARIES " " ${LIB_NAME} ) else ( ) string ( APPEND GB_C_LIBRARIES " -l" ${LIB_NAME} ) endif ( ) + endforeach ( ) endif ( ) -if ( GRAPHBLAS_USE_JIT OR GRAPHBLAS_USE_CUDA ) +if ( GRAPHBLAS_USE_JIT OR GRAPHBLAS_HAS_CUDA ) message ( STATUS "------------------------------------------------------------------------" ) message ( STATUS "JIT configuration:" ) message ( STATUS "------------------------------------------------------------------------" ) diff --git a/GraphBLAS/cmake_modules/GraphBLAS_JIT_paths.cmake b/GraphBLAS/cmake_modules/GraphBLAS_JIT_paths.cmake index f03ddeca3..eeb66063d 100644 --- a/GraphBLAS/cmake_modules/GraphBLAS_JIT_paths.cmake +++ b/GraphBLAS/cmake_modules/GraphBLAS_JIT_paths.cmake @@ -38,11 +38,6 @@ endif ( ) # GRAPHBLAS_USE_JIT and GRAPHBLAS_COMPACT options #------------------------------------------------------------------------------- -if ( SUITESPARSE_HAS_CUDA AND GRAPHBLAS_USE_CUDA ) - # FOR NOW: do not compile FactoryKernels when developing the CUDA kernels -# set ( GRAPHBLAS_COMPACT on ) # Fixme for CUDA -endif ( ) - include ( CheckSymbolExists ) check_symbol_exists ( system "stdlib.h" HAVE_C_SYSTEM ) diff --git a/GraphBLAS/cmake_modules/GraphBLAS_version.cmake b/GraphBLAS/cmake_modules/GraphBLAS_version.cmake index 3e04bdab6..b2be1d004 100644 --- a/GraphBLAS/cmake_modules/GraphBLAS_version.cmake +++ b/GraphBLAS/cmake_modules/GraphBLAS_version.cmake @@ -8,10 +8,10 @@ #------------------------------------------------------------------------------- # version of SuiteSparse:GraphBLAS -set ( GraphBLAS_DATE "Nov 1, 2025" ) +set ( GraphBLAS_DATE "Jan 21, 2026" ) set ( GraphBLAS_VERSION_MAJOR 10 CACHE STRING "" FORCE ) -set ( GraphBLAS_VERSION_MINOR 2 CACHE STRING "" FORCE ) -set ( GraphBLAS_VERSION_SUB 0 CACHE STRING "" FORCE ) +set ( GraphBLAS_VERSION_MINOR 3 CACHE STRING "" FORCE ) +set ( GraphBLAS_VERSION_SUB 1 CACHE STRING "" FORCE ) # GraphBLAS C API Specification version, at graphblas.org set ( GraphBLAS_API_DATE "Dec 22, 2023" ) diff --git a/GraphBLAS/rmm_wrap/CMakeLists.txt b/GraphBLAS/rmm_wrap/CMakeLists.txt index e4d3c109f..ac75daf20 100644 --- a/GraphBLAS/rmm_wrap/CMakeLists.txt +++ b/GraphBLAS/rmm_wrap/CMakeLists.txt @@ -17,6 +17,7 @@ set ( CMAKE_C_STANDARD 99 ) set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC" ) find_package ( CUDAToolkit REQUIRED ) +message ( STATUS "CUDA include dirs: ${CUDA_INCLUDE_DIRS} " ) set ( EXTERNAL_INCLUDES_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/external_includes ) @@ -25,9 +26,9 @@ if ( NOT EXISTS ${EXTERNAL_INCLUDES_DIRECTORY} ) endif ( ) if ( NOT EXISTS ${EXTERNAL_INCLUDES_DIRECTORY}/spdlog ) - message ( status "cloning spdlog v1.10.0" ) + message ( STATUS "cloning spdlog v1.10.0" ) execute_process ( - COMMAND git clone "https://github.com/gabime/spdlog.git" --branch v1.10.0 --recursive spdlog + COMMAND git clone "https://github.com/gabime/spdlog" --branch v1.10.0 --recursive spdlog WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/external_includes ) endif ( ) @@ -35,9 +36,9 @@ set ( SPDLOG_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/external_includes/spdlog/in include_directories ( ${SPDLOG_INCLUDE_DIR} ) if ( NOT EXISTS ${EXTERNAL_INCLUDES_DIRECTORY}/rmm ) - message ( status "cloning rmm branch-21.10" ) + message ( STATUS "cloning rmm branch-21.10" ) execute_process ( - COMMAND git clone "https://github.com/rapidsai/rmm.git" --branch branch-21.10 --recursive rmm + COMMAND git clone "https://github.com/rapidsai/rmm" --branch branch-21.10 --recursive rmm WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/external_includes ) endif() diff --git a/GraphBLAS/rmm_wrap/rmm_wrap.cpp b/GraphBLAS/rmm_wrap/rmm_wrap.cpp index aecfbe15a..b2bfe9070 100644 --- a/GraphBLAS/rmm_wrap/rmm_wrap.cpp +++ b/GraphBLAS/rmm_wrap/rmm_wrap.cpp @@ -50,8 +50,8 @@ typedef struct std::shared_ptr resource; std::shared_ptr host_resource; std::shared_ptr size_map ; - std::shared_ptr stream_pool; - cudaStream_t main_stream; +// std::shared_ptr stream_pool; +// cudaStream_t main_stream; } RMM_Wrap_Handle ; @@ -144,6 +144,7 @@ inline auto make_and_set_managed_pool return resource; } +#if 0 inline std::shared_ptr make_and_set_cuda_stream_pool ( std::size_t num_streams @@ -151,6 +152,7 @@ inline std::shared_ptr make_and_set_cuda_stream_pool { return std::make_shared(num_streams); } +#endif //------------------------------------------------------------------------------ // rmm_wrap_is_initialized: determine if rmm_wrap_context exists @@ -169,6 +171,8 @@ bool rmm_wrap_is_initialized (void) // the rmm_wrap_context: the memory resource (host or device) and the // alloc_map. +// FIXME: GraphBLAS currently does not call this method ... + void rmm_wrap_finalize (void) { try @@ -177,7 +181,7 @@ void rmm_wrap_finalize (void) { for (int device_id = 0; device_id < devices.size(); ++device_id) { - RMM_WRAP_CHECK_CUDA(cudaStreamDestroy(rmm_wrap_context[device_id]->main_stream)); +// RMM_WRAP_CHECK_CUDA(cudaStreamDestroy(rmm_wrap_context[device_id]->main_stream)); delete rmm_wrap_context[device_id]; } delete rmm_wrap_context ; @@ -212,8 +216,8 @@ int rmm_wrap_initialize // returns -1 on error, 0 on success uint32_t device_id, // GPU device id, for cudaSetDevice RMM_MODE mode, // TODO: describe. Should we default this? size_t init_pool_size, // TODO: describe. Should we default this? - size_t max_pool_size, // TODO: describe. Should we default this? - size_t stream_pool_size // TODO: describe. Should we default this? + size_t max_pool_size // TODO: describe. Should we default this? +// , size_t stream_pool_size // TODO: describe. Should we default this? ) { @@ -229,12 +233,14 @@ int rmm_wrap_initialize // returns -1 on error, 0 on success return (-1) ; } +#if 0 if(stream_pool_size <= 0) { // std::cout << "Stream pool size must be >=0" << std::endl; // failed to create the alloc_map return (-1) ; } +#endif RMM_WRAP_CHECK_CUDA (cudaSetDevice (device_id)) ; @@ -249,10 +255,12 @@ int rmm_wrap_initialize // returns -1 on error, 0 on success // Construct a resource that uses a coalescing best-fit pool allocator //---------------------------------------------------------------------- +#if 0 // Set CUDA stream pool // std::cout << "Creating rmm_wrap stream pool" << std::endl; rmm_wrap_context[device_id]->stream_pool = make_and_set_cuda_stream_pool(stream_pool_size); RMM_WRAP_CHECK_CUDA(cudaStreamCreate(&(rmm_wrap_context[device_id]->main_stream))); +#endif if (mode == rmm_wrap_host ) { @@ -318,8 +326,8 @@ int rmm_wrap_initialize_all_same ( RMM_MODE mode, // TODO: describe. Should we default this? size_t init_pool_size, // TODO: describe. Should we default this? - size_t max_pool_size, // TODO: describe. Should we default this? - size_t stream_pool_size // TODO: describe. Should we default this? + size_t max_pool_size // TODO: describe. Should we default this? +// , size_t stream_pool_size // TODO: describe. Should we default this? ) { try @@ -387,7 +395,7 @@ int rmm_wrap_initialize_all_same rmm_wrap_context[i] = NULL; uint32_t device_id = devices[i]; // std::cout << "Creating rmm_wrap_context for device_id " << device_id << std::endl; - int ret = rmm_wrap_initialize(device_id, mode, init_pool_size, max_pool_size, stream_pool_size); + int ret = rmm_wrap_initialize(device_id, mode, init_pool_size, max_pool_size ) ; // , stream_pool_size); if(ret < 0) { return ret; } @@ -403,6 +411,7 @@ int rmm_wrap_initialize_all_same } } +#if 0 //------------------------------------------------------------------------------ // rmm_wrap_get_next_stream_from_pool: return the next available stream from // the pool Output is cudaStream_t @@ -434,6 +443,8 @@ void* rmm_wrap_get_main_stream(void) // FIXME: check for errors return rmm_wrap_context[get_current_device()]->main_stream; } +#endif + //------------------------------------------------------------------------------ // rmm_wrap_malloc: malloc-equivalent method using RMM //------------------------------------------------------------------------------ diff --git a/GraphBLAS/rmm_wrap/rmm_wrap.h b/GraphBLAS/rmm_wrap/rmm_wrap.h index 3a081d5a2..7726534a2 100644 --- a/GraphBLAS/rmm_wrap/rmm_wrap.h +++ b/GraphBLAS/rmm_wrap/rmm_wrap.h @@ -55,8 +55,8 @@ int rmm_wrap_initialize uint32_t device_id, RMM_MODE mode, size_t init_pool_size, - size_t max_pool_size, - size_t stream_pool_size + size_t max_pool_size + // , size_t stream_pool_size ) ; // initialize rmm_wrap_contexts for each device in CUDA_VISIBLE_DEVICES @@ -65,8 +65,8 @@ int rmm_wrap_initialize_all_same ( RMM_MODE mode, size_t init_pool_size, - size_t max_pool_size, - size_t stream_pool_size + size_t max_pool_size + // , size_t stream_pool_size ) ; // destroy an RMM resource @@ -83,9 +83,9 @@ void *rmm_wrap_realloc (void *p, size_t newsize) ; void rmm_wrap_free (void *p) ; // Get streams from context (based on current device_id): -void* rmm_wrap_get_next_stream_from_pool(void); -void* rmm_wrap_get_stream_from_pool(size_t stream_id); -void* rmm_wrap_get_main_stream(void); +// void* rmm_wrap_get_next_stream_from_pool(void); +// void* rmm_wrap_get_stream_from_pool(size_t stream_id); +// void* rmm_wrap_get_main_stream(void); #ifdef __cplusplus } diff --git a/GraphBLAS/rmm_wrap/rmm_wrap.hpp b/GraphBLAS/rmm_wrap/rmm_wrap.hpp index 10ba7123c..b293f57bd 100644 --- a/GraphBLAS/rmm_wrap/rmm_wrap.hpp +++ b/GraphBLAS/rmm_wrap/rmm_wrap.hpp @@ -24,8 +24,8 @@ #include #include #include -#include -#include +// #include +// #include #include #include #include @@ -45,6 +45,6 @@ typedef rmm::mr::pool_memory_resource managed_pool_mr; typedef std::unordered_map< std::size_t, std::size_t> alloc_map; -typedef rmm::cuda_stream_pool cuda_stream_pool; -typedef rmm::cuda_stream_view cuda_stream_view; +// typedef rmm::cuda_stream_pool cuda_stream_pool; +// typedef rmm::cuda_stream_view cuda_stream_view; diff --git a/GraphBLAS/rmm_wrap/rmm_wrap_test.c b/GraphBLAS/rmm_wrap/rmm_wrap_test.c index 32aa6b3d8..b84548138 100644 --- a/GraphBLAS/rmm_wrap/rmm_wrap_test.c +++ b/GraphBLAS/rmm_wrap/rmm_wrap_test.c @@ -16,7 +16,7 @@ int main() max_size = 256*(1ULL<<20); //printf(" pool init size %ld, max size %ld\n", init_size, max_size); - rmm_wrap_initialize_all_same( rmm_wrap_managed, init_size, max_size, stream_pool_size ); + rmm_wrap_initialize_all_same( rmm_wrap_managed, init_size, max_size /*, stream_pool_size */); printf("RMM initialized! in managed mode\n"); void *p; @@ -30,7 +30,7 @@ int main() rmm_wrap_deallocate( p, buff_size); rmm_wrap_finalize(); - rmm_wrap_initialize_all_same(rmm_wrap_device, init_size, max_size, stream_pool_size ); + rmm_wrap_initialize_all_same(rmm_wrap_device, init_size, max_size /*, stream_pool_size */); printf("RMM initialized! in device mode\n"); buff_size = (1ULL<<13)+157; From 502ec7768c9f2778e7d14c5ab25c9d88b6c127ab Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 4 Feb 2026 14:15:39 -0600 Subject: [PATCH 4/6] draft SuiteSparse 7.12.2 --- ChangeLog | 25 +++++++++++++++++++++++++ README.md | 2 +- SuiteSparse_config/CMakeLists.txt | 4 ++-- SuiteSparse_config/SuiteSparse_config.h | 6 +++--- 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index dfa968fda..d25b0ee17 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +Feb 4, 2026: version 7.12.2 + + * GraphBLAS 10.3.1: bug fixes + * Package versions in this release: (* denotes a new version) + SuiteSparse_config 7.12.2 * + AMD 3.3.4 + BTF 2.3.3 + CAMD 3.3.5 + CCOLAMD 3.3.5 + CHOLMOD 5.3.4 + COLAMD 3.3.5 + CSparse 4.3.2 + CXSparse 4.4.2 + Example 1.8.10 + GraphBLAS 10.3.1 * + KLU 2.3.6 + LDL 3.3.3 + LAGraph 1.2.1 + SuiteSparse_Mongoose 3.3.6 + ParU 1.1.0 + RBio 4.3.5 + SPEX 3.2.4 + SPQR 4.3.6 + UMFPACK 6.3.7 + Nov 4, 2025: version 7.12.1 * SuiteSparse_config 7.12.1: fix for ninja; checking BLAS properties diff --git a/README.md b/README.md index 29bb520fc..361f8e15b 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ SuiteSparse: A Suite of Sparse matrix packages at http://suitesparse.com ----------------------------------------------------------------------------- -Nov 4, 2025, SuiteSparse VERSION 7.12.1 +Feb 4, 2026, SuiteSparse VERSION 7.12.2 SuiteSparse is a set of sparse-matrix-related packages written or co-authored by Tim Davis, available at https://github.com/DrTimothyAldenDavis/SuiteSparse . diff --git a/SuiteSparse_config/CMakeLists.txt b/SuiteSparse_config/CMakeLists.txt index 7ec5ce1b6..7575a8508 100644 --- a/SuiteSparse_config/CMakeLists.txt +++ b/SuiteSparse_config/CMakeLists.txt @@ -15,10 +15,10 @@ cmake_minimum_required ( VERSION 3.22 ) # version of both SuiteSparse and SuiteSparse_config -set ( SUITESPARSE_DATE "Nov 4, 2025" ) +set ( SUITESPARSE_DATE "Feb 4, 2026" ) set ( SUITESPARSE_VERSION_MAJOR 7 ) set ( SUITESPARSE_VERSION_MINOR 12 ) -set ( SUITESPARSE_VERSION_SUB 1 ) +set ( SUITESPARSE_VERSION_SUB 2 ) set ( SUITESPARSE_CONFIG_VERSION_MAJOR ${SUITESPARSE_VERSION_MAJOR} CACHE STRING "" FORCE ) set ( SUITESPARSE_CONFIG_VERSION_MINOR ${SUITESPARSE_VERSION_MINOR} CACHE STRING "" FORCE ) set ( SUITESPARSE_CONFIG_VERSION_PATCH ${SUITESPARSE_VERSION_SUB} CACHE STRING "" FORCE ) diff --git a/SuiteSparse_config/SuiteSparse_config.h b/SuiteSparse_config/SuiteSparse_config.h index a5f5ef45d..fffccfa33 100644 --- a/SuiteSparse_config/SuiteSparse_config.h +++ b/SuiteSparse_config/SuiteSparse_config.h @@ -449,10 +449,10 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #define SUITESPARSE_HAS_VERSION_FUNCTION -#define SUITESPARSE_DATE "Nov 4, 2025" +#define SUITESPARSE_DATE "Feb 4, 2026" #define SUITESPARSE_MAIN_VERSION 7 #define SUITESPARSE_SUB_VERSION 12 -#define SUITESPARSE_SUBSUB_VERSION 1 +#define SUITESPARSE_SUBSUB_VERSION 2 // version format x.y #define SUITESPARSE_VER_CODE(main,sub) ((main) * 1000 + (sub)) @@ -461,7 +461,7 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION // version format x.y.z #define SUITESPARSE__VERCODE(main,sub,patch) \ (((main)*1000ULL + (sub))*1000ULL + (patch)) -#define SUITESPARSE__VERSION SUITESPARSE__VERCODE(7,12,1) +#define SUITESPARSE__VERSION SUITESPARSE__VERCODE(7,12,2) //============================================================================== // SuiteSparse interface to the BLAS and LAPACK libraries From e9735894d7d0c688aa3f249ba6318aba0dc81059 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Thu, 5 Feb 2026 12:16:16 -0600 Subject: [PATCH 5/6] date and ChangeLog for 7.12.2 --- ChangeLog | 8 ++++++-- README.md | 2 +- SuiteSparse_config/CMakeLists.txt | 2 +- SuiteSparse_config/SuiteSparse_config.h | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index d25b0ee17..4b69015db 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,10 @@ -Feb 4, 2026: version 7.12.2 +Feb 5, 2026: version 7.12.2 - * GraphBLAS 10.3.1: bug fixes + * GraphBLAS 10.3.1: bug and documentation fixes, performance improvements, + and printing of user-defined types using get/set with + GxB_PRINT_FUNCTION. + * SuiteSparse_config 7.12.2: checking for BLAS libraries; better handling + of BLA_VENDOR input parameter to cmake * Package versions in this release: (* denotes a new version) SuiteSparse_config 7.12.2 * AMD 3.3.4 diff --git a/README.md b/README.md index 361f8e15b..75eda02f1 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ SuiteSparse: A Suite of Sparse matrix packages at http://suitesparse.com ----------------------------------------------------------------------------- -Feb 4, 2026, SuiteSparse VERSION 7.12.2 +Feb 5, 2026, SuiteSparse VERSION 7.12.2 SuiteSparse is a set of sparse-matrix-related packages written or co-authored by Tim Davis, available at https://github.com/DrTimothyAldenDavis/SuiteSparse . diff --git a/SuiteSparse_config/CMakeLists.txt b/SuiteSparse_config/CMakeLists.txt index 7575a8508..c53ec6621 100644 --- a/SuiteSparse_config/CMakeLists.txt +++ b/SuiteSparse_config/CMakeLists.txt @@ -15,7 +15,7 @@ cmake_minimum_required ( VERSION 3.22 ) # version of both SuiteSparse and SuiteSparse_config -set ( SUITESPARSE_DATE "Feb 4, 2026" ) +set ( SUITESPARSE_DATE "Feb 5, 2026" ) set ( SUITESPARSE_VERSION_MAJOR 7 ) set ( SUITESPARSE_VERSION_MINOR 12 ) set ( SUITESPARSE_VERSION_SUB 2 ) diff --git a/SuiteSparse_config/SuiteSparse_config.h b/SuiteSparse_config/SuiteSparse_config.h index fffccfa33..57623c6f6 100644 --- a/SuiteSparse_config/SuiteSparse_config.h +++ b/SuiteSparse_config/SuiteSparse_config.h @@ -449,7 +449,7 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #define SUITESPARSE_HAS_VERSION_FUNCTION -#define SUITESPARSE_DATE "Feb 4, 2026" +#define SUITESPARSE_DATE "Feb 5, 2026" #define SUITESPARSE_MAIN_VERSION 7 #define SUITESPARSE_SUB_VERSION 12 #define SUITESPARSE_SUBSUB_VERSION 2 From 7891801aaf114b8da54239ffc750230be99c5649 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Thu, 5 Feb 2026 12:45:44 -0600 Subject: [PATCH 6/6] fix comment in SuiteSparse_config.h re: BLAS suffix --- SuiteSparse_config/Config/SuiteSparse_config.h.in | 6 +++++- SuiteSparse_config/SuiteSparse_config.h | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/SuiteSparse_config/Config/SuiteSparse_config.h.in b/SuiteSparse_config/Config/SuiteSparse_config.h.in index ff2eb4018..6e06022bf 100644 --- a/SuiteSparse_config/Config/SuiteSparse_config.h.in +++ b/SuiteSparse_config/Config/SuiteSparse_config.h.in @@ -589,7 +589,7 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION ok = ok && ((sizeof (K) >= sizeof (k)) || ((int64_t)(K) == (int64_t)(k))) ; //------------------------------------------------------------------------------ -// SUITESPARSE_BLAS_SUFFIX: modify the name of a Fortran BLAS/LAPACK routine +// BLAS64_SUFFIX: modify the name of a Fortran BLAS/LAPACK routine //------------------------------------------------------------------------------ // OpenBLAS can be compiled by appending a suffix to each routine, so that the @@ -606,6 +606,10 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION // cd build && cmake -DBLAS64_SUFFIX="_64" .. +// Fedora compiles OpenBLAS with the "64_" suffix and should use: + +// cd build && cmake -DBLAS64_SUFFIX="64_" .. + // This setting could be used by the spack packaging of SuiteSparse when linked // with the spack-installed OpenBLAS with 64-bit integers. See // https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/suite-sparse/package.py diff --git a/SuiteSparse_config/SuiteSparse_config.h b/SuiteSparse_config/SuiteSparse_config.h index 57623c6f6..68abaeda0 100644 --- a/SuiteSparse_config/SuiteSparse_config.h +++ b/SuiteSparse_config/SuiteSparse_config.h @@ -589,7 +589,7 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION ok = ok && ((sizeof (K) >= sizeof (k)) || ((int64_t)(K) == (int64_t)(k))) ; //------------------------------------------------------------------------------ -// SUITESPARSE_BLAS_SUFFIX: modify the name of a Fortran BLAS/LAPACK routine +// BLAS64_SUFFIX: modify the name of a Fortran BLAS/LAPACK routine //------------------------------------------------------------------------------ // OpenBLAS can be compiled by appending a suffix to each routine, so that the @@ -606,6 +606,10 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION // cd build && cmake -DBLAS64_SUFFIX="_64" .. +// Fedora compiles OpenBLAS with the "64_" suffix and should use: + +// cd build && cmake -DBLAS64_SUFFIX="64_" .. + // This setting could be used by the spack packaging of SuiteSparse when linked // with the spack-installed OpenBLAS with 64-bit integers. See // https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/suite-sparse/package.py