Compiler error when using Eigen's matrix multiplication
- Dominant language
- LLVM
- Stars
- 1.7k
- Forks
- 188
- Avg merge
- 2d 4h
- Merged PRs (30d)
- 22
Description
Hi, I am trying to create some simple autodiff examples using [Eigen](https://eigen.tuxfamily.org/index.php?title=Main_Page). I am using Enzyme v0.0.195 and clang 18.
``` c++
#include
#include
template
void __enzyme_autodiff(void*, T...);
int enzyme_dup;
int enzyme_out;
int enzyme_const;
double objective(const Eigen::VectorXd& x) {
Eigen::MatrixXd a = Eigen::MatrixXd::Ones(2, 2);
a.array() += x[0];
Eigen::MatrixXd b = Eigen::MatrixXd::Ones(1, 2);
b.array() += x[1];
// doesn't work
auto c = b * a;
return c.sum();
// does work
// return a.sum();
}
double inplace_objective(double& result, const Eigen::VectorXd& x) {
result = objective(x);
return result;
}
int main() {
Eigen::VectorXd x = Eigen::VectorXd(3);
x << 1.0, 3.0, 42.0;
Eigen::VectorXd g = Eigen::VectorXd::Zero(3);
double result = 0.0;
double seed = 0.0;
__enzyme_autodiff((void*)inplace_objective, enzyme_dup, &result, &seed, enzyme_dup, x, &g);
std::println("input:");
std::println("x[0]: {}, x[1]: {}, x[2]: {}\n", x[0], x[1], x[2]);
std::println("outputs:");
std::println("y: {} ({}), seed: {}", result, objective(x), seed);
std::println("g[0]: {}, g[1]: {}, g[2]: {}", g[0], g[1], g[2]);
return 0;
}
```
I have tried various compiler flags/blas etc (mostly suggestions from claude) but I am quite stuck. I have seen the [test cases which use Eigen's matrix multiplication](https://github.com/EnzymeAD/Enzyme/blob/main/enzyme/test/Integration/ReverseMode/simpleeigen-made.cpp) so I was surprised this does not work - here is an example of some output:
``` bash
$ ninja -v
[1/2] /usr/bin/clang++ -DEIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT -DEIGEN_DONT_ALIGN_STATICALLY -DEIGEN_DONT_PARALLELIZE -DEIGEN_DONT_USE_BLAS_LAPACK -DEIGEN_DONT_VECTORIZE -DEIGEN_MAX_STATIC_ALIGN_BYTES=0 -DEIGEN_NO_DEBUG -DEIGEN_NO_MALLOC -I/home/jeff/workspace/enzo/include -isystem /usr/include/eigen3 -std=gnu++23 -Wall -Wextra -Wpedantic -Wshadow -fdiagnostics-color=always -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -fplugin=/home/jeff/workspace/installs/lib/ClangEnzyme-18.so -MD -MT tests/CMakeFiles/test_gradients.dir/test_gradients.cpp.o -MF tests/CMakeFiles/test_gradients.dir/test_gradients.cpp.o.d -o tests/CMakeFiles/test_gradients.dir/test_gradients.cpp.o -c /home/jeff/workspace/enzo/tests/test_gradients.cpp
FAILED: tests/CMakeFiles/test_gradients.dir/test_gradients.cpp.o
/usr/bin/clang++ -DEIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT -DEIGEN_DONT_ALIGN_STATICALLY -DEIGEN_DONT_PARALLELIZE -DEIGEN_DONT_USE_BLAS_LAPACK -DEIGEN_DONT_VECTORIZE -DEIGEN_MAX_STATIC_ALIGN_BYTES=0 -DEIGEN_NO_DEBUG -DEIGEN_NO_MALLOC -I/home/jeff/workspace/enzo/include -isystem /usr/include/eigen3 -std=gnu++23 -Wall -Wextra -Wpedantic -Wshadow -fdiagnostics-color=always -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -fplugin=/home/jeff/workspace/installs/lib/ClangEnzyme-18.so -MD -MT tests/CMakeFiles/test_gradients.dir/test_gradients.cpp.o -MF tests/CMakeFiles/test_gradients.dir/test_gradients.cpp.o.d -o tests/CMakeFiles/test_gradients.dir/test_gradients.cpp.o -c /home/jeff/workspace/enzo/tests/test_gradients.cpp
freeing without malloc ptr %0
freeing without malloc ptr %0
error: Enzyme: cannot compute with global variable that doesn't have marked shadow global
@_ZZN5Eigen8internal20manage_caching_sizesENS_6ActionEPlS2_S2_E12m_cacheSizes = linkonce_odr dso_local global %"struct.Eigen::internal::CacheSizes" zeroinitializer, comdat, align 8
error: Enzyme: cannot compute with global variable that doesn't have marked shadow global
@_ZZN5Eigen8internal20manage_caching_sizesENS_6ActionEPlS2_S2_E12m_cacheSizes = linkonce_odr dso_local global %"struct.Eigen::internal::CacheSizes" zeroinitializer, comdat, align 8
error: Enzyme: cannot compute with global variable that doesn't have marked shadow global
@_ZZN5Eigen8internal20manage_caching_sizesENS_6ActionEPlS2_S2_E12m_cacheSizes = linkonce_odr dso_local global %"struct.Eigen::internal::CacheSizes" zeroinitializer, comdat, align 8
error: Enzyme: cannot compute with global variable that doesn't have marked shadow global
@_ZZN5Eigen8internal20manage_caching_sizesENS_6ActionEPlS2_S2_E12m_cacheSizes = linkonce_odr dso_local global %"struct.Eigen::internal::CacheSizes" zeroinitializer, comdat, align 8
error: Enzyme: cannot compute with global variable that doesn't have marked shadow global
@_ZZN5Eigen8internal20manage_caching_sizesENS_6ActionEPlS2_S2_E12m_cacheSizes = linkonce_odr dso_local global %"struct.Eigen::internal::CacheSizes" zeroinitializer, comdat, align 8
error: Enzyme: cannot compute with global variable that doesn't have marked shadow global
@_ZZN5Eigen8internal20manage_caching_sizesENS_6ActionEPlS2_S2_E12m_cacheSizes = linkonce_odr dso_local global %"struct.Eigen::internal::CacheSizes" zeroinitializer, comdat, align 8
freeing without malloc ptr %0
freeing without malloc ptr %0
error: Enzyme: cannot compute with global variable that doesn't have marked shadow global
@_ZZN5Eigen8internal20manage_caching_sizesENS_6ActionEPlS2_S2_E12m_cacheSizes = linkonce_odr dso_local global %"struct.Eigen::internal::CacheSizes" zeroinitializer, comdat, align 8
7 errors generated.
ninja: build stopped: subcommand failed.
```
Any advice on how to get this working would be amazing. Thank you.
Contributor guide
Assessment
This issue has not been assessed yet.