СОЗДАЙТЕ РЕЗЕРВНУЮ КОПИЮ СВОИХ ДАННЫХ. Изученный, что один твердый способ работать с базами данных клиентов регулярно.
Вы правы в том, что ограничения топологии так или иначе увеличивают задержку связи между ядрами, как только счетчики начинают превышать пару десятков. Я действительно не знаю, каковы намерения компаний, занимающихся x86, в отношении такого рода масштабирования.
Но блокировки реализованы в терминах атомарных операций. Таким образом, вы действительно не выиграете, пытаясь переключиться на них, если только они не реализованы более масштабируемым способом, чем то, что вы пытались бы сделать с помощью собственных атомарных операций, выполненных вручную. Я думаю, что, как правило, для состязаний, подобных одиночным токенам, атомарные примитивы всегда будут самым быстрым способом, независимо от того, сколько у вас ядер.
Как давно обнаружил Крей, здесь нет бесплатного обеда. Разработка программного обеспечения высокого уровня, когда вы пытаетесь использовать потенциально конфликтные ресурсы как можно реже, всегда приводит к самым большим выплатам в приложениях с массовым распараллеливанием. Это означает выполнение как можно большего объема работы в результате получения блокировки, но при этом как можно быстрее. В экстремальных ситуациях это может означать предварительный расчет вашей работы на основе предположения об успешно полученной блокировке, попытки захватить ее и просто завершение как можно быстрее в случае успеха, в противном случае ваша работа будет отброшена и повторная попытка в случае неудачи.
В качестве примечания к этому вопросу стоит упомянуть, что будущее, о котором вы говорите уже присутствует технология в графических процессорах. современный графический процессор Quadro имеет до 256 ядер и может выполнять атомарные операции в глобальной (дисплейной) памяти.
Я не уверен, как этого добиться, но факт в том, что это уже происходит.
Я не думаю, что проблема в том, что атомарные операции сами займут больше времени; реальная проблема может заключаться в том, что атомарная операция может блокировать операции шины на других процессорах (даже если они выполняют неатомарные операции).
Если вы хотите, чтобы код был последним, постарайтесь в первую очередь избежать блокировки.
На вопрос, поставленный в заголовке, короткий ответ - «да», длинный ответ - «это сложно».
Что касается того, что замки лучше, нет. Внутренне блокировка должна пропускать по шине как минимум столько же (если не больше) трафика. Подумайте об этом так: если у процессора есть только одна атомарная операция, атомарное сравнение и свопинг, вы можете использовать его для реализации блокировок и атомарных приращений. На уровне протокола шины используется лишь несколько примитивов. Блокировки не медленнее, чем атомарные операции, потому что они делают что-то другое, они медленнее, потому что они делают больше того же (с точки зрения согласованности). Так как атомарные операции замедляются, блокировки будут иметь тенденцию соответственно замедляться.
Сказав это, есть много-много статей по этой теме, а отдельные случаи сложны. Я бы не стал беспокоиться о том, как ваш код будет масштабироваться на 80-ядерных процессорах, которые имеют непредсказуемые характеристики производительности (потому что мы не знаем, как они будут спроектированы). Либо они будут вести себя как наши текущие процессоры, и ваш код будет работать нормально, либо они не будут, и все, что вы сейчас догадались, окажется неверным. В большинстве случаев оказывается, что код все равно не чувствителен к производительности, поэтому это не имеет значения, но если это так, то правильным решением будет исправить его в будущем, когда вы поймете архитектурные характеристики и характеристики производительности. ваших целевых процессоров.
Не беспокойтесь о том, как ваш код будет масштабироваться на 80-ядерных процессорах с непредсказуемыми характеристиками производительности (потому что мы не знаем, как они будут спроектированы). Либо они будут вести себя как наши текущие процессоры, и ваш код будет работать нормально, либо они не будут, и все, что вы сейчас догадались, окажется неправильным. В большинстве случаев оказывается, что код все равно не чувствителен к производительности, поэтому это не имеет значения, но если это так, то правильным решением будет исправить его в будущем, когда вы поймете архитектурные характеристики и характеристики производительности. ваших целевых процессоров. Не беспокойтесь о том, как ваш код будет масштабироваться на 80-ядерных процессорах, которые имеют непредсказуемые характеристики производительности (потому что мы не знаем, как они будут спроектированы). Либо они будут вести себя как наши текущие процессоры, и ваш код будет работать нормально, либо они не будут, и все, что вы сейчас догадались, окажется неправильным. В большинстве случаев оказывается, что код все равно не чувствителен к производительности, поэтому это не имеет значения, но если это так, то правильным решением будет исправить его в будущем, когда вы поймете архитектурные характеристики и характеристики производительности. ваших целевых процессоров. t, и все, что вы теперь догадались, оказалось неверным. В большинстве случаев оказывается, что код все равно не чувствителен к производительности, поэтому это не имеет значения, но если это так, то правильным решением будет исправить его в будущем, когда вы поймете архитектурные характеристики и характеристики производительности. ваших целевых процессоров. t, и все, что вы теперь догадались, оказалось неверным. В большинстве случаев оказывается, что код все равно не чувствителен к производительности, поэтому это не имеет значения, но если это так, то правильным решением будет исправить его в будущем, когда вы поймете архитектурные характеристики и характеристики производительности. ваших целевых процессоров.