порядок и барьер: какова эквивалентная инструкция на x86 для 'lwsync' на PowerPC? - PullRequest
4 голосов
/ 14 августа 2010

Мой код прост, как показано ниже. Я нашел rmb и wmb для чтения и записи, но не нашел общего. lwsync доступен на PowerPC, но чем заменить x86? Заранее спасибо.

#define barrier() __asm__ volatile ("lwsync")
...
    lock()
    if(!pInst);
    {
        T* temp=new T;
        barrier();
        pInst=temp;
    }
    unlock();

Ответы [ 3 ]

2 голосов
/ 16 августа 2010

rmb() и wmb () - функции ядра Linux. Существует также mb().

Инструкции x86: lfence, sfence и mfence, IIRC.

0 голосов
/ 27 января 2012

Вы не говорите точно, что блокировка и разблокировка в этом коде. Я предполагаю, что это мьютексные операции. На powerpc функция получения мьютекса будет использовать isync (без которого аппаратное обеспечение может оценивать ваш if (! PInst) перед блокировкой ()) и будет иметь lwsync (или синхронизацию, если ваша мьютексная реализация древняя) в unlock () .

Таким образом, предполагается, что все ваши обращения (как чтение, так и запись) к pInst защищены вашими методами блокировки и разблокировки, которые использует ваш барьер, излишни. Разблокировка будет иметь достаточный барьер, чтобы гарантировать, что хранилище pInst будет видимым до завершения операции разблокировки (чтобы оно было видно после любого последующего захвата блокировки, предполагая, что используется та же самая блокировка).

На x86 и x64 ваша блокировка () будет использовать некоторую форму инструкции с префиксом LOCK, которая автоматически имеет поведение двунаправленного ограждения.

Ваша разблокировка на x86 и x64 должна быть только инструкцией хранения (если вы не используете некоторые специальные строковые инструкции в вашей CS, в этом случае вам понадобится SFENCE).

Руководство:

http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf

содержит хорошую информацию обо всех заборах, а также об эффектах префикса LOCK (и когда это подразумевается).

пс. В вашем коде разблокировки также должно быть что-то, обеспечивающее упорядочение компилятора (поэтому, если это просто нулевой магазин, вам также потребуется что-то вроде стиля GCC asm _ volatile _ ("" ::: "memory")).

0 голосов
/ 24 августа 2011

В среде выполнения Cilk есть интересный файл, например cilk-sysdep.h, где он содержит системные сопоставления с барьерами памяти.Я извлекаю небольшой раздел с вопросом о x86, т.е. i386

    file:-- cilk-sysdep.h (the numbers on the LHS are actually line numbers)

    252      * We use an xchg instruction to serialize memory accesses, as can
    253      * be done according to the Intel Architecture Software Developer's
    254      * Manual, Volume 3: System Programming Guide
    255      * (http://www.intel.com/design/pro/manuals/243192.htm), page 7-6,
    256      * "For the P6 family processors, locked operations serialize all
    257      * outstanding load and store operations (that is, wait for them to
    258      * complete)."  The xchg instruction is a locked operation by
    259      * default.  Note that the recommended memory barrier is the cpuid
    260      * instruction, which is really slow (~70 cycles).  In contrast,
    261      * xchg is only about 23 cycles (plus a few per write buffer
    262      * entry?).  Still slow, but the best I can find.  -KHR 
    263      *
    264      * Bradley also timed "mfence", and on a Pentium IV xchgl is still quite a bit faster
    265      *   mfence appears to take about 125 ns on a 2.5GHZ P4
    266      *   xchgl  apears  to take about  90 ns on a 2.5GHZ P4
    267      * However on an opteron, the performance of mfence and xchgl are both *MUCH MUCH   BETTER*.
    268      *   mfence takes 8ns on a 1.5GHZ AMD64 (maybe this is an 801)
    269      *   sfence takes 5ns
    270      *   lfence takes 3ns
    271      *   xchgl  takes 14ns
    272      * see mfence-benchmark.c
    273      */
    274     int x=0, y;
    275     __asm__ volatile ("xchgl %0,%1" :"=r" (x) :"m" (y), "0" (x) :"memory");
    276    }

Что мне понравилось в этом, так это то, что xchgl выглядит быстрее :), хотя вы должны действительно реализовать их и проверить это.

...