LINUX.ORG.RU

Доступ к чужой памяти в NUMA


0

1

Не могу найти инфу в Сети:

Как-то лихо получается у MPI от SGI копировать данные между партициями; вроде, процессор не задействуется, роутер сам это делает. Никто не сталкивался? Говорят, используют "block transfer engine".

Интересует, в основном, Altix IA64.

★★★★★

я не знаю, что такое MPI и партиции.

"block transfer engine" - это, видимо, bte.
см. arch/ia64/sn/kernel/bte.c:bte_copy()

не только процессор не задействуется, но и cache, насколько
мне известно.

работает он с физическими адресами, асинхронно, поддержка
NUMA прозрачна.

кроме копирования можно импользовать для быстрого обнуления:
BTE_ZERO_FILL.

> Интересует, в основном, Altix IA64.

а оно только там и работает, весь каталог ia64/sn/ только если
CONFIG_IA64_SGI_SN2.

idle ★★★★★
()
Ответ на: комментарий от idle

> не только процессор не задействуется, но и cache

не считая invalidate, конечно

idle ★★★★★
()
Ответ на: комментарий от idle

2idle:

Many many thanks!

Даже не верится, что оно вот так, под носом лежало!

Еще такой вопрос:

А можно ее задействовать, чтобы перебросить блок данных в юзерспейсе с одного места на другое?

Die-Hard ★★★★★
() автор топика
Ответ на: комментарий от Die-Hard

> А можно ее задействовать, чтобы перебросить блок данных в
> юзерспейсе с одного места на другое?

на всякий случай, я ia64 никогда не видел, все мои домыслы
только из чтения исходников, поэтому могу обмануть.

наверняка можно. нужно будет только написать простенький
модуль, который обеспечит интерфейс к bte_copy().

ядром она не используется, но экспортирована. я думаю, как
раз для этого.

у вас же нестандартное ядро, вы grep'ом посмотрите, может,
там уже что и приделано.

единственная сложность (ну, кроме всяких проверок security
плана) состоит в том, что bte engine работает с физическими
адресами. а ваши userspace данные, естественно, непрерывны
только виртуально. поэтому копировать придется постранично,
будет ли при этом выигрыш - не знаю.

нет, еще одна. нужно убедиться, что src и dst страницы
present и не могут быть украдены свопером. get_user_pages().

вы можете использовать hugetlbfs для таких данных, но это 2.6.
хотя, может быть в вашем ядре оно и есть. hugetlb еще и по
другим причинам хороша для больших массивов данных.

idle ★★★★★
()
Ответ на: комментарий от idle

2idle :

Мне _придется_ это сделать, но я совершенный ноль в ядерном программировании :( Не посоветуете, с чего стартануть почитать (и, желательно, вразумительные исходники в качестве примеров)?

Может, чуть подробнее основные шаги? Мне надо скопировать странично выровненый блок из шареной памяти (отмаппленной с MAP_SHARED|MAP_ANONYMOUS), аффинной известному процессору, в локальный буфер.

Die-Hard ★★★★★
() автор топика
Ответ на: комментарий от Die-Hard

> Мне _придется_ это сделать, но я совершенный ноль в ядерном
> программировании :(

не надо бояться, в этом нет ничего сакрального и особо сложного

> :( Не посоветуете, с чего стартануть почитать (и, желательно,
> вразумительные исходники в качестве примеров)?

Linux Device Drivers, по-моему толковая.

> Мне надо скопировать странично выровненый блок из шареной памяти
> (отмаппленной с MAP_SHARED|MAP_ANONYMOUS), аффинной известному
> процессору, в локальный буфер.

не понял. что значит локальный буфер?

> Может, чуть подробнее основные шаги?

примерные шаги следующие.

page_t **src_pages_array = ...;

down_read(&src_task->mm->mmap_sem);
get_user_pages(src_task, src_task->mm, user_address, pages_nr,
               0 /*read*/, 0, src_pages_array, 0);
up_read(&src_task->mm->mmap_sem);

аналогично для dest процесса.

for (i = 0; i < nr_pages; ++i)
       bte_copy(page_to_phys(src_pages_array[i]), ...);

в конце:
for (i = 0; i < nr_pages; ++i)
       page_cache_release(src_pages_array[i];

что-то такое.

а вы увереный, что вам это _действительно_ надо?

idle ★★★★★
()
Ответ на: комментарий от idle

idle:

Спасибо!

> что значит локальный буфер?

Аффинный процессору, на котором работает мой процесс.

> а вы увереный, что вам это _действительно_ надо?

Увы.

Мне надо очень быстро копировать данные в/из удаленной памяти. Я надеялся на префетчинг, но он, оказалось, мало что дает. C другой стороны, основанная на bte реализация MPI (Message Passing Interface) работает в разы быстрее memcopy().

К сожалению, количество денег, которое мы получим, прямо зависит от того, насколько быстро все это будет работать...

Die-Hard ★★★★★
() автор топика
Ответ на: комментарий от Die-Hard

> основанная на bte реализация MPI (Message Passing Interface)
> работает в разы быстрее memcopy().

а исходников нету, чтобы посмотреть?

я этим не занимался никогда, но стойкое ощущение, что вы
велосипед изобретаете. неужели никто этого до сих пор не
сделал? уж больно естественная задача.

может, вам SGI поможет, у вас ведь поддержка там.

idle ★★★★★
()
Ответ на: комментарий от idle

idle:

> а исходников нету, чтобы посмотреть?

В том-то и проблема!

Их принципиально нету, "коммерческая тайна", чтоб им пусто было! Мало того, любое письмо службы поддержки, касаюшееся технических деталей, содержит в конце стандартную приписку "перед прочтением -- сжечь!", типа, закрытые сведения, никому не показывать, если письма получено по ошибке -- удалить не читая и т.д.

> ...но стойкое ощущение, что вы велосипед изобретаете.

Разумеется.

SGI наделали библиотек с интерфейсом к bte, но низкоуровневого API я найти не могу, а самый высокий уровень, типа MPI и SHMEM, не устраивает.

Die-Hard ★★★★★
() автор топика
Ответ на: комментарий от Die-Hard

Die-Hard,

попробуйте спросить на linux-ia64 mailing list,
адреса не знаю, поищите. в cc:  имеет смысл
написать Robin Holt <holt@sgi.com>.

вопрос: есть ли готовые решения для использования
bte engine для пересылки данных в userspace.

первое предложение в письме пусть будет стандартным
извинением за оффтопик, и упоминанием, что google не
помог. subject начните с "Q: ".

idle ★★★★★
()
Ответ на: комментарий от idle

2idle:

Спасибо за советы, так и сделаю.

Вообще говоря, вроде есть почти такой API, xpmem. Только, судя по количеству ответов на предыдущий топик, я его тоже не найду.

Die-Hard ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.