Рабочие элементы OpenCL выполняются параллельно? - PullRequest
12 голосов
/ 24 января 2012

Я знаю, что рабочие элементы сгруппированы в рабочие группы, и вы не можете синхронизироваться вне рабочей группы.

Означает ли это, что рабочие элементы выполняются параллельно?

Если это так, возможно / эффективно сделать 1 рабочую группу из 128 рабочих элементов?

Ответы [ 5 ]

11 голосов
/ 24 января 2012

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

На моей карте AMD «вычислительные блоки» разделены на 16 SIMD-блоков по 4 в ширину.Это означает, что технически можно одновременно выполнять 16 рабочих элементов в группе.Рекомендуется использовать несколько 64 рабочих элементов в группе, чтобы скрыть задержку памяти.Очевидно, что все они не могут быть запущены в точное время.Это не проблема, потому что большинство ядер фактически связаны с памятью, поэтому планировщик (аппаратное обеспечение) будет менять рабочие элементы, ожидающие на контроллере памяти, в то время как «готовые» элементы получают время вычислений.Фактическое количество рабочих элементов в группе задается хост-программой и ограничивается CL_DEVICE_MAX_WORK_GROUP_SIZE.Вам нужно будет поэкспериментировать с оптимальным размером рабочей группы для вашего ядра.

Реализация процессора "хуже", когда речь идет об одновременных рабочих элементах.Работает только столько рабочих элементов, сколько ядер доступно для их запуска.Они ведут себя более последовательно в процессоре.

Так работают ли рабочие элементы в одно и то же время?Почти никогда на самом деле.Вот почему нам нужно использовать барьеры, когда мы хотим быть уверены, что они останавливаются в данной точке.

5 голосов
/ 24 января 2012

В (абстрактной) модели выполнения OpenCL да, все рабочие элементы выполняются параллельно, и их может быть миллионы.

Внутри графического процессора все рабочие элементы одной и той же рабочей группы должны выполняться на одном «ядре». Это накладывает физическое ограничение на количество рабочих элементов в рабочей группе (максимум 256 или 512, но оно может быть меньше для больших ядер, использующих много регистров). Затем все рабочие группы планируются на (обычно от 2 до 16) ядер графического процессора.

Вы можете синхронизировать потоки (рабочие элементы) внутри рабочей группы, потому что все они находятся в одном и том же ядре, но вы не можете синхронизировать потоки из разных рабочих групп, так как они могут не планироваться одновременно. может выполняться на разных ядрах.

Да, в рабочей группе может быть 128 рабочих элементов, если только она не потребляет слишком много ресурсов. Для достижения максимальной производительности обычно требуется, чтобы в рабочей группе было максимально возможное количество потоков (для скрытия задержки памяти требуется не менее 64, см. презентации Василия Волкова на эту тему).

1 голос
/ 24 января 2012

Идея состоит в том, что они могут выполняться параллельно, если это возможно (зависит от того, будут ли они фактически выполняться параллельно).

0 голосов
/ 05 мая 2014

Рабочие элементы в данной рабочей группе выполняются одновременно на элементах обработки блока обработки sigle.

0 голосов
/ 24 января 2012

Да, рабочие элементы выполняются параллельно.

Чтобы получить максимально возможное количество рабочих элементов, используйте clGetDeviceInfo с CL_DEVICE_MAX_WORK_GROUP_SIZE. Это зависит от аппаратного обеспечения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...