-
Notifications
You must be signed in to change notification settings - Fork 8
Differentiation functions with Box<dyn Trait> args fails #193
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
@ZuseZ4, any recommendations about where in the codebase to look to examine calling traits through Box? Happy to attempt to try something myself with some pointers. |
I'm currently traveling, but I'll be back at my laptop on the 23rd, then I can look closer at the runtime inactivity. In the meantime, if you have a local build, can you run cargo +expand and post the ad macro expansions? Otherwise there might be flags to get the output from the explorer. Support for Generics should be easy to add, we had support in an earlier implementation. You need to adjust the frontend to not error on generics, and adjust the autodiff function body to call the generic primal function. I will look up the two locations in my frontend pr that you'd need to modify for that. |
Here it is:
|
@wsmoses Any suggestions? |
I’ve been looking into this Looking at the expanded code - @ZuseZ4 - Any suggestions on where in the codebase to start investigating trait object support? I’m guessing either the macro expansion logic - or wherever runtime activity is managed - but I’m not sure where to focus. If there’s a simple test I could run - like bypassing dynamic dispatch to narrow it down - I’d be happy to try it with some guidance. Also, you noted generics needing frontend tweaks - would trait objects follow a similar fix? I’d like to dig deeper into this. Thanks for any pointers you can share! |
@KMJ-007 The error message comes from Enzyme:
but I don't see explanations on the website (enzyme.mit.edu), or on the code next to it. I just remembered that a lot of people were confused about this in the past, and I did find a few issues of users (including me, lol) asking about it. If you learn anything about it, please make a PR against github.com/EnzymeAD/rustbook to update our docs here, either under chapter 4 or 12. Even if we don't find a full solution directly, we'd want to avoid that the next person spending time on it has to start from zero. To figure out how to use it, I'd recommend to start by lowering a reproducer (like the one in the first post) to LLVM-IR, and reproducing it through opt first. Once you managed that, you can try to manually rewrite the llvm-ir to include the virtualreverse thing, and see if that fixes anything. Maybe EnzymeAd/Enzyme also has testcases using it, which could help with understanding usages. IF you manage to get anything to work (or are stuck) just ping me, and we can go backwards from there, trying to generate the right code from Rust to automate what you did by hand. EnzymeAD/Enzyme#316 |
thankyou, I was scratching my head for this, this will help really great way, i have updated the docs for now and created PR in EnzymeAD/rustbook, if anything wrong or something needs to be changed please let me know, I will look into the reproducible soon |
@motabbara I just created an issue for generics, and while poking it a bit I realized that the rustc_autodiff attribute can already handle generics, just the macro not, so it should be a trivial fix. #![feature(autodiff)]
#![feature(prelude_import)]
#![feature(print_internals)]
#![feature(fmt_helpers_for_derive)]
#![feature(rustc_attrs)]
#[prelude_import]
use std::prelude::rust_2021::*;
use std::arch::asm;
#[macro_use]
extern crate std;
use std::autodiff::autodiff;
use std::fmt;
struct Foo {
pub test: f64,
}
#[automatically_derived]
impl ::core::fmt::Debug for Foo {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "Foo", "test", &&self.test)
}
}
pub trait Cool: fmt::Debug {
fn gen(&self) -> f64;
}
impl Cool for Foo {
fn gen(&self) -> f64 {
self.test * self.test
}
}
#[rustc_autodiff]
#[inline(never)]
pub fn square3<U: Cool>(num: &U, result: &mut f64) {
*result = num.gen();
}
#[rustc_autodiff(Reverse, 1, Duplicated, Duplicated, None)]
#[inline(never)]
pub fn dsquare3<U: Cool>(num: &U, dnum_0: &mut U, result: &mut f64, dresult_0: &mut f64) {
unsafe {
asm!("NOP", options(nomem));
};
::core::hint::black_box(square3(num, result));
::core::hint::black_box((dnum_0, dresult_0));
}
fn main() {
let mut result = 1.0;
let mut dresult = 0.0;
let foo = Foo { test: 3.0 };
let mut dfoo = Foo { test: 0.0 };
dsquare3(&foo, &mut dfoo, &mut result, &mut dresult);
{
::std::io::_print(format_args!("Result: {0}\n", result));
};
{
::std::io::_print(format_args!("dResult: {0}\n", dresult));
};
} |
Hey @ZuseZ4 can you give me some beginner friendly issues so I can get more idea about the enzyme codebase and LLVM |
That's great @ZuseZ4 . How does the dyn trait stuff look? |
@motabbara I wrote down some instructions on how to analyze it and potentially add support in #193 (comment), but I don't think anyone is currently looking at it, so feel free to give it a try if you have time. My own focus this week is to get std::autodiff on nightly, I currently have linux (x86-64+aarch) working, windows and macos are failing CI: rust-lang#140064 |
Hey @ZuseZ4 , I can look into this.. |
@motabbara Just as a small update, I reviewed and merged a fix for generic support a few days ago. |
@ZuseZ4 is that in nightly or should I be building my own from one of the branches here? |
@luxteknika https://rustc-dev-guide.rust-lang.org/autodiff/installation.html#installation |
Please see https://fwd.gymni.ch/eTJnUQ
Fail on "Attempting to call an indirect active function whose runtime value is inactive".
Incidentally, generic functions fail to differentiate even without the box e.g,.,
The text was updated successfully, but these errors were encountered: