2012-01-17 23 views
8

Estoy haciendo algunos cálculos de estadísticas. Necesito que sean rápidos, así que reescribí la mayor parte para usar SSE. Soy bastante nuevo en esto, así que me pregunto cuál es el enfoque correcto aquí:Logaritmo con SSE o cambie a FPU?

Que yo sepa, no hay función log2 o ln en SSE, al menos no hasta 4.1, que es la última versión apoyado por el hardware que uso.

¿Qué es mejor:

  1. extracto de 4 flota, y hacer cálculos FPU en ellos para determinar la entropía - No necesitaré para cargar cualquiera de esos valores de nuevo en SSE registros, simplemente sumarlos a otra flotar
  2. encontrar una función para la ESS que hace log2
+0

¿Qué tipo de alcance y precisión qué necesita para su log2? –

+0

La misma precisión que obtengo de la FPU sería deseable –

+1

Parece que hay algunas implementaciones SSE log2 alrededor, p. Ej. http://jrfonseca.blogspot.com/2008/09/fast-sse2-pow-tables-or-polynomials.html –

Respuesta

8

Parece que hay algunas implementaciones de SSE log2, por ejemplo, this one.

También está el Intel Approximate Maths Library que tiene una función log2 entre otros - es viejo (2000) pero es SSE2 y todavía debería funcionar razonablemente bien.


Consulte también:

+1

Debido al método utilizado en el blog, la función ahora está unida a la memoria, en lugar de a la CPU. Desenrollé el loop un poco para hacer uso de un poco de amor _mm_prefetch, y todavía está atado a la memoria. Gracias por ese impresionante puntero! –

+0

Me alegro de que funcionó para usted. Probablemente ya sepa esto, pero si está golpeando un cuello de botella de ancho de banda de memoria, intente combinar otras operaciones con su log2 para que pueda hacer un mayor uso de los datos mientras está en caché. –

+1

Si está actualizando su respuesta, es posible que desee mencionar libmvec, que se envía con glibc reciente. –

1

no hay instrucciones SSE que implementa una función logarítmica. Sin embargo, tampoco hay ninguna instrucción x86 que realice un logaritmo genérico. Si está pensando en utilizar una función de logaritmo como log o log10 de la biblioteca estándar de C, vale la pena echar un vistazo a la implementación que se utiliza en una biblioteca de código abierto como libc. Puede hacer rodar fácilmente su propia aproximación logarítmica que opera en todos los elementos en un registro SSE.

Dicha función a menudo se implementa utilizando una aproximación polinómica que es válida dentro de algunas especificaciones de precisión sobre una cierta región de argumentos de entrada, como una serie de Taylor. A continuación, puede aprovechar las propiedades del logaritmo para ajustar un argumento de entrada genérico al rango de entrada aceptable para su rutina de logaritmo. Además, se puede parametrizar la base del logaritmo mediante el aprovechamiento de la propiedad:

log_y(x) = log_a(x)/log_a(y) 

Dónde a es la base del logaritmo de la rutina que ha creado.