Я пишу многопоточное приложение в c ++, где производительность имеет решающее значение. Мне нужно использовать много блокировок при копировании небольших структур между streamами, для этого я выбрал использование штифтов. Я провел некоторое исследование и тестирование скорости на этом, и я обнаружил, что большинство реализаций примерно одинаково быстрые: Microsoft CRITICAL_SECTION, с установленным значением SpinCount до 1000, […]
Существует два известных способа установки целочисленного регистра на нулевое значение на x86. Или mov reg, 0 или xor reg, reg Существует мнение, что второй вариант лучше, поскольку значение 0 не сохраняется в коде и что сохраняет несколько байтов полученного машинного кода. Это, безусловно, хорошо – меньше кэша команд используется, и иногда это может привести к […]
Я одновременно обрабатываю восемь точечных продуктов с помощью 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]); […]
Как показывает этот вопрос , с 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 eax, [eax+4] По форме .. add eax, 4 Я слышал, что lea – это «0-часовая» инструкция (например, NOP), а «add» – нет. Однако, когда я смотрю на сборщик, выпущенный сборкой, я часто вижу последнюю форму, используемую вместо первой. Я достаточно умен, чтобы доверять компилятору, так может […]
На другой неделе я написал небольшой class streamа и односторонний канал сообщений, чтобы обеспечить связь между streamами (по два канала на stream, очевидно, для двунаправленной связи). Все работало отлично на моем Athlon 64 X2, но мне было интересно, не столкнулся ли я с какими-либо проблемами, если бы оба streamа рассматривали одну и ту же переменную, […]
Какие файлы заголовков предоставляют встроенные функции для разных наборов инструкций для SIM-карт x86 (MMX, SSE, AVX, …)? Невозможно найти такой список в Интернете. Поправьте меня если я ошибаюсь.
У меня возникли проблемы с пониманием регистров в сборке x86. Я знаю, что EAX – это полные 32 бита, AX – младшие 16 бит, а затем AH и AL – более высокие и младшие 8 бит AX. Но я задаю вопрос. Если AL = 10 и AH = 10, то каково значение в AX? Мое […]
Я переучиваю ассемблер, который использовал на очень старых машинах MS-DOS !!! Это мое понимание того, как должна выглядеть эта функция. Он компилируется, но сбой SIGSEGV при попытке установить 0xffffffff в ecx . Код запускается в виртуальной машине с 32-разрядным Debian 9. Любая помощь будет оценена. int getStringLength(const char *pStr){ int len = 0; char *Ptr […]
Мне интересно, если lock xchg будет иметь сходное поведение с mfence с точки зрения одного streamа, обращающегося к месту хранения, которое мутирует (позволяет просто сказать наугад) другими streamами. Гарантирует ли я, что я получаю самую последнюю ценность? Из инструкций по чтению / записи памяти, которые следуют после? Причина моей путаницы: 8.2.2 «Чтение или запись не […]