Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: [ТЧ,ЧН,ЗП] Многоядерность
GAMEINATOR forums > S.T.A.L.K.E.R. > Мастерская: создание модов для S.T.A.L.K.E.R.
Страницы: 1, 2
autistic
Цитата(abramcumner @ 25.08.2015, 00:02) *
Второй поток не может не успеть - там же критические секции поставлены.

некруто же, платформозависимая хрень (на поверку спинлок, если склероз не изменяет) в эпоху 11-го стандарта!
эй, кто там делал сборку под х64, пришло время заюзать православные примитивы синхронизации! biggrin.gif

Цитата(-StalkMen- @ 25.08.2015, 17:50) *
Профилировщик?

профилировщик может в картинки? blink.gif
Tron
Цитата(refuse @ 25.08.2015, 20:53) *
эй, кто там делал сборку под х64, пришло время заюзать православные примитивы синхронизации! biggrin.gif

Не вижу смысла тратиться на это, ибо все равно рендер намертво привязан к винде.
Если и буду заниматься МТ, то скорее всего только с фиберами

А то, да ты прав, spinlock
http://www.swedishcoding.com/wp-content/up...sing_fibers.pdf
Ну,а это еще сильный WIP:

Скрин с использванием в моем движке:
autistic
Цитата(Tron @ 25.08.2015, 22:14) *
Не вижу смысла тратиться на это, ибо все равно рендер намертво привязан к винде

может стоит тогда начать с отвязывания рендерера от винды? wink_old.gif
Tron


Если конечно у меня еще правильно работает... я сам еще не разобрался... библиотека без документации и примеров

Цитата(refuse @ 25.08.2015, 21:18) *
Цитата(Tron @ 25.08.2015, 22:14) *
Не вижу смысла тратиться на это, ибо все равно рендер намертво привязан к винде

может стоит тогда начать с отвязывания рендерера от винды? wink_old.gif

Ты готов написать новый рендер с 0? - Я, нет. Я уже со своим затрахался вдовль.
Другое дело, заменить его на какую - нибудь либу
autistic
Цитата(Tron @ 25.08.2015, 22:20) *
Другое дело, заменить его на какую - нибудь либу

есть варианты? smile.gif
Tron
Цитата(refuse @ 25.08.2015, 21:34) *
Цитата(Tron @ 25.08.2015, 22:20) *
Другое дело, заменить его на какую - нибудь либу

есть варианты? smile.gif

https://github.com/bkaradzic/bgfx

Но автор GL4 версию не развивает активно(в данный момент)
https://github.com/bazhenovc/sigrlinn
autistic
Tron,
нууу, на мое скромное имхо это не совсем альтернатива промышленной разработке, а точнее совсем не альтернатива. вот если бы нечто похожее было запилено с сопоставимым качеством картинки, с юнит тестами, обширным коммьюнити и подтверждено многими реально выпущенными проектами, использующими эту технологию, что-то на что можно было бы ориентироваться как на стандарт де-факто, вот тогда другое дело smile.gif
Neo][
Цитата(-StalkMen- @ 25.08.2015, 18:50) *
Neo][,
Хорошая картинка. Профилировщик?

-StalkMen-, word smile.gif)

Цитата(refuse @ 25.08.2015, 22:53) *
профилировщик может в картинки?

refuse, профилировщик профилировщику рознь smile.gif

Цитата(-StalkMen- @ 25.08.2015, 18:50) *
Но а это ->
Код
if (dwFrame!=mt_Thread_marker)

