[WT] [Архив] [Поиск] [Главная] [Управление]
[Совместно с IIchan.ru]

[Назад]
Ответ в нить

Имя
Адрес  [sage] [noko]
Animapcha image [?]
Тема   (reply to 1660)
Сообщение
Файл 
Пароль  (для удаления файлов и сообщений)
  • Прежде чем постить, ознакомьтесь с правилами.
  • Поддерживаемые типы файлов: 7Z, BZ, GIF, JPG, MO, MP3, OGG, PDF, PNG, PSD, RAR, SVG, SWF, TXT, XCF, ZIP
  • Максимально допустимый размер файлов: 10000 кБ.
  • Изображения, размер которых превышает 200 на 200 пикселей, будут уменьшены.
  • Ныне 1780 unique user posts. Посмотреть каталог
  • Радио:

Файл: 12664048253.png-(60.56KB, 279x169, Screen shot 2010-02-17 at 2_02_33 PM.png)
1660 No. 1660 watch
Дев, подскажи, как под фортраном в mpi шустро собрать матрицу на одном, а лучше всех процессах
есть real array(nx,ny)
и есть real part(bnx:enx,bny:eny)
надо чтобы каждый процесс засунул part в array
что-то подсказывает, что mpi_allgather подходит только для одномерных массивов, примеров с 2d нигде нет. :(
>> No. 1661
Я конечно ничерта не понимаю в фортране, матрицах и процессах, но разве двумерный массив это не одномерный массив, каждый из элементов которого сам является массивом?
>> No. 1662
mpi_allgather подходит для всего, читай же доки. Насколько я помню, там надо задавать формат твоих данных.

Если у тебя разбивка по строкам, то вообще никаких проблем, у тебя на каждом устройстве блок последовательных байт. Используешь готовый тип DOUBLE размером РАЗМЕР_СТРОКИ*ЧИСЛО_СТРОК.

Если же у тебя разбивка по столбцам, то нужно создать собственный тип КУСОК сначала. При создании типа указываешь: ширина слайса - ШИРИНА_БЛОКА, скип - (ШИРИНА_ТАБЛИЦЫ-ШИРИНА_БЛОКА).

Потом отправляешь данные типа КУСОК в количестве ВЫСОТА_ТАБЛИЦЫ.
>> No. 1663
В том то и беда, что mpi_type_subarray/mpi_type_darray как бы не поддерживается, а потому так просто мне не справиться. Мне надо засунуть подблок матрицы (не строка и не столбец, а именно подблок) который непрерывно представлен в памяти в разрывную память.

То есть есть локальный массив
XXX
YYY
ZZZ
который представлен в памяти как XXXYYYZZZ, который должен, к примеру, леч так:
0XXX0
0YYY0
0ZZZ0
то есть представлен в памяти 0XXX00YYY00ZZZ0

Временно вышел из ситуации при помощи mpi_allreduce, суммируя бесполезные нули.
Но все равно спасибо!
оп
>> No. 1711
>>1663
Используй другую адресацию в матрице. Допустим, у тебя разбивка по блокам B_pq. Чтобы адресовать элемент главной матрицы (i, j), делай так:

GetBlockIndicesAndOffsets(i, j, /out/ p, /out/ q, /out/ offset);
double val = A[pblocks_in_lineblock_w + q*block_w + i];

Т.е. внутри твоей "матрицы" данные лежат не по строкам, как обычно, а по блокам: блок A11 (целиком, по строкам ширины ШИРИНА_БЛОКА), блок A12, и так далее:

A = b11a11, b11a12, b11a13, b11a21, b11a22, b11a23, ..., b11a33, b12a11, b12a12, ..., b13a33, b21a11, ..., b33a33.

В принципе, координаты даже переводить несложно, только не очень удобно. Но можно переопределить квадратные скобочки, тогда вообще всё будет легко.
[Назад]


Удалить сообщение []
Пароль  
[Mod]