Funciones de disparo vectorizadas en C?
Estoy buscando calcular funciones trigonométricas altamente paralelas (en un bloque de 1024), y me gustaría aprovechar al menos parte del paralelismo que tienen las arquitecturas modernas.
Cuando compilo un bloque
for(int i=0; i<SIZE; i++) {
arr[i]=sin((float)i/1024);
}
GCC no lo vectorizará, y dice
not vectorized: relevant stmt not supported: D.3068_39 = __builtin_sinf (D.3069_38);
Lo que tiene sentido para mí. Sin embargo, me pregunto si hay una biblioteca para hacer cálculos trigonométricos paralelos.
Con solo una serie simple de Taylor hasta el 11 ° orden, GCC vectorizará todos los bucles, y estoy obteniendo velocidades dos veces más rápidas que un bucle de pecado ingenuo (con respuestas exactas de bits, o con series de 9 ° orden, solo una bit off para los últimos dos de 1600 valores, para una aceleración> 3x). Estoy seguro de que alguien ha encontrado un problema como este antes, pero cuando busco en Google, no encuentro menciones de ninguna biblioteca o similar.
UNA. ¿Ya existe algo?
SI. Si no, ¿consejos para optimizar las funciones trigonométricas paralelas?
EDIT: encontré la siguiente biblioteca llamada "SLEEF":http: //shibatch.sourceforge.net que se describe enest paper y utiliza instrucciones SIMD para calcular varias funciones elementales. Utiliza código específico SSE y AVX, pero no creo que sea difícil convertirlo en bucles C estándar.