2010-12-13 24 views
10

necesito de código abierto (sin restricción en su licencia) la implementación de la función de registro, algo con la firmaSSE2: Doble función de registro de precisión

__m128d _mm_log_pd(__m128d); 

Está disponible en Intel corto Vector Matemáticas Biblioteca (parte de la CPI), pero ICC no es libre ni de código abierto. Estoy buscando la implementación utilizando solo intrínsecos.

Debe usar aproximaciones de funciones racionales especiales. Necesito algo casi tan preciso como el registro cmath, digamos 9-10 dígitos decimales, pero más rápido.

+0

Cuando solicite el código fuente abierto, generalmente necesita especificar la licencia para su proyecto, para que la gente sepa si podrá usar el código bajo una determinada licencia o no. – Cascabel

+0

La licencia no importa. Es para proyecto dentro de la manguera. Todas las licencias de código abierto son buenas para eso. – watson1180

+0

@Jefromi: Por el contrario, las respuestas tienen más probabilidades de ser útiles para otros interrogadores en el futuro si no están construidas de manera demasiado estrecha. – caf

Respuesta

5

Eche un vistazo a AMD LibM. No es de código abierto, sino gratis. AFAIK, funciona en CPU Intel. En la misma página web, encontrará un enlace a ACML, otra libre de matemáticas gratuita de AMD. Tiene de todo, desde AMD LibM + Matrix algos, FF y distribuciones.

No conozco ninguna implementación de código abierto de funciones matemáticas vectorizadas de doble precisión. Creo que las libs de Intel y AMD son optimizadas a mano por el fabricante de la CPU y todos las usan cuando la velocidad es importante. IIRC, hubo un intento de implementar intrínsecos para las funciones matemáticas vectorizadas en GCC. No sé qué tan lejos lograron llegar. Obviamente, no es una tarea trivial.

0

Si no puede encontrar una implementación de código abierto existente, es relativamente fácil crear la suya usando el método estándar de una serie de Taylor. Vea Wikipedia para esto y una variedad de otros métodos.

+0

Creo que una implementación completamente precisa requiere una aritmética de precisión múltiple. – caf

+6

Taylor series no es una forma adecuada de hacerlo. Uno debe usar aproximaciones de funciones racionales especiales. Necesito algo casi tan preciso como el registro cmath, pero más rápido. De lo contrario, podría simplemente enviar todo a cmath log. La implementación de ICC es precisa y rápida. Necesito algo similar, pero de código abierto. – watson1180

+0

@ watson1180 la aproximación de función aparentemente racional es más lenta que los métodos de la serie Taylor en hardware moderno –

1

Framewave project es Apache 2.0 con licencia y pretende ser el equivalente de código abierto de Intel IPP. Tiene implementaciones que están cerca de lo que estás buscando. Compruebe las funciones aritméticas de precisión fija en la documentación.

6

Creo que log2 es más fácil de calcular. Puede multiplicar/dividir su número por una potencia de dos (muy rápido) de modo que se encuentre en (0.5, 2), y luego use un Pade approximant (tome M cerca de N) que es fácil de obtener de una vez por todas, y cuyo orden puede elegir de acuerdo con sus necesidades. Solo necesita operaciones aritméticas que puede hacer con intrínsecamente SSE. No olvide agregar/eliminar una constante de acuerdo con el factor de escala anterior.

Si desea un registro natural , divida por log2(e), que puede calcular de una vez por todas.

No es raro ver funciones de registro personalizadas en algunos proyectos específicos. Las funciones de la biblioteca estándar abordan el caso general, pero necesita algo más específico. Creo sinceramente no es tan difícil hacerlo tú mismo.

1

Aquí está la contraparte de __m256d: https://stackoverflow.com/a/45898937/1915854. Debería ser bastante trivial cortarlo en __m128d. Avíseme si encuentra algún problema con esto.

O puede ver mi implementación como algo obteniendo dos números __m128d a la vez.

Cuestiones relacionadas