Сокращение количества регистров, используемых в ядре CUDA

У меня есть ядро, которое использует 17 регистров, уменьшение его к 16 принесло бы мне 100%-е заполнение. Мой вопрос: есть ли методы, которые могут использоваться для сокращения количества или используемых регистров, исключая завершенную перезапись моих алгоритмов другим способом. Я всегда отчасти предполагал, что компилятор намного более умен, чем я, так например, я часто использую дополнительные переменные для одной только пользы ясности. Я нахожусь неправильно в этих взглядах?

Пожалуйста, примите во внимание: Я действительно знаю о - max_registers (или независимо от того, что синтаксис), флаг, но использование локальной памяти было бы более вредным, чем на 25% более низкое заполнение (я должен протестировать это),

11
задан codetwiddler 12 July 2012 в 19:12
поделиться

4 ответа

Трудно сказать, компилятор nvcc, на мой взгляд, не очень умен.
Вы можете попробовать очевидные вещи, например, использовать short вместо int, передать и использовать переменные по ссылке (например, & variable), развернуть циклы, использовать шаблоны (как в C ++). Если у вас есть подразделения, трансцендентные функции, применяемые последовательно, попробуйте сделать их петлей. Постарайтесь избавиться от условных выражений, возможно, заменив их избыточными вычислениями.

Если вы разместите какой-то код, возможно, вы получите конкретные ответы.

6
ответ дан 3 December 2019 в 05:34
поделиться

Заполняемость может немного вводить в заблуждение, и 100% -ная загрузка не должна быть вашей основной целью. Если вы можете получить полностью объединенный доступ к глобальной памяти, тогда на высокопроизводительном графическом процессоре 50% занятости будет достаточно, чтобы скрыть задержку для глобальной памяти (для чисел с плавающей запятой, даже ниже для удвоений). Ознакомьтесь с презентацией Advanced CUDA C от GTC в прошлом году для получения дополнительной информации по этой теме.

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

Чтобы ответить на конкретный вопрос о сокращении регистров, отправьте код для более подробных ответов! Понимание того, как работают компиляторы в целом, может помочь, но помните, что nvcc - это оптимизирующий компилятор с большим пространством параметров, поэтому минимизация количества регистров должна быть сбалансирована с общей производительностью.

8
ответ дан 3 December 2019 в 05:34
поделиться

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

1
ответ дан 3 December 2019 в 05:34
поделиться

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

Как это работает, если уменьшение регистров привело к снижению скорости

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

Для целей оптимизации я бы рекомендовал использовать ключевые слова типа const, volatile и так далее, где это необходимо, чтобы помочь компилятору на этапе оптимизации.

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

2
ответ дан 3 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: