Как графические процессоры обрабатывают произвольный доступ?
Я прочитал несколько уроков о том, как реализовать raytracer в вычислительных шейдерах opengl 4.3, и это заставило меня задуматься о том, что меня давно беспокоило. Как именно графические процессоры обрабатывают огромное количество операций чтения с произвольным доступом, необходимых для реализации чего-то подобного? Каждый потоковый процессор получает свою собственную копию данных? Кажется, что система сильно перегружена доступом к памяти, но это только моя собственная, вероятно, неправильная интуиция.
1 ответ
Мультипроцессоры Stream (SM) имеют кэши, но они относительно малы и не помогут с действительно произвольным доступом.
Вместо этого одна из идей, стоящих за графическими процессорами, состоит в том, чтобы маскировать задержку доступа к памяти: каждому SM назначается несколько потоков для выполнения, а не ядра. Каждые свободные часы намечают некоторые потоки, которые не заблокированы при доступе к памяти. Когда данные, необходимые для потока, не находятся в кэше SM, поток останавливается до тех пор, пока эти данные не поступят, а другой поток не будет выбран для выполнения.
Обратите внимание, что рабочее предположение здесь заключается в том, что вы делаете тяжелые вычисления. Если все, что вы делаете, это только некоторые легкие вычисления для большого количества данных, например, просто суммируете много 32-битных операций с плавающей запятой, то очень вероятно, что узкое место будет в полосе пропускания шины памяти, и большую часть времени ваши потоки будут остановлены ожидая их биты, чтобы прибыть.
На практике, хотя вы делаете некоторые тяжелые вычисления на данных. Например, вы получаете входные нормали и параметры материала, а затем выполняете интенсивный расчет освещения для них. Здесь, в то время как некоторые потоки выполняют вычисления, другие ждут поступления своих данных.