Я опоздал на эту вечеринку, но хотел отметить две вещи для других, кто сталкивался с этим постом:
1) Определенно посмотрите вторую ссылку Херба Саттера, на которую указывает Дэвид (http://www.drdobbs.com/parallel/eliminate-false-sharing/217500206). Это решило проблему, которая привела меня к этому вопросу, обрисовав в общих чертах обертку объекта данных структуры, которая гарантирует, что отдельные параллельные потоки не конкурируют за ресурсы со штаб-квартирой на одна и та же строка кэша памяти (аппаратные элементы управления не позволят нескольким потокам одновременно обращаться к одной и той же строке кэша памяти).
2) По первоначальному вопросу, dlev указывает на большую часть проблемы, но, поскольку я уверен, что это симуляция, есть более глубокая проблема, которая замедляет процесс. Хотя ни одна из высокоуровневых переменных вашей программы не является общей, у вас, вероятно, есть одна критическая системная переменная, которая является общей: системное «последнее случайное число», которое хранится в тайнике и используется для создания следующего случайного числа. Возможно, вы даже инициализируете выделенные объекты-генераторы для каждой симуляции, но если они вызывают такие функции, как rand (), то они, и, расширяя свои потоки, делают повторные вызовы одного и того же общего системного ресурса и впоследствии блокируют друг друга. ,
Решение проблемы № 2 будет зависеть от структуры самой программы моделирования. Например, если вызовы случайного генератора фрагментированы, я бы, вероятно, выполнил пакетный вызов, который извлекает и сохраняет то, что потребуется для моделирования. И это заставляет меня задуматься о более сложных подходах, которые позволили бы решить основную проблему с общими ресурсами случайной генерации ...