Рабочие элементы внутри группы планируются вместе и могут работать вместе. Аппаратные средства и/или драйверы должны выбирать, насколько параллельно выполняется выполнение. Для этого есть разные причины, но одна очень хорошая - скрывать латентность памяти.
На моей карте AMD «вычислительные устройства» делятся на 16 4-х широкополосных блоков SIMD. Это означает, что 16 рабочих элементов можно технически запускать одновременно в группе. Рекомендуется использовать несколько групп из 64 рабочих элементов в группе, чтобы скрыть задержку памяти. Очевидно, что все они не могут быть запущены в точное время. Это не проблема, потому что большинство ядер на самом деле связаны с памятью, поэтому планировщик (аппаратное обеспечение) заменяет рабочие элементы, ожидающие выхода на контроллер памяти, в то время как «готовые» элементы получают свое время вычисления. Фактическое количество рабочих элементов в группе задается хост-программой и ограничено CL_DEVICE_MAX_WORK_GROUP_SIZE. Вам нужно будет поэкспериментировать с оптимальным размером рабочей группы для вашего ядра.
Реализация процессора «хуже», когда дело касается одновременных рабочих элементов. Работает только столько рабочих элементов, что у вас есть ядра, доступные для их запуска. Они ведут себя последовательно в процессоре.
Значит, рабочие элементы работают точно в одно и то же время? Почти никогда.Вот почему нам нужно использовать барьеры, когда мы хотим быть уверенными, что они останавливаются в определенной точке.
Уверены ли вы, что работает только столько рабочих элементов, сколько у вас есть ядра? Согласно [этой странице] (http://software.intel.com/sites/products/documentation/ioclsdk/2013/OG/Basic_Concepts.htm), отдельные ядра являются вычислительными единицами, что означает, что одно ядро не соответствует любым способом для рабочего элемента. – HelloGoodbye
Я уверен в этом. Верно, что на рабочем месте может быть больше «в полете», чем на процессоре - на самом деле это рабочая группа. С точки зрения одновременного вычисления, ядро cpu выполняет только одну очередь команд в данный момент времени. Даже в не-opencl-приложениях потоки либо подделываются путем переключения контекста, либо реализуются с помощью многоядерного оборудования (а иногда и с ограниченными возможностями SIMD). – mfa