![]() |
Показать все 11 сообщений этой темы на одной странице |
HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- вопрос по программированию#3 [OpenMP] (https://hlfx.ru/forum/showthread.php?threadid=3260)
вопрос по программированию#3 [OpenMP]
хочу распараллелить последовательную подпрограмму с помощью openmp. подпрограмма представляет собой обход дефрагментированого разреженного массива F(N1,N2), где N1~500, N2~100000. в служебном массиве V(N1)<N2 хранится значение последнего значимого элемента подмассива F(i,:).
значимые элементы содержат в себе фазовые вектора частиц p=(x,v,i) где x -- координата, v -- скорость, i -- номер узла, причём в F(i,:) хранятся лишь те вектора, чей (x) лежит в заданном интервале (т.е. все вектора локализованы)
в процессе счёта значения x меняются так, что частица может или перескочить в соседний узел или остаться в том же.
сейчас я просто обхожу последовательно все узлы i=0..N1, все вектора j=0..V(i), провожу вычисления, и в случае, если x не соотвествует узлу i, то переношу его значение в соседний узел i2, а на его место записываю нижнее значение из F(i,V(i)) (и делаю V(i)-1, V(i2)+1).
как организовать такой обход массива при параллельном расчёте? пока на ум приходит только завести массив такого же ранга F2, все сложные вычисления проводить параллельно в F, а затем обойти F последовательно, копируя значения в уже в нужные узлы F2, но это явно непотимально. какие есть ещё варианты? с учётом того, что порядок в котором вектора записаны внутри F(i,:) не имеет значения. ссылки на статьи приветствуются.
__________________
http://www.moddb.com/mods/monorail-quest
Классические приёмы распараллеливания молекулярной динамики - разбиение пространства с периодическими граничными условиями, например - не подходят?
Возможно, я не въехал в задачу, у меня от этих F, V и N голова кругом пошла. Словесно бы описал, что ли..
__________________
Я может и не в тему. Но по-моему в развитых странах ваши задачи давным давно уже решены. ну всмысле, компьютеры изначально предназначались для таких вот глобальных рассчётов и алгоритмы распараллеливания подобных задач были придуманы и отлажены еще в 70-е годы.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Дядя Миша
Так он и просит дать ему алгоритм.
__________________
XaeroX я думал мож какой сайт есть специализироватый
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
XaeroX
вот. я нарисовал схемку
__________________
http://www.moddb.com/mods/monorail-quest
__________________
XaeroX
а не получится ли ситуации, что соседний процессор попытается обработать уже обработанную частицу?
кстати, ты с openCL знаком?
__________________
http://www.moddb.com/mods/monorail-quest
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
ну и задачка, разве нельзя разбить массив на несколько блоков, например на 4 и сделать обсчет в 4 потока, заранее захватив на 2 больше элемента с начало и с конца для каждого блока т.к они влияют на расчет крайних элементов судя по схеме. потом дождаться окончания работы всех потоков и собрать результат воедино, автор так и написал вприцнипе, считаю это оптимальным решением.
если без синхронизации и ожидания потоков, то можно попробовать просто булевую переменую завести чтобы помечать обработаные ячейки, только значения булевой через атомарную операцию менять.
__________________
Временная зона GMT. Текущее время 08:14. | Показать все 11 сообщений этой темы на одной странице |
На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024