Скорее всего workaround для некого побочного эффекта, на вскидку я не смог проследить возможности нарушения условия.
-StalkMen-
Neo][,
Цитата(Neo][ @ 26.08.2015, 12:42) *

Профилировщик

Второй скрин - откуда инфа о длительности?

Цитата(Neo][ @ 26.08.2015, 12:42) *

Скорее всего workaround для некого побочного эффекта, на вскидку я не смог проследить возможности нарушения условия.

Цитата(-StalkMen- @ 24.08.2015, 22:35) *
Если 2 поток не успел, то делаем его работу сами.

(На мп серваке очень часто юзается)
Neo][
Цитата(-StalkMen- @ 27.08.2015, 01:34) *
Второй скрин - откуда инфа о длительности?

-StalkMen-, это сделано специально для наглядности, чтобы исключить вопросы на подобии:
Цитата(-StalkMen- @ 27.08.2015, 01:34) *
Если 2 поток не успел, то делаем его работу сами.


2-й поток не может не успеть, первый поток будет ждать на mt_csEnter
Цитата
Statistic->RenderTOTAL_Real.FrameEnd ();
Statistic->RenderTOTAL.accum = Statistic->RenderTOTAL_Real.accum;
#endif // #ifndef DEDICATED_SERVER
// *** Suspend threads
// Capture startup point
// Release end point - allow thread to wait for startup point
mt_csEnter.Enter ();
mt_csLeave.Leave ();

// Ensure, that second thread gets chance to execute anyway
if (dwFrame!=mt_Thread_marker) {
for (u32 pit=0; pit<Device.seqParallel.size(); pit++)
Device.seqParallel[pit] ();
Device.seqParallel.clear_not_free ();
seqFrameMT.Process (rp_Frame);
}


пока второй не выполнит работу и не освободит эту секцию:

Цитата
Device.seqFrameMT.Process (rp_Frame);

// now we give control to device - signals that we are ended our work
Device.mt_csEnter.Leave ();
-StalkMen-
Neo][,
wink_old.gif
Хорошо, вопрос, будет ли работать, если сделать так -
Код
void             mt_Thread    (void *ptr)    
{
    return;
    while (true)
    {

Цитата(Neo][ @ 27.08.2015, 10:20) *

пока второй не выполнит работу и не освободит эту секцию:

А то исходя из этого, должен быть dead lock laugh.gif
Neo][
Цитата(-StalkMen- @ 27.08.2015, 17:26) *
Хорошо, вопрос, будет ли работать, если сделать так -

-StalkMen-, а почему нет, я что-то пропустил? smile.gif

Вот предложенный тобой случай:
autistic
Цитата(-StalkMen- @ 27.08.2015, 16:26) *
А то исходя из этого, должен быть dead lock

нетЪ. взаимной блокировкой называется ситуация при которой несколько потоков ждут завершения работы (или освобождения ресурсов) друг друга, как в классической комедии, где двое никак не могут пройти через дверь, потому что очень вежливые)
твой случай, если допустить, что поток один ждет завершения потока 2, а тот в свою очередь ушел в бесконечный цикл, взаимной блокировкой назвать нельзя, т.к. поток 2 может продолжать свою работу в цикле.
Flammable
Цитата(Tron @ 24.08.2015, 22:36) *
Это что-то типа маленькой синхронизации выступает?

Это неудачная попытка распараллелить вычисления на два потока в пределах одного кадра: предполагалось, что в каждом кадре первый поток посредством пары критических секций должен запустить параллельно себе второй поток (который выполнит часть задач рендера, обновит маркеры на карте, посчитает физику летящих пуль, обновит звуки и вызовет lua GC). На деле регулярно случались ситуации, когда второй поток вообще не получал времени на протяжении целых серий кадров. Человек, который это все писал, не понял, почему оно так получается, и решил проблему добавлением костыля в виде mt_Thread_marker. В итоге, первый поток регулярно и на протяжении целых серий кадров выполнял работу второго потока, в то время как тот спал. Фикс можно забрать здесь, если кому-то интересно.
abramcumner
Цитата(Flammable @ 04.11.2015, 13:16) *
Человек, который это все писал, не понял, почему оно так получается, и решил проблему добавлением костыля в виде mt_Thread_marker.

smile.gif Или, что скорее, ты не понял, что там происходит.

Цитата
В итоге, первый поток регулярно и на протяжении целых серий кадров выполнял работу второго потока, в то время как тот спал.

Чем лучше твое решение: работу выполняет второй поток пока первый спит? Тоже на тоже, только еще расходы на переключение контекста и переходы в ядро и обратно?

Цитата
Фикс можно забрать здесь, если кому-то интересно.

Я вижу несколько проблем:
- появилась ошибка синхронизации - нет остановки второго потока, он так и продолжает считать уже посчитанные данные;
- заменены быстрые примитивы на медленные ядерные примитивы;
- в случаях когда основной поток не нагружен добавилось лишнее переключение контекста.

Замеры делались как "было" и как "стало"? На мой взгляд должно тормозить сильнее. Еще и глючить начать.
Flammable
Цитата(abramcumner @ 04.11.2015, 13:39) *
Чем лучше твое решение: работу выполняет второй поток пока первый спит?

Лучше тем, что задачи второго потока всегда выполняются вторым потоком. Когда fps небольшой, работы у первого потока всегда предостаточно (OnRender + OnFrame), поэтому на практике к снижению производительности это решение не приводит.
Цитата(abramcumner @ 04.11.2015, 13:39) *
Появились глюки из-за несинхронизированного доступа к данным.

Если там и есть глюки, то они есть с самого начала, потому что второй поток как выполнял свои задачи, так и выполняет.
И да, замеры делались, ожидания подтвердились: изменений нет.
upd:
Цитата(abramcumner @ 04.11.2015, 13:39) *
- появилась ошибка синхронизации - нет остановки второго потока, он так и продолжает считать уже посчитанные данные;

Это почему?
abramcumner
Цитата(Flammable @ 04.11.2015, 15:49) *
изменений нет.

То есть это не фикс.


Цитата(Flammable @ 04.11.2015, 15:49) *
Цитата(abramcumner @ 04.11.2015, 13:39) *
- появилась ошибка синхронизации - нет остановки второго потока, он так и продолжает считать уже посчитанные данные;

Это почему?

Это моя ошибка - спутало название метода Event::Set
Stalker_Monolit
Всем привет! cool.gif Накопал немного инфы пока был в отключке)))
Вот хочу спросить у опытных людей Атрибут потока МТА при компиляции подымает производительность?
К стате с наступающим новым годом)))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.