Visual Studio 2010 и SSE 4.2

Я хотел бы знать, что необходимо установить в Visual Studio 2010, чтобы включить SSE 4.2? Я хотел бы использовать его из-за оптимизированного POPCNT...

Как проверить, все ли настройки в порядке?

Спасибо


ну, я пытался использовать ваше решение, однако <nmmintric.h> не входит в vstudio2010, а стандартное __popcnt требует int вместо std::bitset<> :(

Есть идеи?


Спасибо за подсказку с правильным заголовком. Однако, похоже, что: error C3861: '_mm_popcnt_u64': identifier not found, я нашел только _mm_popcnt_u32, однако я не знаю, как его использовать с bitset, или я должен использовать только bitset<>.count? Он не может работать без настроек компилятора, не так ли?

никто не знает ?


person morph    schedule 04.07.2011    source источник
comment
Вам придется использовать встроенный файл заголовка _mm_popcnt_u64 <nmmintric.h>.   -  person Hans Passant    schedule 05.07.2011
comment
просто включить этот заголовок? больше ничего?   -  person morph    schedule 05.07.2011
comment
Эм, нет, вам действительно нужно написать _mm_popcnt_u64 в своем коде. Также лучше проверьте, поддерживает ли процессор, на котором вы работаете, эту инструкцию.   -  person Hans Passant    schedule 05.07.2011
comment
поэтому вместо bitset‹›.count() используйте _mm_popcnt_u64, верно? И нужно ли что-то задавать в настройках проекта?   -  person morph    schedule 05.07.2011
comment
Да нет. Протестируйте его на некоторых старых компьютерах с XP и сообщите нам, что получилось.   -  person Hans Passant    schedule 05.07.2011
comment
ну, у меня нет машины xp... есть ли шанс, как я могу проверить, работает ли она? или просто измерить скорость и сравнить?   -  person morph    schedule 05.07.2011
comment
У меня тоже нет машины с XP. Только ваши клиенты делают.   -  person Hans Passant    schedule 05.07.2011
comment
есть ли шанс, как я могу проверить, работает ли он? или просто измерить скорость и сравнить?   -  person morph    schedule 05.07.2011
comment
Вы не думали попробовать? Нам лучше уйти, машина начинает злиться на меня.   -  person Hans Passant    schedule 05.07.2011
comment
ну, я попытался использовать ваше решение, однако <nmmintric.h> не включен в vstudio2010, а стандартный __popcnt требует int вместо std::bitset<> :( есть идеи?   -  person morph    schedule 07.07.2011
comment
Обратите внимание, что в _mm_popcnt_u64 указано, что заголовочный файл называется nmmintrin.h   -  person Frank Boyne    schedule 07.07.2011
comment
На самом деле нет смысла проверять, работает ли встроенная функция _mm_popcnt_u64. Если вы запускаете свой код в системе, которая поддерживает инструкцию popcnt, то инструкция popcnt будет работать. Если вы запустите свой код в системе, которая не поддерживает popcnt, вы получите что-то вроде исключения недопустимой инструкции (0xC000001D). Как уже сказал @Hans: вам нужно проверить, поддерживает ли процессор popcnt, используя __cpuid.   -  person Frank Boyne    schedule 07.07.2011
comment
Спасибо за подсказку с правильным заголовком. Однако, кажется that: "error C3861: '_mm_popcnt_u64': identifier not found   -  person morph    schedule 07.07.2011
comment
Используйте bitset::to_ulong, как вы можете быть удивлены, что C API не принимает объект C++? Также рассмотрите MIT HAKMEM 169.   -  person Steve-o    schedule 24.07.2011


Ответы (3)


вы должны написать _mm_popcnt_u64 в своем коде. Также лучше проверьте, поддерживает ли процессор, на котором вы работаете, эту инструкцию. И собрать для x64.

 #include <stdio.h>
 #include <nmmintrin.h>

 int main ()
 {
      unsigned __int64 a = 0x123456789ABCDEF0;

      int res = _mm_popcnt_u64(a);

      printf_s("Result res should be 32: %d\n", res);
      return 0;
 }
person nwpulei    schedule 27.11.2012

Пример MSDN для __popcnt:

http://msdn.microsoft.com/en-us/library/bb385231.aspx

person Steve-o    schedule 24.07.2011

Ничего особенного для этого не требуется.

Вы можете использовать встроенные функции mm* и включить соответствующий заголовочный файл, и он будет скомпилирован, если ваша система поддерживает данные функции.

Компилятор не проверяет и не трогает встроенную сборку, поэтому все, что вы туда поместите, пройдет через сборку, хотя ваше приложение рухнет, если ваша система не поддерживает инструкцию.

Кроме этого, оптимизатор VS2010 нацелен только на SSE2.

person awdz9nld    schedule 25.08.2012