OpenCL Альтернативное использование по модулю, советы - PullRequest
1 голос
/ 30 января 2011

Существует одна простая функция, которую я использовал с C ++ в прошлом для имитации простых форм тесселяции.Функция принимает число и делитель.Делитель должен быть ( степень двух - 1), а n должно быть между 0 и делителем.Он возвращает результат модуля n% (d + 1), используя побитовое отображение &.

Я уверен, что функция выглядит следующим образом:

unsigned int BitwiseMod(unsigned int n, unsigned int d){ return n & d; }

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

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

x[i] = 8*(i&d)+offset[i];  //OR in other contexts,...

num = i&d+offset[i];
x[num] = data;

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

1 Ответ

3 голосов
/ 31 января 2011

На архитектурах NVidia, GT200 и выше, Modulo не особенно медленный, не медленнее, чем обычное целочисленное деление. Подробнее см. в этой статье .

Тем не менее, использование побитового И еще намного быстрее. Поскольку вызовы функций в графических процессорах обходятся дорого, компиляторы OpenCL активно используют встраивание для повышения производительности по умолчанию. Вы должны быть в порядке с вызовом функции, так как он будет встроен.

...