Я пытаюсь уменьшить количество инструкций и чтение постоянной памяти для ядра CUDA.Использование макросов для определения констант для CUDA
В результате я понял, что могу вытащить размеры плитки из постоянной памяти и превратить их в макросы. Как определить макросы, которые оценивают константы во время предварительной обработки, чтобы я мог просто настроить три значения и уменьшить количество команд, выполняемых в каждом ядре?
Вот пример:
#define TX 8
#define TY 6
#define TZ 4
#define TX2 (TX * 2)
#define TY2 (TY * 2)
#define OVER_TX (1.0f/float(TX))
Может быть, это уже дело (или, возможно, обрабатываются NVCC компилятором), но очевидно, я хочу, чтобы второй блок макросов, которые будут оценены препроцессором, а не заменены кода, чтобы он не выполнялся в каждом ядре. Какие-либо предложения?
Если вы собираетесь использовать препроцессор, то для этого лучше всего заключить в скобки все, поэтому вместо «#define TX2 TX * 2» сделать «#define TX2 (TX * 2)». Это значит, что вы не получаете неожиданного поведения, если место, где вы используете константу, имеет операции с равным или более высоким приоритетом, чем операции в константе. Как определено в настоящее время «x/TX2»! = «X/(TX2)», но это очень сложно найти, если это вызывает ошибку. – asm
Вы абсолютно правы, отредактировали ответ. Также добавлен более сложный пример ... – Dan