Я не думаю, что есть общий ответ, который можно дать на этот вопрос. Это действительно зависит от вашей проблемы.
Однако вот некоторые соображения по этой теме:
для контура/если другое заявление может или не может оказать влияние на производительность ядра. Дело в том, что стоимость исполнения не на уровне ядра, а на уровне рабочей группы. Рабочая группа состоит из одного или нескольких перекосов (NVIDIA)/волнового фронта (AMD). Эти перекосы (я буду придерживаться терминологии NVIDIA, но это точно так же для AMD) выполняются в режиме блокировки.
Таким образом, если в пределах деформации у вас есть расхождение из-за if if (или цикла for с другим номером итераций), выполнение будет сериализовано.Иными словами, потоки в этом варпе, следуя первому пути, будут выполнять свои задания, остальные будут простаивать. Как только их работа будет завершена, эти потоки будут работать, пока остальные начнут работать.
Другая проблема возникает с этими утверждениями, если вам нужно синхронизировать свои потоки с барьером. У вас будет неопределенное поведение, если не все потоки попадут в барьер.
Теперь, зная, что в зависимости от конкретной проблемы вы можете группировать свои потоки таким образом, чтобы внутри рабочих групп не было расхождения, хотя у вас будет расхождение между рабочими группами (нет влияние там).
Зная, что деформация состоит из 32 потоков и волнового фронта 64 (возможно, не на старых графических процессорах AMD - не уверен), вы можете сделать размер ваших хорошо организованных рабочих групп равными или кратными этим числам. Обратите внимание, что это довольно упрощено, поскольку необходимо учитывать некоторые другие проблемы. См. Например, this question и ответ, полученный Chanakya.sun (возможно, больше копать в этой теме было бы неплохо).
В случае, если ваша проблема не может быть организована так, как описано выше, я бы предложил рассмотреть возможность использования OpenCL для процессоров, которые неплохо справляются с ветвлением. Если я хорошо помню, обычно у вас будет один рабочий элемент на рабочую группу. В этом случае лучше проверить документацию от Intel и AMD для CPU. Мне также очень нравится глава 6 из Heterogeneous Computing with OpenCL, в которой объясняются различия между использованием OCL с графическими процессорами и процессорами при программировании.
Мне нравится this article тоже. Это в основном дискуссия об увеличении производительности для простого сокращения на GPU (не ваша проблема), но в последней части статьи рассматривается также производительность процессоров.
Последнее, что касается ваших комментариев к ответу, предоставленному @Oak о поддержке поддержки очереди потоков внутри устройства, которая на самом деле называется динамическим параллелизмом. Эта функция, очевидно, решит вашу проблему, но даже с использованием CUDA вам понадобится устройство с возможностью 3.5 или выше. Поэтому даже графические процессоры NVIDIA с архитектурой Kepler GK104 не поддерживают его (возможность 3.0). Для OCL динамический параллелизм является частью стандартной версии 2.0. (насколько я знаю, пока не реализовано).
Предполагая, что размерность x дает вам достаточный параллелизм, ваш подход к циклизации по размеру с разным размером должен быть хорошим. Обратите внимание, что общее время ядра будет определяться самым длинным циклом. Это может быть хорошо, если вы можете генерировать достаточно потоков или если у вас есть другие параллельные ядра, которые могут начать использовать ресурсы, освобожденные от быстрых групп потоков. –