У вас есть добавление и модуль в вычислении индекса.
Из руководства по программированию CUDA: пропускная способность operator+
очень высокая (160 для графического процессора, рассчитанного на 3,5 компьютера).
operator%
требует десятков операций с пропускной способностью, аналогичной operator+
.
В вашем случае вы используете operator%
с постоянной константой, и компилятор, скорее всего, оптимизирует ее. Также ваша константа - это сила двух чисел (2), поэтому компилятор заменит ее поразрядным operator&
(такая же пропускная способность, как operator+
).
Важно профилировать ваше приложение, чтобы избежать потери времени, оптимизируя арифметические операции, не получая никакой производительности. Общепринято, что арифметические операции полностью скрыты при загрузке и хранении памяти, и в этом случае вам необходимо сосредоточиться на оптимизации пропускной способности памяти.
каждый расчет оказывает влияние, и есть общедоступная информация о том, сколько циклов каждый расчет и каждое чтение или запись нуждаются. Что касается доступа к встроенным переменным, таким как 'threadIdx', они могут рассматриваться как постоянные, насколько я знаю. Если вы выполняете повторяющиеся вычисления, просто сохраняйте эти вычисления в регистре или доверяйте своему компилятору и проверяйте свою сборку и использование gpu ressource вашего ядра (в случае, если у вас достаточно регистров, чтобы ваши параллельные блоки на см не уменьшались). Я предпочитаю писать чистый оптимизированный код, доверяя вашему компилятору. – djmj