Funções Trig vetorizadas em C?
Estou procurando calcular funções trigonométricas altamente paralelizadas (no bloco de 1024) e gostaria de aproveitar pelo menos parte do paralelismo que as arquiteturas modernas têm.
Quando eu compilo um bloco
for(int i=0; i<SIZE; i++) {
arr[i]=sin((float)i/1024);
}
O GCC não vai vetorizá-lo e diz
not vectorized: relevant stmt not supported: D.3068_39 = __builtin_sinf (D.3069_38);
O que faz sentido para mim. No entanto, eu estou querendo saber se existe uma biblioteca para fazer cálculos trigonométricos paralelos.
Com apenas uma série simples de Taylor na 11ª ordem, o GCC vetorizará todos os loops, e estou obtendo velocidades duas vezes mais rápidas que um loop de pecado ingênuo (com respostas exatas de bits ou com séries de 9ª ordem, apenas um bit) desativado nos dois últimos valores de 1600, para uma aceleração> 3x). Tenho certeza de que alguém já encontrou um problema como esse antes, mas quando pesquiso no Google, não encontro menções de bibliotecas ou similares.
A. Já existe algo?
B. Caso contrário, conselhos para otimizar funções trigonométricas paralelas?
EDIT: Encontrei a seguinte biblioteca chamada "SLEEF":http://shibatch.sourceforge.net/ que é descrito emesta papel e usa instruções SIMD para calcular várias funções elementares. Ele usa código específico SSE e AVX, mas não acho que seja difícil transformá-lo em loops C padrão.