Должен ли я создать несколько ядер OpenCL, чтобы избежать условных операторов? - PullRequest
2 голосов
/ 05 ноября 2010

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

Это, очевидно, плохо для удобства сопровождения., но значимо ли это для производительности?

Ответы [ 3 ]

2 голосов
/ 07 ноября 2010

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

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

1 голос
/ 05 ноября 2010

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

например.kernel_for_RGB_image и kernel_for_ABGR_image кажутся разумным использованием, так как разные ядра для эффективного развертывания некоторого глубокого внутреннего цикла могут быть большей головной болью при обслуживании.

0 голосов
/ 21 июля 2012

Я думаю, что лучший способ - это попробовать и сравнить два варианта.В некоторых случаях компиляция нескольких условных блоков, даже если выполняется только один из них, может привести к снижению производительности.Причина в GPR (регистры общего назначения): компилятор выделяет столько регистров, сколько необходимо для наихудшего случая.

Я могу предложить такое решение: иметь одну функцию ядра, но с условным временем компиляции:

__kernel void work()
{
#if VAR
    // one code
#else
    // another code
#endif
}

Затем вам нужно перекомпилировать ядро ​​с true / false, установленным на VAR при изменении условия.Очевидно, что для компилятора он не отличается от двух ядер, но для поддержки может быть лучше, если часть кода одинакова для этих ядер.

...