по основной теме. Если это не так, вы можете сделать это так, выполняя работу во временном расположении для каждого работника, а затем обновляя общее местоположение только один раз, когда работа завершена. Любое повторное обновление одного и того же местоположения работниками будет просто ложным делением без реальной цели.
отреть возможностьN
потоки, выполняющие асинхронные задачи с малым значением результата, напримерdouble
или жеint64_t
, Так о8
Значения результата могут занимать одну строку кэша ЦП.N
равно количеству ядер процессора.
С одной стороны, если я просто выделю массивN
предметы, каждыйdouble
или жеint64_t
, тогда8
потоки будут совместно использовать строку кэша ЦП, которая кажется неэффективной.
С другой стороны, если я выделю целую строку кэша для каждогоdouble
/int64_t
, поток получателя должен будет получитьN
строки кэша, каждая из которых написана отдельным ядром процессора (кроме 1).
Так есть ли эффективное решение для этого сценария? Процессор x86-64. Решение в C ++ является предпочтительным.
Пояснение 1: издержки запуска / выхода потока невелики, поскольку используется пул потоков. Так что это в основном синхронизация в критической секции.
Пояснение 2: Параллельные партии имеют зависимость. Главный поток может запустить следующий пакет параллельных вычислений только после того, как он соберет и обработает результаты предыдущего пакета. Потому что результаты предыдущей партии служат некоторыми параметрами следующей партии.