Archive for March 2010

Многопоточность (поток сознания)

Модная несколько лет назад тема “а давайте разместим игровой цикл в двух потоках – графика отдельно, физика отдельно” постепенно сходит на нет. И слава богу. По целому ряду причин. Во-первых, двухпроцессорными машинами уже никого не удивить, скоро никто не будет удивляться процессорам, в которых количество ядер будет измеряться двузначными числами. А во-вторых (и это более важно), ручное распределение задач по ядрам имеет определенную степень осмысленности только для простых задач, где такое распределение действительно может принести определенный перформанс. Но чем сложнее становится код, тем сложнее: а) держать в голове все выполняемые приложением задачи, б) иметь действительно эффективную реализацию многопоточности, в которой треды будут выполнять вычисления, а не ожидать друг друга.

При дальнейшем усложнении приложения можно получить и совсем дурацкую ситуацию – вручную распараллеленное приложение будет работать медленнее, чем точно такое же, но выполняемое в один поток. Ситуация сродни программированию на асемблере – известно, что ручной ассемблерной реализацией на синтетическом примере можно “выжать” еще 10-15% производительности из кода против С. Но если писать большую программу на ассемблере, то это займет гигантское количество времени и ресурсов, а результат вряд ли будет производительнее, чем высокоуровневая программа.
То же самое происходит и здесь. Ручное распараллеливание синтетического примера действительно может дать хороший прирост производительности. Ручное распараллеливание крупной программы почти наверняка потребует гигантских усилий и может принести замедление вместо ожидаемого ускорения.

Continue reading ‘Многопоточность (поток сознания)’ »