Поддержка мультипроцессорности и технологии Hyper-Threading в блоке визуализации программы CPU RightMark
Для использования возможностей SMP и CMP в блоке визуализации CPURM создаётся два или четыре отдельных потока рендеринга. При отрисовки нового кадра каждый поток получает для рендеринга определённую часть экрана, далее потоки работают независимо. Таким образом, достигается необходимый параллелизм в исполнении программного кода.
Потоки работают практически независимо, они не сообщаются друг с другом посредством сигналов, семафоров и т.п. В каждом из них выполняется одинаковая функция рисования сцены. У каждого потока есть собственный набор данных, описание геометрии, соответствующей рисуемой области экрана, и т.п. и есть данные, разделяемые сразу всеми потоками. Текстуры, часть геометрии, и другие данные. При работе процедуры рисования происходит чтение из памяти массивов информации и запись полученных цветов пикселей в экранный буфер, расположенный в системной или видео памяти. Локальные переменные для хранения временных параметров занимают незначительный объём памяти, около килобайта.
Взаимодействие с Hyper-Threading
В отличие от классических многопроцессорных систем с независимо работающими CPU, в системе с Hyper-Threading два логических CPU делят один физический. Поэтому недопустима ситуация, когда один из потоков, не выполняя полезной работы, находится в бесконечном цикле ожидания сигнала и, таким образом, отнимает ресурсы физического процессора и мешает выполнению другим логическим процессором полезной работы. Для предотвращения такой ситуации использовалась функция WaitForMultipleObjects из Win32 API, которая погружает главный поток программы, ожидающий окончание работы потоков отрисовки, в специальное спящее состояние, при котором потребляется минимальное количество процессорного времени.
Лев Дымченко
|