Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Igors от Май 24, 2012, 11:50



Название: Расчлененка
Отправлено: Igors от Май 24, 2012, 11:50
Добрый день

Есть массив/контейнер 500k таких точек
Код
C++ (Qt)
struct CPoint {
QVector3D mPosition;  // позиция точки в пр-ве
double mRadius;         // радиус
// др данные (здесь нас не интересуют)
};
 

Расчет длится неск минут, поэтому нужно задействовать все ядра. Но просто так дать каждой нитке часть точек не выходит, т.к. точки влияют одна на другую. Это ограничение можно сформулировать так:

- нельзя одновременно считать 2 точки (в разных нитках) если одна находится в радиусе другой

Как же расчленить данные (возможно повторно просчитывая некоторые точки)?

Спасибо


Название: Re: Расчлененка
Отправлено: Akon от Май 24, 2012, 15:06
Т.е никак не возникает суперпозиции (результат воздействия на точку нескольких внешних точек есть сумма воздействия этих точек)?


Название: Re: Расчлененка
Отправлено: Igors от Май 24, 2012, 15:37
Т.е никак не возникает суперпозиции (результат воздействия на точку нескольких внешних точек есть сумма воздействия этих точек)?
Грубо говоря строится граф: точка связывается с соседней, образуется "ребро" которое запоминается в обеих точках. Разные нитки не не  должны одновременно добавлять ребра в одни и те же точки.


Название: Re: Расчлененка
Отправлено: Fat-Zer от Май 24, 2012, 20:14
Грубо говоря строится граф: точка связывается с соседней, образуется "ребро" которое запоминается в обеих точках. Разные нитки не не  должны одновременно добавлять ребра в одни и те же точки.
А если на каждую точку поставить мьютекс? или жирно слишком будет?


Название: Re: Расчлененка
Отправлено: Bepec от Май 24, 2012, 20:15
Насколько я знаю - черезчур жирно.


Название: Re: Расчлененка
Отправлено: Igors от Май 25, 2012, 10:15
А если на каждую точку поставить мьютекс? или жирно слишком будет?
По памяти не жирно, атомарный мутекс 1 байт (ну плюс выравнивание). Но построение графа (по существу - триангуляция) предполагает последовательные итерации. Напр создали ребра для 1 точки, для другой создаем уже учитывая созданные и.т.д. Делать это с локами не выглядит реально

Распиливание/расчленение возможно. Напр взяли кусок слева, др справа, так что они не пересекутся, тогда можно дать каждой нитке по куску.


Название: Re: Расчлененка
Отправлено: Fat-Zer от Май 25, 2012, 17:14
По памяти не жирно, атомарный мутекс 1 байт (ну плюс выравнивание). Но построение графа (по существу - триангуляция) предполагает последовательные итерации. Напр создали ребра для 1 точки, для другой создаем уже учитывая созданные и.т.д. Делать это с локами не выглядит реально
я слабо себе алгоритм представляю...

а если не на CPU распараллеливать, а вынести всё в openCL? не получится?


Название: Re: Расчлененка
Отправлено: Igors от Май 25, 2012, 18:17
я слабо себе алгоритм представляю...
Ну так вдаваться в его подробности и не нужно - достаточно знать что расчет разными нитками должен производиться на непересекающихся кусках данных. Такой случай довольно типичен.

а если не на CPU распараллеливать, а вынести всё в openCL? не получится?
Задача не выглядит такой уж страшной и требующей привлечения таких масштабных тулзов  :)


Название: Re: Расчлененка
Отправлено: DmitryM от Май 30, 2012, 10:57
Ну так вдаваться в его подробности и не нужно - достаточно знать что расчет разными нитками должен производиться на непересекающихся кусках данных. Такой случай довольно типичен.
Если ничего не знать о природе точек, то это превращается в УГ.
На первый взгляд, нужно разбить данные на не пересекающиеся куски, а потом обработать, и на ум приходит MapReduce и Qt Concurrent.
А вот задача о независимом множестве относиться к NP-полным задачам, что и угнетает.