Я написал простой OpenCL-raycaster, где каждый поток представляет один пиксель. Конечно, некоторые потоки, особенно те, которые просто показывают пустое пустое, заканчиваются довольно быстро по сравнению с другими. Мой вопрос: являются ли используемые ядра доступными для других ядер для запуска после того, как они return
, или все они освобождаются после того, как последняя из рабочих групп или даже вся программа завершена?OpenCL нить занятие
ответ
В OpenCL глобальный рабочий размер подразделяется на несколько рабочих групп (которые могут выполняться серийно или параллельно, вплоть до реализации, но независимо в любом случае). Размеры рабочих групп варьируются (например, от 32 до 256 элементов типичны), и вы также можете указать размер рабочей группы. Рабочая группа не заканчивается до тех пор, пока не будут выполнены все потоки в рабочей группе, поэтому интенсивная обработка в одном потоке в сочетании с обработкой света на соседних потоках может оставлять бездействующее оборудование. Однако из-за локальности (объекты в сравнении с пустым пространством) это, скорее всего, произойдет только на границе объектов. Кроме того, в рабочей группе некоторые потоки могут быть сгруппированы вместе и обработаны как SIMD, что также означает, что ветвление может привести к отсутствию аппаратного обеспечения (изучить «расхождение потоков»).