Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Заплюхался в элементарной алгебре

Заплюхался в элементарной алгебре

Страницы: 1 2 3 Следующая »
sanПостоялецwww14 мая 201822:23#0
Что-то я туплю, но может у кого мозги посвежее...
Задача: есть несколько тредов, которые выполняются за разное время (время каждого известно). Надо установить каждому треду некий коэфициент (скажем глубину цикла), что бы все они закончились одновременно.
Вроде все просто - для двух тредов все сводится к системe уравнений a*t1 = b*t2; t1+t2=1;  Откуда получаем, a = t2/(t1+t2); Для трех тредов уже сложнее, получается a = t2/(t1+t2+t1*t2/t3); Наверно можно напрячься и решить и для 4х тредов. Но как это сделать в общем виде? Я что-то никак не могу ухватить логику...

Правка: 14 мая 2018 22:28

Great V.Постоялецwww14 мая 201822:28#1
Какую задачу решаешь, братишка? Про объекты синхронизации слышал?
Если слышал и тема не о них - то так и напиши. А то набигут сейчас...
sanПостоялецwww14 мая 201822:31#2
Ну задача вообще-то чисто алгебраическая. Но если вкратце, то мне надо считать на нескольких видеокартах одну картинку (каждая рендерить свой кусок изображения). Карты разные, но производительность каждой из них я знаю (определяю во время старта программы). Теперь мне надо вычислить какой кусок картинки должна считать каждая карта что бы максимально загрузить систему.

Правка: 14 мая 2018 22:36

Che@terПостоялецwww14 мая 201822:35#3
Пропорции?

Перевести время в производительность - скажем в мегапиксель/секунда.


Если нужно распределить 100МП по трем адаптерам с производительностью 1МП/с 5МП/с 10МП/с

То для первого - 100МП  * 1МП/с  /(1МП/с + 5МП/с + 10МП/с) = 6.25МП

То для второго - 100МП  * 5МП/с  /(1МП/с + 5МП/с + 10МП/с) = 31.25МП

То для третьего - 100МП  * 10МП/с  /(1МП/с + 5МП/с + 10МП/с) = 62.5МП

Правка: 14 мая 2018 22:36

}:+()___ [Smile]Постоялецwww14 мая 201822:38#4
В смысле, надо найти [cht]a_i[/cht], такие что [cht]a_1t_1=a_2t_2=\cdots=a_nt_n[/cht] и [cht]a_1+a_2+\cdots+a_n=1[/cht]?

В этом случае [cht]a_i=\frac\alpha{t_i}[/cht], [cht]\alpha=1/\left(\frac1{t_1}+\frac1{t_2}+\cdots+\frac1{t_n}\right)[/cht].

sanПостоялецwww14 мая 201822:39#5
Время рендеринга полной картинки каждой картой я знаю. Мне надо задать scissor для каждой карты, т.е. какой кусок она будет считать что бы все закончилось одновременно.

Правка: 14 мая 2018 22:40

sanПостоялецwww14 мая 201822:42#6
}:+()___ [Smile]

Вот это уже похоже на правду. Щас попробую проверить алгебру арифметикой. :)

Правка: 14 мая 2018 22:43

MrShoorУчастникwww14 мая 201822:57#7
san
> Вроде все просто - для двух тредов все сводится к системe уравнений a*t1 =
> b*t2; t1+t2=1; Откуда получаем, a = t2/(t1+t2);
Что-то я совершенно не понял, как ты получил одно из другого, и зачем там вообще система.
Более того, у тебя a = t2/(t1+t2) неверное, потому что в таком виде у тебя a будет всегда < 1, что как бы неверно.

Вот у тебя N потоков, время работы каждого известно.
t1 + t2 + t3 + ... + tN = tsumm
Тогда для вычисления коэффициента тебе надо всего лишь решить пачку уравнений (не системы даже, а просто отдельных уравнений):
a1*t1 = tsumm/N
a2*t2 = tsumm/N
...
aN*tN = tsumm/N

sanПостоялецwww14 мая 201823:02#8
А и должно быть меньше единицы, это часть экрана. Например если t1==t2, то а==0.5 и b==0.5, т.е. экран делится пополам.
MrShoorУчастникwww14 мая 201823:11#9
san
> А и должно быть меньше единицы, это часть экрана. Например если t1==t2, то
> а==0.5 и b==0.5, т.е. экран делится пополам.
Вот твоя формулировка:
Задача: есть несколько тредов, которые выполняются за разное время (время каждого известно). Надо установить каждому треду некий коэфициент (скажем глубину цикла), что бы все они закончились одновременно.

