С процессором и памятью это просто.Понимание параллелизма и графического процессора как ограниченного ресурса
Процесс имеет большое виртуальное адресное пространство, которое частично отображается в физическую память. Когда текущий процесс пытается получить доступ к странице, которая не находится в физической памяти, операционная система входит в систему, выбирает страницу для обмена (например, с Round Robin), свопирует ее на диск, затем считывает требуемую страницу из свопа, а элемент управления - вернулся к процессу. Это просто, потому что процесс не может продолжаться без этой страницы.
Ядра GPU - это совсем другая история.
Рассмотрим USECASE:
с высоким приоритетом [CPU] процесса, а именно X, делает вызов ядра (который является блокировка вызовов). В настоящий момент разумно, чтобы ОС переключала контексты и отдавала CPU другому процессу, а именно Z. Для примера, пусть процесс Z также сделает что-то тяжелое с графическим процессором.
Теперь, что делает драйвер GPU? Остановляет ли он ядро, принадлежащее [более высокоприоритетным] X? Сообщает ли он ОС, что Z не имеет приоритетов для разгрузки ядер X? В общем, что происходит, когда двум процессам нужны ресурсы графического процессора, но доступной памяти GPU достаточно, чтобы обслуживать только один из них за раз?
Даже одна нить подачи данных делает ядра процессора недоступными в течение некоторого времени для opencl, если вы указали opencl-контекст на полный-процессор. Вы можете использовать деление устройства opencl, чтобы сделать полный процессор в отдельных ядрах, чтобы избавиться от этого. На данный момент, возможно, gtx titan и r9-290x могут выполнять деление устройства. Протестировал драйвер HD7870 на FX8150, и он задохнулся. Когда я использовал деление устройства для отделения 7 ядер, он течет как жидкость. Если вы не используете waitevent для gpu, то ядро не блокирует процессор. –
Я слышал, что HD7870 может выполнять столько независимых задач, сколько свой номер блока вычислений (20) отдельно на сворачивающемся домашнем сайте @. На самом деле две или три подачи вычислительной единицы могут выполняться одним ядром, как они писали. –
В CUDA: 1. вызовы ядра не блокируются. 2. Вы можете запускать несколько ядер и выполнять последовательно (или, возможно, параллельно), даже если они выданы из нескольких потоков, и они будут выполняться в соответствии с правилами 3 графического контроллера графического процессора. Если вы попытаетесь выделить больше памяти, чем может поддерживать устройство , распределение не будет выполнено и вернет ошибку API среды выполнения.Таким образом, вы даже не дойдете до ядра ядра, которое зависит от этих данных. –