эффективное использование архитектуры NUMA

Я пишу многопоточную Java-программу, которая интенсивно использует процессор и память. Цель программы — выполнить некоторый алгоритм на графе. Программа выполняется на машине NUMA под управлением Linux, и я хотел бы получить от нее максимально возможную производительность.

Для этого я делаю несколько копий графа на каждую NUMA-ноду, чтобы каждый поток мог обращаться к графу в локальной памяти.

Часть выделения локальной памяти уже выполняется путем установки привязки перед выделением каждой новой копии графа. Это делается с помощью jna, поэтому я предпочитаю оставаться с этой библиотекой и не добавлять код jni, если это возможно.

Мой вопрос: как я могу проверить, на каком ядре работает рабочий поток, чтобы выполнять чтение из локальной памяти?

Я понимаю, что привязка потока к ядру может измениться во время выполнения. Однако ядро ​​пытается запустить поток на одном и том же NUMA-узле на всех временных интервалах. Поэтому проверка только в начале, на каком ядре работает поток, будет работать в большинстве случаев.


person jutky    schedule 21.05.2014    source источник
comment
Это довольно сложно сделать даже на C/C++ из-за низкого качества/поддержки NUMA-библиотек.   -  person Mysticial    schedule 22.05.2014
comment
Мне не нужны специально библиотеки NUMA. Просто чтобы знать, на каком ядре работает поток. Из core-id я могу без проблем узнать NUMA-узел.   -  person jutky    schedule 22.05.2014
comment
Я очень сомневаюсь, что вы можете сделать это с Java. Единственный реальный вариант — C++ (а я сам Java-разработчик). Но для архитектур NUMA и параллельной обработки на них C++ и MPI — единственный выбор.   -  person Alexandros    schedule 22.05.2014
comment
Александрос, вы можете быть удивлены, узнав, сколько еще вариантов существует. C, Python и Go — это всего лишь пара других языков, которые прекрасно подходят для использования преимуществ систем NUMA. Каждый из них имеет свои собственные параметры синхронизации и IPC, начиная от mmap и заканчивая каналами, сокетами, SHMEM и другими библиотеками, а также языковыми функциями. Если вы обеспокоены тем, что некоторые из этих опций не содержат стандартизированных функций для определения вашей топологии NUMA, это, вероятно, правда, хотя man 7 numa может помочь в Linux.   -  person Aaron Altman    schedule 12.06.2014


Ответы (3)


Оказывается, есть метод, который можно вызвать через jna для получения нужной информации. Имя метода: sched_getcpu. И полный фрагмент кода выглядит так

public interface CLibrary extends Library{
    public static final CLibrary INSTANCE = 
           (CLibrary) Native.loadLibrary("c", CLibrary.class);
    public int sched_getcpu() throws LastErrorException;
}

Теперь, когда вы делаете

CLibrary.INSTANCE.sched_getcpu();

Вы получаете идентификатор ядра, где работает текущий поток.

person jutky    schedule 26.05.2014

Я обнаружил, что самый простой способ выполнить вышеуказанную задачу — запустить команду оболочки и проанализировать вывод.

Учитывая, что я знаю идентификатор процесса и идентификатор потока текущего потока (достижимого с помощью jna), я запускаю следующую команду:

ps -p <pid> -L -o tid,psr | grep <tid>

Результатом является строка с двумя числами, первое — идентификатор потока, а второе — идентификатор ядра, в котором выполняется этот поток.

В цикле я устанавливал привязку потоков к разным ядрам и проверял вывод приведенной выше команды. Выход всегда был правильным.

person jutky    schedule 24.05.2014

То, о чем вы говорите, - это сходство потоков. Может быть, это поможет.

привязка потоков Java

Еще одна вещь, которую вам нужно сделать, если это не распространяется на это, - это использовать собственный код, чтобы выяснить, какое ядро ​​​​на каком нуме.

person johnnycrash    schedule 22.05.2014
comment
Я уже использую сходство потоков, чтобы делать локальные копии графа на каждом NUMA-узле (как указано в вопросе). На этапе запуска я могу работать с привязкой к потокам. Но я не хочу привязывать весь параллельный алгоритм к конкретным ядрам. Я полагаюсь на операционную систему, которая сделает балансировку нагрузки лучше, чем я. Про нативную часть кода вы отвечаете - то, о чем был вопрос. - person jutky; 22.05.2014