2013-10-09 1 views
0

С процессором и памятью это просто.Понимание параллелизма и графического процессора как ограниченного ресурса

Процесс имеет большое виртуальное адресное пространство, которое частично отображается в физическую память. Когда текущий процесс пытается получить доступ к странице, которая не находится в физической памяти, операционная система входит в систему, выбирает страницу для обмена (например, с Round Robin), свопирует ее на диск, затем считывает требуемую страницу из свопа, а элемент управления - вернулся к процессу. Это просто, потому что процесс не может продолжаться без этой страницы.

Ядра GPU - это совсем другая история.

Рассмотрим USECASE:
с высоким приоритетом [CPU] процесса, а именно X, делает вызов ядра (который является блокировка вызовов). В настоящий момент разумно, чтобы ОС переключала контексты и отдавала CPU другому процессу, а именно Z. Для примера, пусть процесс Z также сделает что-то тяжелое с графическим процессором.

Теперь, что делает драйвер GPU? Остановляет ли он ядро, принадлежащее [более высокоприоритетным] X? Сообщает ли он ОС, что Z не имеет приоритетов для разгрузки ядер X? В общем, что происходит, когда двум процессам нужны ресурсы графического процессора, но доступной памяти GPU достаточно, чтобы обслуживать только один из них за раз?

+0

Даже одна нить подачи данных делает ядра процессора недоступными в течение некоторого времени для opencl, если вы указали opencl-контекст на полный-процессор. Вы можете использовать деление устройства opencl, чтобы сделать полный процессор в отдельных ядрах, чтобы избавиться от этого. На данный момент, возможно, gtx titan и r9-290x могут выполнять деление устройства. Протестировал драйвер HD7870 на FX8150, и он задохнулся. Когда я использовал деление устройства для отделения 7 ядер, он течет как жидкость. Если вы не используете waitevent для gpu, то ядро ​​не блокирует процессор. –

+0

Я слышал, что HD7870 может выполнять столько независимых задач, сколько свой номер блока вычислений (20) отдельно на сворачивающемся домашнем сайте @. На самом деле две или три подачи вычислительной единицы могут выполняться одним ядром, как они писали. –

+3

В CUDA: 1. вызовы ядра не блокируются. 2. Вы можете запускать несколько ядер и выполнять последовательно (или, возможно, параллельно), даже если они выданы из нескольких потоков, и они будут выполняться в соответствии с правилами 3 графического контроллера графического процессора. Если вы попытаетесь выделить больше памяти, чем может поддерживать устройство , распределение не будет выполнено и вернет ошибку API среды выполнения.Таким образом, вы даже не дойдете до ядра ядра, которое зависит от этих данных. –

ответ

4

Контент-коммутатор CUDA совместно работает с грубой детализацией (подумайте «memcpy» или «запуск ядра»). Если для обоих контекстов достаточно памяти, аппаратное обеспечение с удовольствием сотрудничает с контекстным переключателем между ними при небольшой производительности. (Но поскольку это кооперативные, длинные ядра будут мешать выполнению других ядер).

Современные графические процессоры поддерживают виртуальную память (то есть защиту памяти посредством преобразования адресов), но они НЕ поддерживают пейджинг запросов. Это означает, что каждый кусок памяти, доступный для графического процессора (память устройства и привязанная к нему память), должен быть физически представлен и отображен после выделения.

Модель драйвера дисплея Windows (WDDM), представленная в Windows Vista, выполняет поисковый вызов с очень грубой детализацией. Драйвер должен отслеживать, какие «объекты памяти» необходимы для выполнения заданного командного буфера, и ОС обеспечивает их присутствие. ОС может заменить их, когда они не нужны. Морщина с CUDA заключается в том, что, поскольку указатели могут быть сохранены, все объекты памяти, связанные с адресным пространством CUDA, должны быть резидентными, чтобы запускать ядро ​​CUDA. Таким образом, подкачка не работает также для CUDA, как и для графических приложений, которые WDDM был разработан для запуска.

 Смежные вопросы

  • Нет связанных вопросов^_^