Подтвердить что ты не робот

Разница между конструкцией ядер и параллельной конструкцией

Я изучаю много статей и руководство по OpenACC, но все же я не понимаю главного отличия этих двух конструкций.

4b9b3361

Ответ 1

kernels директива - это более общий случай и, возможно, тот, о котором вы могли бы подумать, если раньше вы писали ядра GPU (например, CUDA). kernels просто направляет компилятор для работы над куском кода и производит произвольное количество "ядер" произвольных "измерений", которые должны выполняться последовательно, для параллелизации/разгрузки определенного раздела кода на ускоритель. Конструкция parallel допускает более тонкий контроль над тем, как компилятор попытается структурировать работу над ускорителем, например, указав конкретные размеры распараллеливания. Например, количество рабочих и банд обычно будет постоянным как часть директивы parallel (поскольку обычно подразумевается только одно базовое "ядро" ), но, возможно, не в директиве kernels (так как это может привести к множественному лежащие в основе "ядра" ).

Хорошая трактовка этого конкретного вопроса содержится в этой статье PGI.

Цитата из резюме статьи: "Ядра OpenACC и параллельные конструкции каждый пытаются решить одну и ту же проблему, идентифицируя цикл parallelism и сопоставляя его с машиной parallelism. Конструкция ядер более неявная, что дает компилятору больше свободы для поиска и отображения parallelism в соответствии с к требованиям целевого ускорителя. Параллельная конструкция более ясна и требует большего анализа программистом, чтобы определить, когда это законно и целесообразно".

Ответ 2

Директивы OpenACC и ядра графического процессора - это всего лишь два способа представления одного и того же элемента - часть кода, которая может работать параллельно.

OpenACC может быть лучше всего при обновлении существующего приложения, чтобы воспользоваться преимуществами графического процессора и/или когда желательно, чтобы компилятор обрабатывал больше деталей, связанных с такими проблемами, как управление памятью. Это может ускорить запись приложения с потенциальной стоимостью в производительности.

Ядра могут быть лучше всего при написании приложения GPU с нуля и/или когда требуется более мелкозернистый контроль. Это может привести к тому, что приложение займет больше времени для записи, но может повысить производительность.

Я думаю, что у людей, новых для графических процессоров, может возникнуть соблазн пойти с OpenACC, потому что он выглядит более знакомым. Но я думаю, что на самом деле лучше пойти другим путем и начать с написания ядер, а затем, возможно, перейдем к OpenACC, чтобы сэкономить время в некоторых проектах. Причина в том, что OpenACC - это нечеткая абстракция. Таким образом, хотя OpenACC может заставить его выглядеть так, как если бы детали GPU были абстрагированы, они все еще там. Таким образом, использование OpenACC для записи кода графического процессора без понимания того, что происходит в фоновом режиме, скорее всего, будет разочаровывающим, с нечетными сообщениями об ошибке при попытке скомпилировать и привести к низкой производительности.