Я занимаюсь параллельным программированием на компьютере NUMA (у меня еще нет компьютера, он скоро появится ™).
У меня есть пул рабочих потоков на каждом узле NUMA (с установленным сродством к процессору) и балансировщик, который равномерно распределяет работу между пулами / узлами. Это должно гарантировать, что все выделения памяти находятся в локальной памяти. Это все хорошо и денди.
Во время запуска рабочие потоки пула создаются из основного потока, и им необходимо выполнить некоторую начальную настройку, прежде чем они смогут устанавливать свои собственные привязки (требование к сторонней библиотеке, я ничего не могу с этим поделать).
Я обеспокоен тем, что будет скрытое снижение производительности, так как кадры стека рабочих потоков размещаются на неправильных узлах, вызывая доступ к внешней памяти.
Это реальная проблема? Почему-то я верю, что это уже решено …
В любом случае, я ищу способ убедиться, что стек каждого потока размещен на правильном узле NUMA.
Мой преданный мальчик Google придумал это: Выделение стека потока в определенной памяти NUMA что-то вроде того, что я хочу сделать, но это все равно, и мне нужно решение для Windows.
Об этом замечательно не хватает информации в MSDN, но, учитывая то, что я слышал от Марка Руссиновича, когда рассказывал о внутреннем устройстве памяти Windows, я бы не стал беспокоиться об этом, если бы не начал замечать заметное замедление.
В этой схеме даже доступ к памяти между узлами все еще происходит быстрее, чем, скажем, … переключение на диск. Что еще более важно, поскольку физическое отображение памяти на активные страницы не имеет отношения к пространству памяти на окнах (чисто виртуальное пространство памяти), ядро, вероятно, переназначит страницы стека для каждого потока на основе сходства.
На самом деле я не думаю, что это повлияет на вас, если бы уже было готовое решение, потому что команда SQL Server столкнулась бы с ним давным-давно.
Других решений пока нет …