stan-dev / math

The Stan Math Library is a C++ template library for automatic differentiation of any order using forward, reverse, and mixed modes. It includes a range of built-in functions for probabilistic modeling, linear algebra, and equation solving.
https://mc-stan.org
BSD 3-Clause "New" or "Revised" License
723 stars 183 forks source link

Fix csr_matrix_times_vector linker error #3048

Closed SteveBronder closed 2 months ago

SteveBronder commented 2 months ago

Summary

Fixes https://github.com/stan-dev/rstanarm/issues/620 and cleans up csr_matrix_times_vector.

The csr_matrix_times_vector function was erroring when linking. @WardBrian and I suspect the issue has something to do with the length of the mangled names of either the vtable elements or the windows debugger in mingw. Either way, this PR cuts down on the number of elements that need to be passed to the lamda in the reverse pass callback of csr_matrix_times_vector which seems to remove the error. The full list of changes are below.

  1. Cleans up csr_matrix_times_vector, we now always cast to a SoA Sparse Matrix before setting up the reverse pass callback.
  2. Fixes several small bugs in the arena_matrix, there was a missing const_cast for copying one arena_matrix of sparse type to another.
  3. Adds a new function to_soa_sparse_matrix for taking objects that are used to represent a sparse matrices CSR format and returning a var_value<SparseMatrix>.
  4. Adds a new constructor for var_value<SparseMatrix/Matrix> that accepts two arena matrices for pre allocated values and adjoints. This is used in to_soa_sparse_matrix so that w's values and adjoints are only shallow copied into the var_value<SparseMatrix>
  5. Adds a new value_of() function for getting the values of a SparseMatrix<var>
  6. Adds an overload for promote_scalar_type for sparse matrix types
  7. Fixes a bug in the vari_value<SparseMatrix>(arena_matrix) constructor. If an arena matrix was passed in previously it would be shallow copied to the values and adjoints which would share the value pointer between the two. Now the outer index pointer and inner index pointer are shared between the two, but each has their own pointer for the values.

Tests

Tests were added for the new to_soa_matrix function. Tests for the changed functions can be run with

python3 ./runTests.py ./test/unit/math/rev/fun/to_soa_sparse_matrix_test.cpp ./test/unit/math/mix/fun/csr_matrix_times_vector_test.cpp

Release notes

Fixes linker issue with csr_matrix_times_vector

Checklist

stan-buildbot commented 2 months ago

Name Old Result New Result Ratio Performance change( 1 - new / old )
arma/arma.stan 0.2 0.19 1.04 4.02% faster
low_dim_corr_gauss/low_dim_corr_gauss.stan 0.01 0.01 1.06 5.52% faster
gp_regr/gen_gp_data.stan 0.02 0.02 0.99 -0.7% slower
gp_regr/gp_regr.stan 0.12 0.11 1.17 14.5% faster
sir/sir.stan 77.59 76.34 1.02 1.62% faster
irt_2pl/irt_2pl.stan 3.84 3.91 0.98 -1.62% slower
eight_schools/eight_schools.stan 0.05 0.05 1.03 2.56% faster
pkpd/sim_one_comp_mm_elim_abs.stan 0.25 0.25 1.0 -0.23% slower
pkpd/one_comp_mm_elim_abs.stan 17.84 18.19 0.98 -1.94% slower
garch/garch.stan 0.44 0.46 0.94 -5.9% slower
low_dim_gauss_mix/low_dim_gauss_mix.stan 2.77 2.84 0.97 -2.72% slower
arK/arK.stan 1.64 1.66 0.99 -0.74% slower
gp_pois_regr/gp_pois_regr.stan 2.56 2.58 0.99 -1.01% slower
low_dim_gauss_mix_collapse/low_dim_gauss_mix_collapse.stan 9.0 9.42 0.95 -4.73% slower
performance.compilation 174.02 177.04 0.98 -1.74% slower

Mean result: 1.0070968703366234


Jenkins Console Log Blue Ocean Commit hash: ffae22a76851e3b49ca43f31234eeada692f1d9b


