Soy consciente de la existencia de SIMD.jl. Sin embargo, creo que la generación de código fundamental de los vectores SIMD debería ser compatible de una manera más fácil en la propia base de Julia y ocultar algunos de los detalles en la tupla de envoltura en lugar de simplemente por el tipo subyacente.
Por lo tanto, mi propuesta sería definir algún tipo VecTuple{N,T}
que esencialmente sería equivalente al actual NTuple{N, VecElement{T}}
. La diferencia sería que las propiedades de codegen VecElement
aplicarían implícitamente si fuera necesario, pero ligadas a la tupla en lugar del elemento. De esta manera, acceder a elementos individuales de la tupla no necesitaría pasar por una conversión adicional T <-> VecElement{T}
. Actualmente, acceder a un solo elemento de un NTuple{N, VecElement{T}}
requiere x[i].value
lugar de simplemente x[i]
.
Además, los requisitos para el tamaño y la alineación de tipo total, o qué tipos fundamentales (tamaños de bits de 8 a 64) están permitidos, estarían vinculados a la tupla especializada. Vea también # 20961.
No estoy sugiriendo agregar todas las operaciones posibles en los vectores SIMD a la base de Julia. Ciertamente hay demasiados (piense en barajar, transponer o invertir). Todo esto aún podría dejarse en paquetes especializados por el momento, simplemente cambiando el tipo de cómo la propiedad de codegen LLVM más fundamental está vinculada a la tupla.
( VecTuple
es, por supuesto, solo un marcador de posición para cualquier nombre conveniente al respecto).
Solo como un recordatorio para los demás, no tenemos VecTuple ya que Tuple no se define como un tipo de vector abstracto, por lo que es un choque parcial de términos hablar de una tupla vectorizada.
Una idea de cómo proceder sería crear un nuevo paquete que describa lo que cree que debería ir a la base. Llámelo, por ejemplo, SIMDBase
. Luego podemos redirigir SIMD
a ese paquete, lo que, si su suposición es correcta, simplificaría SIMD
. Una vez que la gente esté de acuerdo con la funcionalidad proporcionada por SIMDBase
, podría trasladarse a Base.
Por ejemplo, no me importaría si algunas de las contorsiones de llamadas LLVM de bajo nivel pudieran manejarse en otro lugar.
Como referencia, los tipos intrínsecos de SIMD también se analizan en detalle aquí: # 2299
Intentaré pensar en algún concepto factible ... puede que tarde un poco.
Comentario más útil
Una idea de cómo proceder sería crear un nuevo paquete que describa lo que cree que debería ir a la base. Llámelo, por ejemplo,
SIMDBase
. Luego podemos redirigirSIMD
a ese paquete, lo que, si su suposición es correcta, simplificaríaSIMD
. Una vez que la gente esté de acuerdo con la funcionalidad proporcionada porSIMDBase
, podría trasladarse a Base.Por ejemplo, no me importaría si algunas de las contorsiones de llamadas LLVM de bajo nivel pudieran manejarse en otro lugar.