EnzymeAD / EnzymeAD/Enzyme

Compiler error when using Eigen's matrix multiplication

Open
#2,437 0 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.