2012-01-23 4 views
10

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

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

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

ответ

10

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

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

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

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

+0

Уверены ли вы, что работает только столько рабочих элементов, сколько у вас есть ядра? Согласно [этой странице] (http://software.intel.com/sites/products/documentation/ioclsdk/2013/OG/Basic_Concepts.htm), отдельные ядра являются вычислительными единицами, что означает, что одно ядро ​​не соответствует любым способом для рабочего элемента. – HelloGoodbye

+0

Я уверен в этом. Верно, что на рабочем месте может быть больше «в полете», чем на процессоре - на самом деле это рабочая группа. С точки зрения одновременного вычисления, ядро ​​cpu выполняет только одну очередь команд в данный момент времени. Даже в не-opencl-приложениях потоки либо подделываются путем переключения контекста, либо реализуются с помощью многоядерного оборудования (а иногда и с ограниченными возможностями SIMD). – mfa

0

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

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

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

1

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

5

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

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

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

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

0

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

Смежные вопросы