Параллельно работают элементы OpenCL?

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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