Представим, что у тебя 2 потока. Один выполняется 1 секунду, другой 5 секунд. Если брать коэффициенты меньше нуля, то ты просто замедлишь оба потока. Конечно можно замедлить, чтобы они оба пришли к финишу одновременно, но тебе я так понимаю надо наоборот часть потоков ускорить, а часть замедлить?

А судя по: "Например если t1==t2, то а==0.5 и b==0.5, т.е. экран делится пополам. " формулировка таки не соответствует тому, что ты хочешь получить. Опиши задачу понятнее.

upd. Я кажется понял, что именно тебе надо. У тебя есть N различных видеокарт, которые рендерят с разной скоростью. Ты знаешь их скорость, тебе надо распределить время, чтобы они закончили одновременно. Так?

Правка: 14 мая 2018 23:13

MrShoorУчастникwww14 мая 201823:22#10
san
Производительность видеокарт v (известна)
Время должно быть одинаковым t
Нужно найти количество посчитанной инфы каждой видеокартой (s1, s2, ... ,sN)
Это будет пачка уравнений вида:
v1*t = s1
v2*t = s2
v3*t = s3
....
vN*t = sN

С учетом того, что общее количество информации равно 1:
s1+s2+s3+s4+...+sN = 1

Складываем вместе все уравнения, и получем:
(v1 + v2 + v3 + ... + vN)*t = s1+s2+s3+s4+...+sN
Или:
(v1 + v2 + v3 + ... + vN)*t = 1
Или:
t = 1 / (v1 + v2 + v3 + ... + vN)

Теперь подставляем это t в исходные уравнения:
v1*t = s1
v2*t = s2
v3*t = s3
....
vN*t = sN

Ну и s1, s2, s3, ... , sN и будут те самые коэффициенты, которые тебе нужны.

Правка: 14 мая 2018 23:24

/A\Постоялецwww14 мая 201823:32#11
Недавно читал про алгоритм поиска который как раз для таких задач используется, но не помню название.
Как вариант за несколько итераций подобрать коэффициенты.
RikkПостоялецwww14 мая 201823:45#12
если караван идет то скорость каравана считается как скорость самого медленного верблюда . это гарантированая 100процентов скорость.
то есть множить дроби там не надо никакие . а выбрать из набора самое медленное .это точка отсчета .

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

(самое медленное - tкаждое)=старт процесс
самое медленное=стоп процесс

например
есть три штука сущности.карты.
т=2сек
т=3сек
т=5сек

самое быстрое=2сек
самое медленное=5сек
гарантировано точно 100процентов это будет со скоростью 5сек .самый медленный верблюд=скорость каравана.

первая штука 5-2=3секунда
вторая штука 5-3=2секунда
третья штука=5-5=0секунда

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

первый процесс =запуск на т= третья секунда
второй процесс=запуск на т=вторая секунда
третий процесс=запуск на т=нолевая секунда

выстраиваем по шкале времени от нолевая секунда то Тмакс

первая секунда = запуск самой медленной пять секунд.........процесс от первой секунды до пятой секунды. 1.2.3.4.5
вторая  секунда=запуск штука номер два т=3сек...................процесс от вторая секунда.до пятой секунды. 3.4.5
третья секунда=запуск штука номер один т=2сек...................процесс от четвертая секунда до пятой. 4.5

немного сумбур тут от того как считать номера . от нолевой сек 012345 это шесть штук (обычно номер ноль это первая штука), или если время то первая штука это первая секунда 12345.
то есть там +-1 на счетчик добавишь .

алгоритмы
сортировка от минимум до максимум
именованый список  карта1 карта2 карта3 и тд
цикл от первой секунды до самой большой секунды(самая медленная скорость)

ошибка логически тут
san
> t1+t2=1
не равно один .
более быстрое т1 содержится в более медленном т2. одно содержит в себе второе.

ошибка вторая логически тут
MrShoor
> Вот у тебя N потоков, время работы каждого известно.
> t1 + t2 + t3 + ... + tN = tsumm
брать сумму нельзя.
это содержимое отрезков когда абсолютно все значения быстрых одновременно содержатся в самом длительном значении. множество содержит в себе элемент1 и элемент2 и элемент3 тд.

ошибка третья логически тут
MrShoor
> Время должно быть одинаковым t

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

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

Правка: 14 мая 2018 23:57

MrShoorУчастникwww14 мая 201823:59#13
Rikk
> как же может время быть одинаковое , если заранее — скорость всех элементов
> разная?такого быть не может никак.
По условию задачи время должно быть одиковое, читай:
что бы все они закончились одновременно.
RikkПостоялецwww15 мая 20180:00#14
MrShoor
> С учетом того, что общее количество информации равно 1:
один бит?одна тонна?
Страницы: 1 2 3 Следующая »

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр