Есть ли интерфейс для вызова __libm_sse2_sincos в MSVC?

В настоящее время я работаю над оптимизацией некоторых C-кодов под MSVC, в которой выполняются некоторые вычисления sin() и cos().

Я использую реализации SSE, такие как:

a = _mm_set_pd(cos(w),sin(w));

Однако, когда я проверяю коды разборки позже, я обнаруживаю, что компилятор Microsoft интерпретирует cos (w) и sin (w) следующим образом:

call        __libm_sse2_cos 
...
call        __libm_sse2_sin 

В котором cos и грех называются отдельно. Но я ожидаю, что вызов компилятора __libm_sse2_sincos вычислит sin и cos с одним и тем же радианом одновременно.

Так возможно ли, что я скажу компилятору сделать это? или какой-нибудь интерфейс для их вызова под MSVC? Как насчет Linux?

Большое спасибо за помощь.

2 ответа

Решение

Почему бы просто не сделать это:

double s, c;

sincos(w, &s, &c);
a = _mm_set_pd(c, s);

?

Если вы хотите sincos под MSVC, вы можете использовать реализацию (и) из математической библиотеки XNA, а именно XMVectorSinCos а также XMScalarSinCos, которые сосут, как они float или вам нужно использовать внешнюю библиотеку, такую ​​как AMD LibM (только для x64) или меньшую, например, такую.

Другие вопросы по тегам