Есть ли интерфейс для вызова __libm_sse2_sincos в MSVC? - PullRequest
2 голосов
/ 01 сентября 2011

В настоящее время я работаю над оптимизацией некоторых кодов 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 и sin вызываются по отдельности.Но я ожидаю, что вызов компилятора __libm_sse2_sincos вычислит sin и cos одновременно с одним и тем же радианом.

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

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

Ответы [ 2 ]

0 голосов
/ 01 сентября 2011

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

0 голосов
/ 01 сентября 2011

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

double s, c;

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

...