# JuliaDiff and MPI

**URL:** <https://discourse.julialang.org/t/juliadiff-and-mpi/30983>\
**Category:** Modelling & Simulations\
**Created:** [November 12, 2019, 1:23am UTC](https://discourse.julialang.org/t/juliadiff-and-mpi/30983 "2019-11-12T01:23:26Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Kotaro\_Anno](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kotaro_anno/32/11246_2.png) [@Kotaro\_Anno](https://discourse.julialang.org/u/Kotaro_Anno)\
**Post date:** [November 12, 2019, 1:23am UTC](https://discourse.julialang.org/t/juliadiff-and-mpi/30983/1 "2019-11-12T01:23:26Z")

</div>

I’m interested in implementing both of JuliaDiff (automatic differentiation) and MPI.

MPI needs domain decomposition, but I’m not sure JuliaDiff can deal with domain decomposition.  
And I can’t find good documents about this.

Would someone know how to implement automatic differentiation and MPI simultaneously?

Thank you.

---

<div class="post-metadata">

**Author:** ![longemen3000](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/longemen3000/32/7298_2.png) [@longemen3000](https://discourse.julialang.org/u/longemen3000)\
**Post date:** [November 12, 2019, 4:01am UTC](https://discourse.julialang.org/t/juliadiff-and-mpi/30983/2 "2019-11-12T04:01:44Z")

</div>

i don’t know if with reverse differentiation is this possible, but it can be done with forward differentiation, if we are talking about gradients.  
The basis is the dual number:

```julia
x1 = ForwardDiff.Dual(3.0,1.0) # Dual{Nothing}(3.0,1.0)

```

evaluating x on a function, returns a dual:

```julia
f(x) = 2x
dfdx = f(x1) #Dual{Nothing}(6.0,2.0)
dfdx.partials[1] # 2.0

```

every number has a tag to stop perturbation confusion (dx is different from dy). the tag goes on the type parameter (in my case is `nothing`).  
A gradient is the evaluation on a vector of duals, if you evaluate a function dual by dual, or by chunks, you can distribute that, i think

---

<div class="post-metadata">

**Author:** ![longemen3000](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/longemen3000/32/7298_2.png) [@longemen3000](https://discourse.julialang.org/u/longemen3000)\
**Post date:** [November 12, 2019, 4:03am UTC](https://discourse.julialang.org/t/juliadiff-and-mpi/30983/3 "2019-11-12T04:03:32Z")

</div>

what ForwardDiff.jl does is automate this dual evaluation behind convenience functions, performing tagging, evaluation and just giving you the final result. but the basis is the use of Dual Numbers

---

<div class="post-metadata">

**Author:** ![Kotaro\_Anno](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kotaro_anno/32/11246_2.png) [@Kotaro\_Anno](https://discourse.julialang.org/u/Kotaro_Anno)\
**Post date:** [November 12, 2019, 4:24pm UTC](https://discourse.julialang.org/t/juliadiff-and-mpi/30983/4 "2019-11-12T16:24:25Z")

</div>

This is what I wanted to know.  
Thank you very much! I really appreciate it.
