Второй поток не может не успеть - там же критические секции поставлены.
некруто же, платформозависимая хрень (на поверку спинлок, если склероз не изменяет) в эпоху 11-го стандарта! эй, кто там делал сборку под х64, пришло время заюзать православные примитивы синхронизации!
Цитата(-StalkMen- @ 25.08.2015, 17:50)
Профилировщик?
профилировщик может в картинки?
Tron
25.08.2015, 21:21
Цитата(refuse @ 25.08.2015, 20:53)
эй, кто там делал сборку под х64, пришло время заюзать православные примитивы синхронизации!
Не вижу смысла тратиться на это, ибо все равно рендер намертво привязан к винде. Если и буду заниматься МТ, то скорее всего только с фиберами
Tron, нууу, на мое скромное имхо это не совсем альтернатива промышленной разработке, а точнее совсем не альтернатива. вот если бы нечто похожее было запилено с сопоставимым качеством картинки, с юнит тестами, обширным коммьюнити и подтверждено многими реально выпущенными проектами, использующими эту технологию, что-то на что можно было бы ориентироваться как на стандарт де-факто, вот тогда другое дело
Neo][
26.08.2015, 12:47
Цитата(-StalkMen- @ 25.08.2015, 18:50)
Neo][, Хорошая картинка. Профилировщик?
-StalkMen-, word )
Цитата(refuse @ 25.08.2015, 22:53)
профилировщик может в картинки?
refuse, профилировщик профилировщику рознь
Цитата(-StalkMen- @ 25.08.2015, 18:50)
Но а это ->
Код
if (dwFrame!=mt_Thread_marker)
Скорее всего workaround для некого побочного эффекта, на вскидку я не смог проследить возможности нарушения условия.
-StalkMen-
26.08.2015, 22:39
Neo][,
Цитата(Neo][ @ 26.08.2015, 12:42)
Профилировщик
Второй скрин - откуда инфа о длительности?
Цитата(Neo][ @ 26.08.2015, 12:42)
Скорее всего workaround для некого побочного эффекта, на вскидку я не смог проследить возможности нарушения условия.
Цитата(-StalkMen- @ 24.08.2015, 22:35)
Если 2 поток не успел, то делаем его работу сами.
(На мп серваке очень часто юзается)
Neo][
27.08.2015, 10:25
Цитата(-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-
27.08.2015, 15:31
Neo][,
Хорошо, вопрос, будет ли работать, если сделать так -
Код
void mt_Thread (void *ptr) { return; while (true) {
Цитата(Neo][ @ 27.08.2015, 10:20)
пока второй не выполнит работу и не освободит эту секцию:
А то исходя из этого, должен быть dead lock
Neo][
27.08.2015, 16:44
Цитата(-StalkMen- @ 27.08.2015, 17:26)
Хорошо, вопрос, будет ли работать, если сделать так -
-StalkMen-, а почему нет, я что-то пропустил?
Вот предложенный тобой случай:
autistic
29.08.2015, 10:01
Цитата(-StalkMen- @ 27.08.2015, 16:26)
А то исходя из этого, должен быть dead lock
нетЪ. взаимной блокировкой называется ситуация при которой несколько потоков ждут завершения работы (или освобождения ресурсов) друг друга, как в классической комедии, где двое никак не могут пройти через дверь, потому что очень вежливые) твой случай, если допустить, что поток один ждет завершения потока 2, а тот в свою очередь ушел в бесконечный цикл, взаимной блокировкой назвать нельзя, т.к. поток 2 может продолжать свою работу в цикле.
Flammable
04.11.2015, 13:10
Цитата(Tron @ 24.08.2015, 22:36)
Это что-то типа маленькой синхронизации выступает?
Это неудачная попытка распараллелить вычисления на два потока в пределах одного кадра: предполагалось, что в каждом кадре первый поток посредством пары критических секций должен запустить параллельно себе второй поток (который выполнит часть задач рендера, обновит маркеры на карте, посчитает физику летящих пуль, обновит звуки и вызовет lua GC). На деле регулярно случались ситуации, когда второй поток вообще не получал времени на протяжении целых серий кадров. Человек, который это все писал, не понял, почему оно так получается, и решил проблему добавлением костыля в виде mt_Thread_marker. В итоге, первый поток регулярно и на протяжении целых серий кадров выполнял работу второго потока, в то время как тот спал. Фикс можно забрать здесь, если кому-то интересно.
abramcumner
04.11.2015, 13:33
Цитата(Flammable @ 04.11.2015, 13:16)
Человек, который это все писал, не понял, почему оно так получается, и решил проблему добавлением костыля в виде mt_Thread_marker.
Или, что скорее, ты не понял, что там происходит.
Цитата
В итоге, первый поток регулярно и на протяжении целых серий кадров выполнял работу второго потока, в то время как тот спал.
Чем лучше твое решение: работу выполняет второй поток пока первый спит? Тоже на тоже, только еще расходы на переключение контекста и переходы в ядро и обратно?
Я вижу несколько проблем: - появилась ошибка синхронизации - нет остановки второго потока, он так и продолжает считать уже посчитанные данные; - заменены быстрые примитивы на медленные ядерные примитивы; - в случаях когда основной поток не нагружен добавилось лишнее переключение контекста.
Замеры делались как "было" и как "стало"? На мой взгляд должно тормозить сильнее. Еще и глючить начать.
Flammable
04.11.2015, 15:43
Цитата(abramcumner @ 04.11.2015, 13:39)
Чем лучше твое решение: работу выполняет второй поток пока первый спит?
Лучше тем, что задачи второго потока всегда выполняются вторым потоком. Когда fps небольшой, работы у первого потока всегда предостаточно (OnRender + OnFrame), поэтому на практике к снижению производительности это решение не приводит.
Цитата(abramcumner @ 04.11.2015, 13:39)
Появились глюки из-за несинхронизированного доступа к данным.
Если там и есть глюки, то они есть с самого начала, потому что второй поток как выполнял свои задачи, так и выполняет. И да, замеры делались, ожидания подтвердились: изменений нет. upd:
Цитата(abramcumner @ 04.11.2015, 13:39)
- появилась ошибка синхронизации - нет остановки второго потока, он так и продолжает считать уже посчитанные данные;
Это почему?
abramcumner
04.11.2015, 16:08
Цитата(Flammable @ 04.11.2015, 15:49)
изменений нет.
То есть это не фикс.
Цитата(Flammable @ 04.11.2015, 15:49)
Цитата(abramcumner @ 04.11.2015, 13:39)
- появилась ошибка синхронизации - нет остановки второго потока, он так и продолжает считать уже посчитанные данные;
Это почему?
Это моя ошибка - спутало название метода Event::Set
Stalker_Monolit
15.12.2015, 01:26
Всем привет! Накопал немного инфы пока был в отключке))) Вот хочу спросить у опытных людей Атрибут потока МТА при компиляции подымает производительность? К стате с наступающим новым годом)))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.