Есть ли интерфейс для вызова __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) или меньшую, например, такую.