Критические разделы с многоядерными процессорами

У меня была такая же проблема. Я исправил это, уменьшив размер изображений.

В списке с прокруткой было несколько миниатюр. Размер каждой миниатюры был 3000x1800, но CSS был изменен до 62x44. Использование изображений размером 62x44 сократило время, затрачиваемое на «Композитные слои».

23
задан JustJeff 11 June 2009 в 11:12
поделиться

6 ответов

Многоядерные / SMP-системы - это не просто несколько склеенных между собой процессоров. Есть явная поддержка параллельной работы. Все примитивы синхронизации реализованы аппаратно по типу атомарного CAS . Инструкция либо блокирует шину, совместно используемую процессорами и контроллером памяти (и устройствами, которые выполняют DMA), и обновляет память, либо просто обновляет память, полагаясь на отслеживание кеша . Это, в свою очередь, приводит к срабатыванию алгоритма когерентности кеша , вынуждая все вовлеченные стороны очищать свои кеши.

Если вы хотите узнать больше о том, как ОС может использовать эти аппаратные средства - вот отличная книга по этой теме.

17
ответ дан 29 November 2019 в 02:36
поделиться

The vendor of multi-core cpus has to take care that the different cores coordinate themselves when executing instructions which guarantee atomic memory access.

On intel chips for instance you have the 'cmpxchg' instruction. It compares the value stored at a memory location to an expected value and exchanges it for the new value if the two match. If you precede it with the 'lock' instruction, it is guaranteed to be atomic with respect to all cores.

6
ответ дан 29 November 2019 в 02:36
поделиться

Или обойти это, применив политику, согласно которой все потоки в группе процессов должны находиться на одном физическом ядре?

Это отменило бы весь смысл многопоточности. Когда вы используете блокировку, семафор или другие методы синхронизации, вы полагаетесь на ОС, чтобы убедиться, что эти операции взаимосвязаны, независимо от того, сколько ядер вы используете.

Время для переключения на другой поток после снятие блокировки в основном определяется стоимостью переключения контекста. Этот поток SO имеет дело с накладными расходами на переключение контекста, так что вы можете это проверить.

Также есть несколько других интересных потоков:

Вам также следует прочитать эту статью MSDN:

3
ответ дан 29 November 2019 в 02:36
поделиться

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

Более элегантное решение - это используйте блок семафора HW, если у процессора есть такая функция. Семафор HW - это простая очередь, которая может иметь размер no_of_cores -1. Так обстоит дело в процессоре TI 6487/8. Вы можете запросить семафор напрямую (и выполнять цикл до тех пор, пока он не будет выпущен), или выполнить косвенный запрос, который приведет к прерыванию, как только ваше ядро ​​получит ресурс. Запросы ставятся в очередь и обслуживаются в том порядке, в котором они были сделаны. Запрос семафора - это атомарная операция.

Согласованность кеша - еще одна проблема, и в некоторых случаях вам может потребоваться выполнить обратную запись и обновление кеша. Но это очень специфическая вещь для реализации кеша. С 6487/8 нам нужно было сделать это за несколько операций.

1
ответ дан 29 November 2019 в 02:36
поделиться

Вам понадобится программа test-and-set, которая заставит процессор уведомить все другие ядра об операции, чтобы они знали. Да, это приводит к накладным расходам, и вам придется смириться с этим. Это причина разрабатывать многопоточные приложения таким образом, чтобы они не слишком часто ждали примитивов синхронизации.

3
ответ дан 29 November 2019 в 02:36
поделиться

Эта концепция полностью исходит из названия Мета- означает абстрагироваться от того, на чем она стоит префиксом.
В более «разговорном стиле» делать что-то с вещью, а не с самой вещью.

В этом отношении метапрограммирование - это, по сути, написание кода, который записывает (или заставляет писать) больше кода.

Система шаблонов C ++ - это метапрограммирование, поскольку оно не просто выполняет текстовую замену (как это делает препроцессор c), но имеет (сложные и неэффективные) средства взаимодействия со структурой кода, которую он анализирует, чтобы выводить гораздо более сложный код. В этом отношении предварительная обработка шаблона в C ++ завершена по Тьюрингу. Это не требование , чтобы сказать, что что-то является метапрограммированием, но почти наверняка достаточно , чтобы считаться таковым.

Инструменты генерации кода, которые можно параметризовать, могут считаться метапрограммированием, если их шаблон логика достаточно сложна. Запустите это приложение на одном ядре (Pentium 4 или Core Solo), а затем запустите его на многоядерном процессоре (Core 2 Duo или аналогичный) и посмотрите, насколько велико ускорение.

Конечно, это несправедливые сравнения с Pentium 4 и Core Solo намного медленнее, независимо от ядер, чем Core 2 Duo. Возможно, сравните Core 2 Duo и Core 2 Quad с приложением, которое может использовать 4 или более потоков.

Вы поднимаете ряд допустимых баллов. Процессоры Muliple доставляют много головной боли и накладных расходов. Однако нам просто нужно смириться с ними, потому что увеличение скорости параллелизма может намного перевесить их, если критические секции будут сделаны достаточно длинными.

Что касается вашего последнего предложения о том, чтобы все потоки были на одном физическом ядре, это полностью побеждает смысл многоядерного компьютера!

Конечно, это несправедливые сравнения, поскольку Pentium 4 и Core Solo намного медленнее, независимо от ядер, чем Core 2 Duo. Возможно, сравните Core 2 Duo и Core 2 Quad с приложением, которое может использовать 4 или более потоков.

Вы поднимаете ряд допустимых баллов. Процессоры Muliple доставляют много головной боли и накладных расходов. Однако нам просто нужно смириться с ними, потому что увеличение скорости параллелизма может намного перевесить их, если критические секции будут сделаны достаточно длинными.

Что касается вашего последнего предложения о том, чтобы все потоки были на одном физическом ядре, это полностью побеждает смысл многоядерного компьютера!

Конечно, это несправедливые сравнения, поскольку Pentium 4 и Core Solo намного медленнее, независимо от ядер, чем Core 2 Duo. Возможно, сравните Core 2 Duo и Core 2 Quad с приложением, которое может использовать 4 или более потоков.

Вы поднимаете ряд допустимых баллов. Процессоры Muliple доставляют много головной боли и накладных расходов. Однако нам просто нужно смириться с ними, потому что увеличение скорости параллелизма может намного перевесить их, если критические секции будут сделаны достаточно длинными.

Что касается вашего последнего предложения о том, чтобы все потоки были на одном физическом ядре, это полностью побеждает смысл многоядерного компьютера!

Вы набираете количество действительных баллов. Процессоры Muliple доставляют много головной боли и накладных расходов. Однако нам просто нужно смириться с ними, потому что увеличение скорости параллелизма может намного перевесить их, если критические секции будут сделаны достаточно длинными.

Что касается вашего последнего предложения о том, чтобы все потоки были на одном физическом ядре, это полностью побеждает смысл многоядерного компьютера!

Вы набираете количество действительных баллов. Процессоры Muliple доставляют много головной боли и накладных расходов. Однако нам просто нужно смириться с ними, потому что увеличение скорости параллелизма может намного перевесить их, если критические секции будут сделаны достаточно длинными.

Что касается вашего последнего предложения о том, чтобы все потоки были на одном физическом ядре, это полностью побеждает смысл многоядерного компьютера!

0
ответ дан 29 November 2019 в 02:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: