Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Распределённые вычисления


Автор: KaraKum 13.12.2010, 13:06
Доброе время суток.
Пишу программу на С++ где есть поле для ускорения вычислений (которые сейчас длятся сутками (по 24 часа которые)) в разбиении выполнения на потоки, при этом потоков может быть очень много (найдётся работа для тысяч потоков).
Специфика программы в следующем:
    - используемых данных довольно-таки мало (100 килобайт от-силы (на несколько часов работы)) - то есть их можно передать по сети
    - каскадное разбиение на подзадачи (потоки) - разбив задачу на какие-то части, получившиеся части (подзадачи) можно также разбить на другие
    - процесс вычисления проходит практически без использования оперативной памяти (меньше одного мегабайта)
Так вот вопрос в следующем: какое железо лучше всего подойдёт для осуществления параллельных вычислений для этой задачи?
Гипер-современные (и соответственно дорогие) якобы 8-ми ядерные Core-i7; старые дешёвые (1000 рублей за штуку) однопоточные Celeron'ы с 4ГГц тактовой частоты?; видеокарты от NVidia (GeForce, Tesla) - придётся использовать чуждую мне "CUDA"; ...
Что посоветуете?

Автор: Sartorius 13.12.2010, 13:12
 Если памяти много на каждую подзадачу не требуется, то ИМХО нет смысла использовать кластеры и т.п. GPU вполне подходит для подобной задачи.

Автор: KaraKum 13.12.2010, 13:14
GPU от NVidia с использованием CUDA?

Автор: Artemon 13.12.2010, 13:17
Если обработка твоих данных не зависит от передыдующих данных, то CUDA, думаю справится быстрее всех предложенных тобой решений.

Поясню: например есть задача размыть изображение. Данная задача заключается в том, чтобы каждый пиксель обработать определенным алгоритмом. Так вот CUDA может каждый пиксель обработать одновременно (к сожалению забыл, сколько параллельных операций может сделать CUDA, но что-то в районе нескольких тысяч).

Автор: Sartorius 13.12.2010, 13:30
Цитата(KaraKum @  13.12.2010,  14:14 Найти цитируемый пост)
GPU от NVidia с использованием CUDA? 

CUDA или OpenCL на выбор. Или XBox/ PlayStation. Один товарищь на 10 PS терафлопсный кластер дома собрал )) 

Автор: borisbn 13.12.2010, 15:27
Цитата(KaraKum @  13.12.2010,  13:14 Найти цитируемый пост)
GPU от NVidia с использованием CUDA?

CUDA - привязка к nVidia (не худшая, конечно, но всё-таки привязка). Советую посмотреть на OpenCL, т.к. он поддерживается и nVidia и ATI и, если не ошибаюсь, Intel. Т.е. ты сможешь спокойно (почти) менять видеокарточки и даже выполнять вычисления без оных.
А что за вычисления, если не секрет ? Может можно их оптимизировать и на ЦП ? Например при помощи http://software.intel.com/en-us/articles/intel-ipp/ или http://www.threadingbuildingblocks.org/

Автор: KaraKum 13.12.2010, 16:32
Цитата(borisbn @  13.12.2010,  16:27 Найти цитируемый пост)
А что за вычисления?

Универское задание по симулированию молекулярных (межатомных) взаимодействий в жидкости, упругих и аморфных телах и так далее... Целью задачи является сбор статистики нестандартных явлений (гравитационный резонанс, испускание нейтрона...), поэтому эту задачу можно разбить на потоки вот так: каждый элемент проявляет воздействие (гравитационное, сильное/слабое ядерное, электромагнитное) на каждый другой, изменяя состояние оного, а тот, впоследствии, также проявляется воздействие на каждый другой и так далее - воздействие каждого элемента на все другие можно разбить по потокам и выполнять параллельно, лишь периодически синхронизируя. Один элемент - это 4-10 float-овых значений - не проблема передать даже по Dial-Up модему. Вот мой компьютер (2-х ядерный Интел) 10 элементов симулирует за 2 секунды, 56 элементов за 250 секунд, а 1021 элемент симулирует уже вторые сутки smile
Проблема в том что для совершения последующего шага требует знания состояния предыдущего шага и так далее (то есть, например, конечное состояние системы (мира) нельзя вычислить по формуле как это делается, к примеру, в уравнении координаты точки s=v*t + a*t^2 )

А что можете сказать по поводу распределения вычислений по сети? Клиенты подключаются к серверу и "предлагают" ему свою вычислительную помощь - сервер передаёт какую-то порцию работы. Есть какие-то библиотеки в этой области? Чтобы не решать заново уже решённое - ожидание ответа (торможение всех остальных) от отключившихся клиентов; подхватывание только что подключившихся на-лету и так далее...

Автор: boostcoder 13.12.2010, 16:50
Цитата(KaraKum @  13.12.2010,  16:32 Найти цитируемый пост)
Есть какие-то библиотеки в этой области?

ага. зовется http://code.google.com/p/discoly/. пока в процессе написания. обсуждение http://forum.vingrad.ru/forum/topic-311688.html.

Автор: Sartorius 13.12.2010, 18:49
Цитата(KaraKum @  13.12.2010,  17:32 Найти цитируемый пост)
симулированию молекулярных (межатомных) взаимодействий в жидкости, 


Цитата(KaraKum @  13.12.2010,  17:32 Найти цитируемый пост)
каждый элемент проявляет воздействие (гравитационное, сильное/слабое ядерное, электромагнитное) на каждый другой, изменяя состояние оного, а тот,

 В мол. динамике учитывают только электромагнитные взаимодействия. Остальные не имеет смысла обсчитывать в этом маштабе.

PS
 Посмотрите исходники громакса www.gromacs.org. Там грамотно параллелится такой счет.  AFAIK для счета GPU там тоже есть порт.

Автор: W4FhLF 17.12.2010, 17:42
KaraKum, насколько я понял твоя задача похожа на пресловутую n-body problem, которая очень хорошо распараллеливается в целом и в рамках подходов связанных с вычислениями на GPU тоже, тем более ты используешь вычисления одинарной точности. В СДК ещё с самых первых версий лежит пример решения этой задачи.

Вот производительность при решении этой задачи для 107520 объектов. Но тут двойная точность, для одинарной разрыв с обычным процессором был бы гораздо больше, на порядок.

user posted image

Цитата(borisbn @  13.12.2010,  15:27 Найти цитируемый пост)
CUDA - привязка к nVidia (не худшая, конечно, но всё-таки привязка). Советую посмотреть на OpenCL, т.к. он поддерживается и nVidia и ATI и, если не ошибаюсь, Intel. Т.е. ты сможешь спокойно (почти) менять видеокарточки и даже выполнять вычисления без оных.


Вот так может говорить только человек, который никогда ни с одной из этих библиотек не работал. smile Без обид.
Если кратко, то если не хочешь лишнего секса с дровами/совместимостью/пробелами в стандарте/отсутствием норм. доков и кода, то выбирай CUDA. Плюс OpenCL из-за своей универсальности всегда будет медленнее CUDA. Хотя если интерес чисто академический, то почему бы и нет.

Автор: KaraKum 17.12.2010, 17:59
О, спасибо за столь развёрнутый ответ!
Тогда такой немного отстранённый от основной темы вопрос про CUDA в контексте моей задачи:
       - будет ли работать CUDA-код на одноядерном процессоре вообще без видеокарт?
       - CUDA - это хоть немного похоже на "pthread" - то есть код примерно следующего (если говорить в-общем) типа не придётся полностью принципиально переписывать?:
Код

//данные, которые используются одновременно во всех потоках:
void* IAmVeryUnsafe[];
void ComputationalFunction(void*)
{
      //безопасно берём какие-нибудь данные из общей памяти:
      pthread_mutex_lock();
      void* someOverallData = IAmVeryUnsage[45];
      pthread_mutex_unlock();
      //вычисляем принцип мироздания...
}
//давайте разобьём на 100 потоков:
int main(int argc, int** argv)
{
      for(int i = 0; i < 100; i++)
      {
           pthread_create(..., computationalFunction, ...);
      }
      //ждём когда все выполнят работу...
      pthread_join(...);
}


      - будет ли CUDA-код хотя бы компилироваться для Линукса? (кроссплатформенность бывает узкой, вот, например, в случае с PhysX (тоже от NVidia) в Линуксе не поддерживает мягкие ткани (удивительно!) и полностью отсутствует 64-битная версия)


Автор: W4FhLF 17.12.2010, 18:16
KaraKum, CUDA это библиотека. А код написанный под GPU на обычном процессоре работать не будет. Там свой компилятор и свой машинный код. Но программу ты пишешь на С/С++. Лучше то конечно почитать что-нибудь, я же тут не стану тебе цитировать документацию. 


Цитата(KaraKum @  17.12.2010,  17:59 Найти цитируемый пост)
будет ли CUDA-код хотя бы компилироваться для Линукса?


да спокойно вообще, CUDA есть под линукс, вин, макось. Просто ставишь дрова, рантайм и поехало.

Добавлено @ 18:17
Цитата(KaraKum @  17.12.2010,  17:59 Найти цитируемый пост)
CUDA - это хоть немного похоже на "pthread" - то есть код примерно следующего (если говорить в-общем) типа не придётся полностью принципиально переписывать?:


Концептуально идея таже, но там масса своих деталей. 

переписывать думаю придётся smile

Автор: Фантом 17.12.2010, 18:59
Цитата(W4FhLF @  17.12.2010,  17:42 Найти цитируемый пост)

Вот производительность при решении этой задачи для 107520 объектов.

А это прямое суммирование или tree-code?

Автор: W4FhLF 17.12.2010, 19:20
Фантом, полагаю, что прямое суммирования раз оно эффективно работает на ГПУ smile Но я не уверен. 

Автор: KaraKum 17.12.2010, 19:54
 smile Пока ждал первого ответа на свой вопрос решил делать упор на распределённые вычисления, организованные через WWW на компьютерах друзей и знакомых - набралось уже 20 компьютеров (разношёрстной "публики" - от Pentium III до Xeon-сервера и от DOS до Linux - ужас). (DOS, кстати, в интернет-то выйти может?).
Ещё сделал не всё но что-то запускаемое есть: прога на клиенте добавляется в автозапуск; при старте компа подключается ко мне (в "центр"), получает задание, выполняет его и отправляет результат мне; потребляет на клиенте не всю мощность процессора (чтобы пользователь не жаловался на то что у него мышка по экрану еле ползает) (правда не научился как сделать зависимость от мощности процессора); и так далее...
Что рассказываю-то: вот и не знаю как сюда впишется CUDA - конечно можно забыть про CUDA вообще и развивать всё уже по намеченной траектории, но всё-таки обидно "махнуть рукой" на ЭВМ, у которых есть GPU от NVidia, но  не работает на меня  smile 

Автор: Фантом 17.12.2010, 20:57
Цитата(W4FhLF @  17.12.2010,  19:20 Найти цитируемый пост)
Фантом, полагаю, что прямое суммирования раз оно эффективно работает на ГПУ

Э, нет, так я и сам могу.  smile Собственно, мне именно это и хочется узнать, поскольку, если это прямое суммирование, то такой результат понятен, но (по крайней мере для меня) неинтересен. А вот если на GPU удалось выжать такой прирост производительности для tree-кода, то это уже совсем другое дело.

Автор: W4FhLF 17.12.2010, 21:22
Фантом, http://http.developer.nvidia.com/GPUGems3/gpugems3_ch31.html подробно расписана реализация.


Автор: Фантом 17.12.2010, 21:50
Цитата(W4FhLF @  17.12.2010,  21:22 Найти цитируемый пост)
здесь подробно расписана реализация.

Спасибо, посмотрел. Увы, но пока это лишь прямое суммирование, причем предельно простое - с интегрированием методом Эйлера и регуляризацией путем обрезки потенциала. Все остальное только "в будущем мы предполагаем рассмотреть...". А жаль.

Автор: W4FhLF 17.12.2010, 22:11
Цитата(Фантом @  17.12.2010,  21:50 Найти цитируемый пост)
и регуляризацией путем обрезки потенциала


Это где?

Цитата(Фантом @  17.12.2010,  21:50 Найти цитируемый пост)
Все остальное только "в будущем мы предполагаем рассмотреть...". А жаль.


Дык примеру то сколько лет?) Я немного поискал, уже кое-что сделано. Погугли:

Toward efficient GPU-accelerated N-body simulations
A novel multiple-walk parallel algorithm for the Barnes–Hut treecode on GPUs – towards cost effective, high performance N-body simulation
Accelerating astrophysical particle simulations with programmable hardware (FPGA and GPU)
High Performance Direct Gravitational N-body Simulations on Graphics Processing Units
The Chamomile Scheme: An Optimized Algorithm for N-body simulations on Programmable GPUs

Автор: Фантом 17.12.2010, 23:13
Цитата(W4FhLF @  17.12.2010,  22:11 Найти цитируемый пост)

Это где?

П.31.2, две последние формулы (с приближенными равенствами).


Цитата(W4FhLF @  17.12.2010,  22:11 Найти цитируемый пост)

Дык примеру то сколько лет?) Я немного поискал, уже кое-что сделано.

