Хобрук: Ваш путь к мастерству в программировании

OpenCL clEnqueueTasks Параллелизм

Я пытаюсь написать код, который выполняет расшифровку AES. У меня есть работающий код, но я хотел иметь возможность добавить цепочку блоков шифрования, которая требует, чтобы я выполнял операцию XOR после расшифровки.

Чтобы упростить написание и понимание кода, я написал код с использованием двух ядер. Тот, который выполняет расшифровку одного блока, и тот, который выполняет XOR для части CBC. Затем я отправил их в очередь через clEnqueueTask для каждого 16-байтового блока данных с зависимостью, указанной событием между расшифровкой и XOR.

Это оказывается очень медленным, оно работает в том смысле, что делает их в правильном порядке, но, похоже, не распараллеливает выполнение.

Кто-нибудь знает, почему или как улучшить производительность без потери детализации?

06.12.2011

  • Обратите внимание, что эта функция устарела в версии CL1.2 и должна быть заменена соответствующими вызовами вызова ядра rangeND (stackoverflow.com/questions/36816301/) 04.11.2016

Ответы:


1

Ядро, выполняемое через clEnqueueTask, по существу является однопоточным, что означает, что глобальный рабочий размер равен 1, и задача занимает целую вычислительную единицу для этого единственного потока. Это может сильно повлиять на производительность, потому что на обычном графическом процессоре вы можете выполнять 8-16 задач/рабочих групп параллельно (CL_DEVICE_MAX_COMPUTE_UNITS), а в рабочей группе вы можете выполнять 256-1024 (CL_DEVICE_MAX_WORK_GROUP_SIZE). Таким образом, в вашем случае вы можете достичь 8-16-кратного параллелизма вместо теоретического максимума 15000x, потому что вы не можете использовать все оборудование.

07.12.2011

2

clEnqueueTask обычно используется для нитевидные задачи.

Если ваши ядра могут выполняться параллельно, используйте одно clEnqueueNDRangeKernel. вместо множества clEnqueueTask вызовов с разными параметрами.

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

06.12.2011
Новые материалы

Решения DBA Metrix
DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

Начало работы с Блум
Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...