Estoy buscando el cálculo de funciones trigonométricas altamente paralelizadas (en bloque de 1024 como el mismo), y me gustaría aprovechar al menos parte del paralelismo que tienen las arquitecturas modernas.Funciones vectorizadas de Trig en C?
Cuando compilo un bloque
for(int i=0; i<SIZE; i++) {
arr[i]=sin((float)i/1024);
}
GCC no vectorizar, y dice
not vectorized: relevant stmt not supported: D.3068_39 = __builtin_sinf (D.3069_38);
que tiene sentido para mí. Sin embargo, me pregunto si hay una biblioteca para hacer cálculos trigonométricos paralelos.
Con solo una simple serie taylor en el orden 11, GCC vectorizará todos los bucles, y obtengo velocidades superiores al doble de un ciclo sin sentido (con respuestas de bits exactos, o con series de orden 9, solo un bit apagado para los dos últimos valores de 1600, para una aceleración> 3x). Estoy seguro de que alguien se ha encontrado con un problema como este antes, pero cuando busco en Google, no encuentro menciones de ninguna biblioteca o similar.
A. ¿Ya existe algo?
B. Si no, ¿consejos para optimizar las funciones trigonométricas paralelas?
EDIT: encontré la siguiente biblioteca llamada "SLEEF": http://shibatch.sourceforge.net/ que se describe en el documento this y usa 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.
estoy en x86_64 Debian/Linux, GCC. Idealmente, me gustaría algo que funcione en la mayoría de las plataformas para las que GCC es compatible con la vectorización. –