cblas_dgemm fails to compile
- Dominant language
- LLVM
- Stars
- 1.7k
- Forks
- 188
- Avg merge
- 1d 22h
- Merged PRs (30d)
- 26
Description
Hello.
I have tried to make a small example showing some issues when trying to use `cblas_dgemm` inside an objective function. I see there are various tests in Enzyme regarding using cblas_* stuff so I was hopeful this would work, perhaps it is a geniune Enzyme bug or I have mis-used?
Any help would be great.
I've written the code so you can compile with no defines, `-DENZYME_ISSUE_1` (gradient wrt `alpha` in gemm) and `-DENZYME_ISSUE_2` (gradient wrt values in matrix `x`).
``` c++
// clang++ blas.cpp -O2 -std=c++23 -lblas -fplugin=/home/jeff/workspace/Enzyme/build/Enzyme/ClangEnzyme-20.so -DENZYME_ISSUE_(1|2)
#include
#include
#include
template
Return __enzyme_autodiff(void*, T...);
int enzyme_dup;
int enzyme_const;
int enzyme_out;
double objective(const double alpha, const double* x, const double* y, const int n) {
std::vector z(n * n);
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, n, n, n, alpha, x, n, y, n, 0.0, z.data(), n);
double result = 0.0;
for (int i = 0; i < n * n; ++i) {
result += z[i];
}
return result;
}
int main() {
const int n = 3;
std::vector x(n * n, 1.0);
std::vector y(n * n, 2.0);
double alpha = 3.14;
double v = objective(alpha, x.data(), y.data(), n);
std::printf("v = %f\n", v);
#ifdef ENZYME_ISSUE_1
// fails with many lines
double g = __enzyme_autodiff((void*)objective, enzyme_out, alpha, enzyme_const, x.data(), enzyme_const, y.data(), enzyme_const, n);
std::printf("g = %f\n", g);
#endif
#ifdef ENZYME_ISSUE_2
// /usr/bin/ld: /tmp/blas-a3b7db.o: in function `diffe_Z9objectivedPKdS0_i':
// blas.cpp:(.text+0x912): undefined reference to `cblas_dlascl'
// clang++: error: linker command failed with exit code 1 (use -v to see invocation)
std::vector g(n * n);
__enzyme_autodiff((void*)objective, enzyme_const, alpha, enzyme_dup, x.data(), g.data(), enzyme_const, y.data(), enzyme_const, n);
for (int i = 0; i < n * n; ++i) {
std::printf("g[%i] = %f\n", i, g[i]);
}
#endif
return 0;
}
```
Thanks!
Contributor guide
Assessment
This issue has not been assessed yet.