Чтобы оптимизировать программы для параллельной производительности на всех аппаратных средствах, вы должны признать, что на многих общих платформах симметричная многопроцестра - это ложь. «ЦП», обнаруженные операционной системой, часто имеют неравный доступ к общим ресурсам, таким как кэши, периферийные устройства DRAM и ввода/вывода, иногда даже неравенные спецификации (как в ARM Big.little, Apple MX и Intel Adler Lake), и значительный прирост производительности может быть достигнут, приняв эти факты в ваш код.
Это последняя привязанность к ржавчине с HWLOC, библиотекой C от Open MPI для обнаружения иерархической топологии современной архитектуры: узлы памяти NUMA, розетки, общие кэши данных и инструкции, ядра, одновременное многорезовое и многое другое. Кроме того, HWLOC позволяет прикреплять потоки к определенным ядрам процессоров и памяти к определенным узлам NUMA, что является обязательным условием для выполнения оптимизации программы с учетом топологии.
hwlocality основана и до сих пор делится некоторым кодом и дизайном с предыдущими, ныне позабоченными попытками написать привязки rust hwloc в Ichbinjoe/HWLOC2-RS и DASCHL/HWLOC-RS. Тем не менее, это не направлено на совместимость с ними API. Действительно, было внесено много изменений в отношении HWLOC2-RS в цели улучшения эргономики, производительности и удаления возможностей для неопределенного поведения, таких как предположение, что указатели не являются нулевыми или союзными полями, когда никто не скажет вам, что они всегда будут.
hwlocality совместима с libhwloc v2.0 и позже. Вы можете установить подходящую версию libhwloc двумя разными способами:
libhwloc , то вы можете установить его вместе с соответствующим пакетом разработки (обычно называемый libhwloc-dev или libhwloc-devel ). Это рекомендуемый способ сделать что -то, потому что это значительно ускорит ваши строительные настройки hwlocality (Re) и позволит вам легко держать libhwloc в курсе вместе с остальной частью вашей среды разработки.hwlocality может альтернативно загружать и создать свою собственную копию libhwloc . Чтобы использовать такую внутреннюю сборку, пожалуйста, включите функцию vendored груза. В дополнение к рабочей среде сборки C, вам понадобятся automake и libtool на UNECES и cmake в Windows. Если вы не используете поставленную версию HWLOC Windows, вам также необходимо установить pkg-config или один из его клонов ( pkgconf , pkgconfiglite ...), так как он используется для поиска libhwloc и настройки hwlocality для связи против него.
По умолчанию предназначена совместимость со всеми версиями HWLOC 2.X, что означает функции из более новых версий в серии 2.x (или, в ближайшем будущем, совместимость с нарушениями изменений из серии 3.x) не поддерживаются по умолчанию.
Вы можете включить их, за счет потери совместимости с более старыми выпусками HWLOC 2.X, позволяя функции груза, которая соответствует самой низкой выпуске HWLOC, с которым вы должны быть совместимы. См. Раздел [features] Cargo этого ящика. Томл для получения дополнительной информации.
Во -первых, добавьте hwlocality как зависимость:
cargo add hwlocality Затем, внутри вашего кода, настройте Topology . Это основная точка входа в библиотеку HWLOC, с помощью которой вы можете получить доступ почти к каждой операции, которую позволяет HWLOC.
Вот пример быстрого использования, который ходит, хотя обнаруженная аппаратная топология и распечатывает краткое описание каждого процессора и объекта кэша, известного HWLOC:
use hwlocality :: { object :: depth :: NormalDepth , Topology } ;
fn main ( ) -> eyre :: Result < ( ) > {
let topology = Topology :: new ( ) ? ;
for depth in NormalDepth :: iter_range ( NormalDepth :: MIN , topology . depth ( ) ) {
println ! ( "*** Objects at depth {depth}" ) ;
for ( idx , object ) in topology . objects_at_depth ( depth ) . enumerate ( ) {
println ! ( "{idx}: {object}" ) ;
}
}
Ok ( ( ) )
}Один возможный вывод:
*** Objects at depth 0
0: Machine
*** Objects at depth 1
0: Package
*** Objects at depth 2
0: L3 (16MB)
*** Objects at depth 3
0: L2 (512KB)
1: L2 (512KB)
2: L2 (512KB)
3: L2 (512KB)
4: L2 (512KB)
5: L2 (512KB)
*** Objects at depth 4
0: L1d (32KB)
1: L1d (32KB)
2: L1d (32KB)
3: L1d (32KB)
4: L1d (32KB)
5: L1d (32KB)
*** Objects at depth 5
0: Core
1: Core
2: Core
3: Core
4: Core
5: Core
*** Objects at depth 6
0: PU
1: PU
2: PU
3: PU
4: PU
5: PU
6: PU
7: PU
8: PU
9: PU
10: PU
11: PU
В исходном хранилище доступно больше примеров.
Большинство функций из серии HWLOC 2.x в настоящее время выставлены HWLOCALTY. Но некоторые специализированные функции, в основном связанные с совместимостью с другими API, не могли сделать это по разным причинам. Проблемы с маркировкой «покрытие API» невыполнены и являются отличным местом для поиска потенциального вклада в эту библиотеку, если у вас есть время!
Если вы уже знакомы с API HWLOC C, вы также будете рады узнать, что #[doc(alias)] атрибуты широко используются так, чтобы вы могли искать документацию для объектов HWLOC API, таких как hwloc_bitmap_t , hwloc_set_cpubind или hwloc_obj::arity и быть перенаправленным на предложенный AP -ap.
Основными исключениями из этого правила являются понятия, которые не нужны в ржавчине из -за улучшений эргономики, разрешенных системой типа ржавчины. Например...
Drop ImplsHWLOC_MEMBIND_BYNODESET заменяются генериками, которые делают правильные вещи автоматически. В этом проекте используется лицензия MIT, пожалуйста, см. Файл лицензии для получения дополнительной информации.