JuliaSIMD / JuliaSIMD/LoopVectorization.jl
Use with ForwardDiff
- Lenguaje dominante
- Julia
- Estrellas
- 789
- Forks
- 73
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Descripción
I was trying to use this with ForwardDiff, but not an array of structs like #19, just using dual numbers within a loop and then extracting ordinary numbers. Something like this:
```julia
dA = ForwardDiff.Dual(0.0, (1.0, 0.0))
dB = ForwardDiff.Dual(0.0, (0.0, 1.0))
for i in axes(A,1)
tmp = (A[i] + dA) * log(B[i] + dB)
C[i] = ForwardDiff.partials(tmp, 1)
...
```
I got this to run with `@avx` on the loop, by filling in whatever methods were missing, such as:
```julia
function Base.:+(x::Dual{Z,T,D}, sv::SVec{N}) where {Z,T<:Number,D,N}
duals = ntuple(n -> +(x, sv[n]), N)
Dual(svec(val.(duals)), ntuple(d -> svec(partials.(duals, d)), D))
end
@inline val(d::Dual) = d.value
@inline svec(tup::NTuple{N,T}) where {N,T} = SVec{N,T}(tup...)
```
However the result is slower than without, and has many more allocations.
I wonder whether this is expected to work, and whether adding methods like this is right thing to do? I can tidy up an example if there isn't an obvious fatal flaw here.
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Línea de trabajo
Comienza con el ejemplo de bucle de ForwardDiff y @avx del issue, compáralo con la versión no vectorizada y mide las asignaciones de memoria. Se considera terminado cuando se haya determinado si este uso está soportado y si métodos como los mostrados son apropiados, con un ejemplo reproducible o una limitación clara.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- julia
- Área
- performance
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100