2010-03-04 2 views
1

Я пытаюсь уменьшить количество инструкций и чтение постоянной памяти для ядра 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 компилятором), но очевидно, я хочу, чтобы второй блок макросов, которые будут оценены препроцессором, а не заменены кода, чтобы он не выполнялся в каждом ядре. Какие-либо предложения?

+1

Если вы собираетесь использовать препроцессор, то для этого лучше всего заключить в скобки все, поэтому вместо «#define TX2 TX * 2» сделать «#define TX2 (TX * 2)». Это значит, что вы не получаете неожиданного поведения, если место, где вы используете константу, имеет операции с равным или более высоким приоритетом, чем операции в константе. Как определено в настоящее время «x/TX2»! = «X/(TX2)», но это очень сложно найти, если это вызывает ошибку. – asm

+0

Вы абсолютно правы, отредактировали ответ. Также добавлен более сложный пример ... – Dan

ответ

2

Современные компиляторы обычно оценивают константы, такие как это во время компиляции, когда это возможно, поэтому вы должны быть в порядке. Это справедливо и для правильно определенных констант (т. Е. С использованием const, а не метода «старого skool» #define).

+0

Хорошо, это логично. Что относительно более сложных конструкций, таких как #define (1.0f/float (TX)) Это еще более важно, чтобы не выполняться во время выполнения? – Dan

+1

Если TX известно во время компиляции, тогда да, это также должно упроститься. Для таких критичных по производительности вещей, хотя вы должны привыкнуть смотреть на вывод компилятора, чтобы увидеть, что на самом деле генерируется, - это может дать полезную информацию о том, как писать код, чтобы извлечь максимальную выгоду из компилятора, а также могут дать дополнительные идеи для микрооптимизации. –

Смежные вопросы