2011-01-30 1 views
1

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

Справедливо, что функция выглядит:

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; 

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

+0

разве это n & (d-1) вместо n & d? –

ответ

3

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

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

+0

Это, безусловно, устраняет некоторую путаницу для меня, но считаете ли вы, что функциональность модульного использования таким образом будет полезна при программировании GPU? –

+0

Это зависит от контекста. Я сомневаюсь, что можно сказать что-нибудь о полезности по модулю/побитовому И вообще ... – dietr

+0

Я предполагаю, что это говорит мне, что это скорее нишевая оптимизация, по крайней мере, спасибо. –