2017-02-21 49 views
-1

Это вопрос до this one.Когда я нацелен на 32-кратные архитектуры CUDA, я должен использовать warpSize?

Предположим, у меня есть CUDA ядра

template<unsigned ThreadsPerWarp> 
___global__ foo(bar_t* a, const baz_t* b); 

и я реализующий специализацию его для случая ThreadsPerWarp быть 32 (это обходит действительную критику ответ Talonmies' на мой предыдущий вопрос.)

В теле этой функции (или других вызываемых из нее функций __device__) - должен ли я использовать постоянное значение ThreadsPerWarp? Или лучше использовать warpSize? Или - будет ли это все равно компилятору с точки зрения генерируемого PTX?

+0

Использование 'ThreadsPerWarp' должно быть лучше с точки зрения оптимизации. –

+0

@RobertCrovella: Всегда и без каких-либо исключений? То есть у nvcc нет оптимизаторов, которые «замечают» 'warpSize' более четко, чем они' 32'? В конце концов, talonmies сказал в связанном вопросе, что сгенерированный PTX не принимает размер основы 32. – einpoklum

+1

В [ответе, который вы указали] (http://stackoverflow.com/q/36047035/1593077) из @ talonmies, он заявил: «В то же время использование« warpSize »в коде предотвращает оптимизацию, поскольку формально это не константа времени компиляции». Я просто повторяю это (я согласен с этим, очевидно). Наверное, теперь вы просите доказательства того, что чего-то не существует - сложнее сделать. –

ответ

0

Нет, не используйте warpSize.

Кажется, что помимо потенциальной будущей доказательности (которая на практике сомнительна), нет никаких преимуществ при ее использовании. Вместо этого вы можете очень хорошо использовать что-то вроде:

enum : unsigned { warp_size = 32 };