Machine information No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.3 LTS Release: 20.04 Codename: focal CPU: Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian Address sizes: 46 bits physical, 48 bits virtual CPU(s): 80 On-line CPU(s) list: 0-79 Thread(s) per core: 2 Core(s) per socket: 20 Socket(s): 2 NUMA node(s): 2 Vendor ID: GenuineIntel CPU family: 6 Model: 85 Model name: Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz Stepping: 4 CPU MHz: 2400.000 CPU max MHz: 3700.0000 CPU min MHz: 1000.0000 BogoMIPS: 4800.00 Virtualization: VT-x L1d cache: 1.3 MiB L1i cache: 1.3 MiB L2 cache: 40 MiB L3 cache: 55 MiB NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78 NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79 Vulnerability Gather data sampling: Mitigation; Microcode Vulnerability Itlb multihit: KVM: Mitigation: VMX disabled Vulnerability L1tf: Mitigation; PTE Inversion; VMX conditional cache flushes, SMT vulnerable Vulnerability Mds: Mitigation; Clear CPU buffers; SMT vulnerable Vulnerability Meltdown: Mitigation; PTI Vulnerability Mmio stale data: Mitigation; Clear CPU buffers; SMT vulnerable Vulnerability Retbleed: Mitigation; IBRS Vulnerability Spec rstack overflow: Not affected Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl Vulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization Vulnerability Spectre v2: Mitigation; IBRS, IBPB conditional, STIBP conditional, RSB filling, PBRSB-eIBRS Not affected Vulnerability Srbds: Not affected Vulnerability Tsx async abort: Mitigation; Clear CPU buffers; SMT vulnerable Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti intel_ppin ssbd mba ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req pku ospke md_clear flush_l1d arch_capabilities G++: g++ (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0 Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Clang: clang version 10.0.0-4ubuntu1 Target: x86_64-pc-linux-gnu Thread model: posix InstalledDir: /usr/bin
stan-buildbot commented 2 months ago

Name Old Result New Result Ratio Performance change( 1 - new / old )
arma/arma.stan 0.24 0.19 1.25 20.24% faster
low_dim_corr_gauss/low_dim_corr_gauss.stan 0.01 0.01 1.09 8.31% faster
gp_regr/gen_gp_data.stan 0.02 0.02 1.1 8.78% faster
gp_regr/gp_regr.stan 0.11 0.1 1.06 5.55% faster
sir/sir.stan 77.81 75.65 1.03 2.77% faster
irt_2pl/irt_2pl.stan 3.79 3.98 0.95 -5.04% slower
eight_schools/eight_schools.stan 0.05 0.05 1.03 3.29% faster
pkpd/sim_one_comp_mm_elim_abs.stan 0.24 0.25 0.98 -2.48% slower
pkpd/one_comp_mm_elim_abs.stan 17.96 18.33 0.98 -2.09% slower
garch/garch.stan 0.44 0.48 0.92 -9.22% slower
low_dim_gauss_mix/low_dim_gauss_mix.stan 2.78 2.85 0.98 -2.51% slower
arK/arK.stan 1.62 1.68 0.96 -3.89% slower
gp_pois_regr/gp_pois_regr.stan 2.48 2.54 0.98 -2.44% slower
low_dim_gauss_mix_collapse/low_dim_gauss_mix_collapse.stan 9.06 9.3 0.97 -2.72% slower
performance.compilation 173.05 176.36 0.98 -1.91% slower

Mean result: 1.0169277909864227


Jenkins Console Log Blue Ocean Commit hash: d8ac1c67d08c8b579e1b20ed5747abacce87c6fc


Machine information No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.3 LTS Release: 20.04 Codename: focal CPU: Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian Address sizes: 46 bits physical, 48 bits virtual CPU(s): 80 On-line CPU(s) list: 0-79 Thread(s) per core: 2 Core(s) per socket: 20 Socket(s): 2 NUMA node(s): 2 Vendor ID: GenuineIntel CPU family: 6 Model: 85 Model name: Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz Stepping: 4 CPU MHz: 2400.000 CPU max MHz: 3700.0000 CPU min MHz: 1000.0000 BogoMIPS: 4800.00 Virtualization: VT-x L1d cache: 1.3 MiB L1i cache: 1.3 MiB L2 cache: 40 MiB L3 cache: 55 MiB NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78 NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79 Vulnerability Gather data sampling: Mitigation; Microcode Vulnerability Itlb multihit: KVM: Mitigation: VMX disabled Vulnerability L1tf: Mitigation; PTE Inversion; VMX conditional cache flushes, SMT vulnerable Vulnerability Mds: Mitigation; Clear CPU buffers; SMT vulnerable Vulnerability Meltdown: Mitigation; PTI Vulnerability Mmio stale data: Mitigation; Clear CPU buffers; SMT vulnerable Vulnerability Retbleed: Mitigation; IBRS Vulnerability Spec rstack overflow: Not affected Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl Vulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization Vulnerability Spectre v2: Mitigation; IBRS, IBPB conditional, STIBP conditional, RSB filling, PBRSB-eIBRS Not affected Vulnerability Srbds: Not affected Vulnerability Tsx async abort: Mitigation; Clear CPU buffers; SMT vulnerable Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti intel_ppin ssbd mba ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req pku ospke md_clear flush_l1d arch_capabilities G++: g++ (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0 Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Clang: clang version 10.0.0-4ubuntu1 Target: x86_64-pc-linux-gnu Thread model: posix InstalledDir: /usr/bin