Tag: x86

Самая быстрая встроенная спин-блокировка

Я пишу многопоточное приложение в c ++, где производительность имеет решающее значение. Мне нужно использовать много блокировок при копировании небольших структур между streamами, для этого я выбрал использование штифтов. Я провел некоторое исследование и тестирование скорости на этом, и я обнаружил, что большинство реализаций примерно одинаково быстрые: Microsoft CRITICAL_SECTION, с установленным значением SpinCount до 1000, […]

Использует ли xor reg, reg преимущество над mov reg, 0?

Существует два известных способа установки целочисленного регистра на нулевое значение на x86. Или mov reg, 0 или xor reg, reg Существует мнение, что второй вариант лучше, поскольку значение 0 не сохраняется в коде и что сохраняет несколько байтов полученного машинного кода. Это, безусловно, хорошо – меньше кэша команд используется, и иногда это может привести к […]

Развертывание петли для достижения максимальной пропускной способности с помощью Ivy Bridge и Haswell

Я одновременно обрабатываю восемь точечных продуктов с помощью AVX. В моем текущем коде я делаю что-то вроде этого (перед разворачиванием): Ivy-Bridge / Sandy-Bridge __m256 areg0 = _mm256_set1_ps(a[m]); for(int i=0; i<n; i++) { __m256 breg0 = _mm256_load_ps(&b[8*i]); tmp0 = _mm256_add_ps(_mm256_mul_ps(arge0,breg0), tmp0); } Haswell __m256 areg0 = _mm256_set1_ps(a[m]); for(int i=0; i<n; i++) { __m256 breg0 = _mm256_load_ps(&b[8*i]); […]

Как сгенерировать код сборки с clang в синтаксисе Intel?

Как показывает этот вопрос , с g ++ я могу сделать g++ -S -masm=intel test.cpp . Кроме того, с clang я могу сделать clang++ -S test.cpp , но -masm=intel не поддерживается clang ( warning argument unused during compilation: -masm=intel ). Как получить синтаксис Intel с clang?

LEA или ADD?

Когда я создаю почерк, я обычно выбираю форму lea eax, [eax+4] По форме .. add eax, 4 Я слышал, что lea – это «0-часовая» инструкция (например, NOP), а «add» – нет. Однако, когда я смотрю на сборщик, выпущенный сборкой, я часто вижу последнюю форму, используемую вместо первой. Я достаточно умен, чтобы доверять компилятору, так может […]

Могу ли я принуждать кеш к многоядерному процессору x86?

На другой неделе я написал небольшой class streamа и односторонний канал сообщений, чтобы обеспечить связь между streamами (по два канала на stream, очевидно, для двунаправленной связи). Все работало отлично на моем Athlon 64 X2, но мне было интересно, не столкнулся ли я с какими-либо проблемами, если бы оба streamа рассматривали одну и ту же переменную, […]

Заголовочные файлы для x86 SIMD intrinsics

Какие файлы заголовков предоставляют встроенные функции для разных наборов инструкций для SIM-карт x86 (MMX, SSE, AVX, …)? Невозможно найти такой список в Интернете. Поправьте меня если я ошибаюсь.

x86 Расчет AX с учетом AH и AL?

У меня возникли проблемы с пониманием регистров в сборке x86. Я знаю, что EAX – это полные 32 бита, AX – младшие 16 бит, а затем AH и AL – более высокие и младшие 8 бит AX. Но я задаю вопрос. Если AL = 10 и AH = 10, то каково значение в AX? Мое […]

получить длину строки в inline GNU Assembler

Я переучиваю ассемблер, который использовал на очень старых машинах MS-DOS !!! Это мое понимание того, как должна выглядеть эта функция. Он компилируется, но сбой SIGSEGV при попытке установить 0xffffffff в ecx . Код запускается в виртуальной машине с 32-разрядным Debian 9. Любая помощь будет оценена. int getStringLength(const char *pStr){ int len = 0; char *Ptr […]

Есть ли у блокировки xchg то же поведение, что и mfence?

Мне интересно, если lock xchg будет иметь сходное поведение с mfence с точки зрения одного streamа, обращающегося к месту хранения, которое мутирует (позволяет просто сказать наугад) другими streamами. Гарантирует ли я, что я получаю самую последнюю ценность? Из инструкций по чтению / записи памяти, которые следуют после? Причина моей путаницы: 8.2.2 «Чтение или запись не […]

Давайте будем гением компьютера.