Да я знаю. Проблема в том, как это сделано - эти вещи почти всегда эффективны на синтетических тестах, а в реальных задачах производительность очень серьезно падает. Именно поэтому первый вопрос и возник - "а вдруг"? Либо я все-таки что-то пропустил, либо кто-то все-таки что-то хорошее придумал.

Автор: W4FhLF 17.12.2010, 23:43
Цитата(Фантом @  17.12.2010,  23:13 Найти цитируемый пост)
П.31.2, две последние формулы (с приближенными равенствами).


А, это ты про защиту от деления на ноль...


Цитата(Фантом @  17.12.2010,  23:13 Найти цитируемый пост)
Проблема в том, как это сделано - эти вещи почти всегда эффективны на синтетических тестах, а в реальных задачах производительность очень серьезно падает.


А чем эти тесты от реальных задач отличаются?

Автор: Фантом 17.12.2010, 23:51
Цитата(W4FhLF @  17.12.2010,  23:43 Найти цитируемый пост)

А, это ты про защиту от деления на ноль...

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

Цитата(W4FhLF @  17.12.2010,  23:43 Найти цитируемый пост)

А чем эти тесты от реальных задач отличаются? 

Параметрами тел, их распределением, характерными интервалами времени, на которых надо считать... Ну вот те же тесные сближения: если сначала расположить все точки равномерно и считать все на временах, меньших времени пересечения, то код получится очень эффективным  - из-за практически постоянного распределения точек по дереву поиска.

Автор: W4FhLF 18.12.2010, 14:07
Фантом, ясно, спасибо за небольшой экскурс. ;)

Автор: KaraKum 20.12.2010, 00:57
Насколько я знаю, нет стандартного метода потреблять только определённый процент производительности процессора, правильно ли я предполагаю что следует в коде расставить вызовы "sleep()", в которые передавать время, зависящее от мощности компа чем слабее комп, тем больше время "отдыха". Однако как можно определить такую абстрактную характеристику как "мощность"? Может есть уже какие-то реализованные средства? Или писать что-то типа?:
Код

int power = -1;
switch(pcType)
{
     case pentium_III: power = 5; break;
     case pentium_IV: power = 8; break;
     ....
     case Core_i7: power = 16; break;
     ....
}

бррр....
Что по этому поводу можете посоветовать? Ато даже не знаю с чего начать поиски...

Автор: xvr 20.12.2010, 14:52
Цитата(KaraKum @  20.12.2010,  00:57 Найти цитируемый пост)
Насколько я знаю, нет стандартного метода потреблять только определённый процент производительности процессора,
А зачем? Что бы дать поработать Idle процессу ОС? Если надо обеспечить равномерную загрузку процессора в том числе и другими процессами, то надо играться приоритетом задачи.
А вызов sleep в произвольные моменты времени может только ухудшить общую производительность системы, т.к. большую часть времени процессор будет занять переключениями задач (на вашу задачу и обратно), а не полезной работой



Автор: KaraKum 20.12.2010, 17:27
Цитата(xvr @  20.12.2010,  15:52 Найти цитируемый пост)
надо играться приоритетом задачи

Да - это вроде подходит...
А что по поводу общих характеристик о производительности компьютера? Это всё-равно нужно для того чтобы выделять задачи с размером в зависимости от мощности компьютера.

Автор: xvr 20.12.2010, 23:19
Цитата(KaraKum @  20.12.2010,  17:27 Найти цитируемый пост)
А что по поводу общих характеристик о производительности компьютера?
Смотрите на количество процессоров и тактовую частоту. Конкретная платформа - это уже очень тонкая настройка  smile 

Автор: KaraKum 22.12.2010, 13:57
Цитата(xvr @  21.12.2010,  00:19 Найти цитируемый пост)
Смотрите на количество процессоров и тактовую частоту.

Это очень неопределённо: решил складывать все подключенные процессоры и каждому клиенту выдавать задачу в зависимости от доли его процессоров в общей совокупности (тоже самое и с тактовой частотой) - то есть чем больше у него процессоров и тактовой частоты - тем больше задач он получит. Для корректировки этого значения собираюсь хранить статистику выполнения задач в базе данных и если при распределении задач имеется уже какая-то статистика для именно этого процессора, то давать ему задачу исходя из его "репутации".
Как это смотрится со стороны?  smile 


P.S. Спрашиваю потому что иногда при поиске решения мозг как-то зацикливается на одном и том же и перестаёт видеть порой простые и красивые решения...

Автор: xvr 22.12.2010, 21:05
В принципе нормально ...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)