OpenCL clEnqueueTasks Параллелизм - PullRequest
1 голос
/ 07 декабря 2011

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

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

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

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

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

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

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

0 голосов
/ 07 декабря 2011

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

...